private ArrayList<EditRec> encodeBuffer(String bagName, long revNum, ApiBuffer value) {
ArrayList<EditRec> edits = new ArrayList<EditRec>();
// fashion directly and make a nodeiterator !!!
BagEntry bagRec = bagIndexes.get(bagName);
BagIndex index = bagRec.bagIndex;
if (revNum == -1) revNum = index.getCurrentRevNum();
// TODO: more efficient; BagIndex needs a "get multi"
QueryNode data = index.getRange(ArrayBytes.EMPTY_BYTES, null, null, false, false, revNum);
ArrayList<QueryNode> clauses = new ArrayList<QueryNode>(value.getDeletions().size()+value.getEntries().size());
for(String key : value.getDeletions()) {
QueryNode q = index.getTerm(new CompoundBytes(ID_BYTES, new ArrayBytes(Util.decodeString(key))), revNum);
if (q == null) throw new RuntimeException("Object not found; id=\""+key+"\"");
clauses.add(q);
}
if (clauses.size() > 0) {
QueryNode idQuery = new OrderedOrQueryNode(clauses, null, null, null, false, false);
do {
long docId = idQuery.doc();
data.skipTo(docId);
do {
edits.add(new EditRec(docId, data.term(), true));
} while(data.nextTerm() == NextStatus.NEXT_TERM);
} while(idQuery.next());
}
long insId = -1;
for(Map.Entry<String,Object> entry : value.getEntries().entrySet()) {
String key = entry.getKey();
QueryNode q = index.getTerm(new CompoundBytes(ID_BYTES, new ArrayBytes(Util.decodeString(key))), revNum);
if (q != null) {
clauses.add(q);
} else {
long docId = insId--;
DbServiceUtil.sencodeMulti(ArrayBytes.EMPTY_BYTES, entry.getValue(), edits, docId, false);