package com.mongodb.hvdf.util;

import java.util.List;

import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCursor;
import com.mongodb.hvdf.api.Sample;

public class MongoDBQueryHelpers {

	public static void getSamplesFromCursor(DBCursor cursor, int limit, List<Sample> outList){
        try{
            // exhaust the cursor adding each sample
    		cursor.batchSize(limit);
    		cursor.limit(limit);
            while(cursor.hasNext()) {
            	outList.add(new Sample(cursor.next()));
            }
        } finally {
            // ensure cursor is closed
            cursor.close();
        }
    }
	
    public static BasicDBObject findMany(final String fieldName, final List<Object> values){
        return new BasicDBObject(fieldName,
               new BasicDBObject("$in", values));
    }

    public static BasicDBObject pushToCappedArray(
            final String fieldKey, final BasicDBList items, final int limit) {
        return new BasicDBObject("$push",
               new BasicDBObject(fieldKey,
               new BasicDBObject("$each", items)
               .append("$slice", -limit)));
    }    
    
    public static BasicDBObject findBy(final String fieldName, final Object value){
        return new BasicDBObject(fieldName, value);
    }
    
    public static BasicDBObject getFields(final String... fieldNames){
        BasicDBObject fieldSpec = new BasicDBObject();
        for(String field : fieldNames){
            fieldSpec.append(field, 1);
        }
        
        return fieldSpec;
    }
    
    public static BasicDBObject sortByDecending(final String fieldName){
        return new BasicDBObject(fieldName, -1);
    }

    public static String subField(final String outer, final String inner) {
        return outer + "." + inner;
    }

    public static BasicDBObject limitArray(final String fieldName, final int limit) {
        return new BasicDBObject(fieldName, new BasicDBObject("$slice", -limit));
    }
    
    public static BasicDBObject singleField(final String fieldName) {
        return new BasicDBObject(fieldName, 1).append("_id", -1);
    }
    
    public static BasicDBObject setValue(final String fieldName, Object value) {
        return new BasicDBObject("$set", new BasicDBObject(fieldName, value));
    }
    
}