break;
case DbServiceUtil.OP_HASH_OR:
case DbServiceUtil.OP_HASH_AND:
clauses = new ArrayList<QueryNode>(numArgs-1);
for(int i=1; i<numArgs; i++) {
QueryNodeTemplate node=applyPatternToBagIndex(prefix, query.get(i), index, revNum);
if (node.queryNode != null) clauses.add(node.queryNode);
vars.putAll(node.varMappings);
}
if (opHash == DbServiceUtil.OP_HASH_OR) {
queryNode = new OrderedOrQueryNode(clauses, null, null, null, false, false);
} else {
queryNode = AndQueryNode.make(clauses);
}
break;
case DbServiceUtil.OP_HASH_NOT:
QueryNode matchesSoFar = index.getRange(prefix, null, null, false, false, revNum);
clauses = new ArrayList<QueryNode>(numArgs-1);
for(int i=1; i<numArgs; i++) {
QueryNodeTemplate node=applyPatternToBagIndex(prefix, query.get(i), index, revNum);
if (node.queryNode != null) clauses.add(node.queryNode);
}
QueryNode negativeMatches = OrderedOrQueryNode.make(clauses);
queryNode = AndNotQueryNode.make(matchesSoFar, negativeMatches);
break;
default:
Bytes term1 = null;
Bytes term2 = null;
boolean isExclusive1 = false;
boolean isExclusive2 = false;
switch(opHash) {
case DbServiceUtil.OP_HASH_AS:
case DbServiceUtil.OP_HASH_ANY:
break;
case DbServiceUtil.OP_HASH_GT:
isExclusive1 = true;
case DbServiceUtil.OP_HASH_GE:
term1 = sencode(query.get(1));
break;
case DbServiceUtil.OP_HASH_LT:
isExclusive2 = true;
case DbServiceUtil.OP_HASH_LE:
term2 = sencode(query.get(1));
break;
case DbServiceUtil.OP_HASH_BETWEEN_EE:
isExclusive2 = true;
case DbServiceUtil.OP_HASH_BETWEEN_EI:
isExclusive1 = true;
case DbServiceUtil.OP_HASH_BETWEEN_II:
term1 = sencode(query.get(1));
term2 = sencode(query.get(2));
break;
case DbServiceUtil.OP_HASH_BETWEEN_IE:
isExclusive2 = true;
term1 = sencode(query.get(1));
term2 = sencode(query.get(2));
default:
throw new ApiException("QueryFormatError", "Unknown query operator: \""+query.get(0)+"\"");
}
queryNode = index.getRange(prefix, term1, term2, isExclusive1, isExclusive2, revNum);
}
}
return new QueryNodeTemplate(queryNode, vars);
}