package dovetaildb.apiservice;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import dovetaildb.bagindex.EditRec;
import dovetaildb.bagindex.TrivialBagIndex;
import dovetaildb.bytes.ArrayBytes;
import dovetaildb.bytes.Bytes;
import dovetaildb.dbservice.BagEntry;
import dovetaildb.dbservice.BagIndexBridge;
import dovetaildb.dbservice.DbServiceUtil;
import dovetaildb.dbservice.ProcessTransactionMapper;
import dovetaildb.iter.Iter;
import dovetaildb.iter.LiteralIter;
import dovetaildb.querynode.QueryNode;
import dovetaildb.querynode.QueryNodeTemplate;
import dovetaildb.util.LiteralHashMap;
import dovetaildb.util.Util;
public class ApiBuffer {
private final HashSet<String> deletions = new HashSet<String>();
private final Map<String,Object> entries = new HashMap<String,Object>();
public HashSet<String> getDeletions() { return deletions; }
public Map<String,Object> getEntries() { return entries; }
public Iter query(Object query, Map<String, Object> options) {
// TODO: this work should be done once and saved somehow
// just need to figure out how to invalidate when something
// changes
ArrayList<EditRec> buffer = new ArrayList<EditRec>();
long tmpId = -1000;
for(Object entry : entries.values()) {
DbServiceUtil.sencodeMulti(ArrayBytes.EMPTY_BYTES, entry, buffer, tmpId--, false);
}
TrivialBagIndex puts = new TrivialBagIndex();
long revNum = puts.commitNewRev(buffer);
BagIndexBridge bridge = new BagIndexBridge();
bridge.setTxnMapper(new ProcessTransactionMapper());
bridge.setBagEntry("",new BagEntry(puts, null, revNum));
bridge.getTxnMapper().addRevsForTxn(0, Util.literalMap().p("",revNum));
return bridge.query("", 0, query, options);
}
public void put(String id, Map entry) {
if (deletions.contains(id)) {
deletions.remove(id);
}
entries.put(id, entry);
}
}