/** * Parses an n-ary relational expression from the given json object */ public static NaryValueRelationalExpression fromJson(ObjectNode node) { if (node.size() == 3) { JsonNode x = node.get("op"); if (x != null) { NaryRelationalOperator op = NaryRelationalOperator.fromString(x.asText()); if (op != null) { x = node.get("field"); if (x != null) { Path field = new Path(x.asText()); x = node.get("values"); if (x instanceof ArrayNode) { ArrayList<Value> values = new ArrayList<>(((ArrayNode) x).size()); for (Iterator<JsonNode> itr = ((ArrayNode) x).elements(); itr.hasNext();) { values.add(Value.fromJson(itr.next())); } return new NaryValueRelationalExpression(field, op, values); } } } } } throw Error.get(QueryConstants.ERR_INVALID_COMPARISON_EXPRESSION, node.toString()); } }
/** * Parses an n-ary relational expression from the given json object */ public static NaryValueRelationalExpression fromJson(ObjectNode node) { if (node.size() == 3) { JsonNode x = node.get("op"); if (x != null) { NaryRelationalOperator op = NaryRelationalOperator.fromString(x.asText()); if (op != null) { x = node.get("field"); if (x != null) { Path field = new Path(x.asText()); x = node.get("values"); if (x instanceof ArrayNode) { ArrayList<Value> values = new ArrayList<>(((ArrayNode) x).size()); for (Iterator<JsonNode> itr = ((ArrayNode) x).elements(); itr.hasNext();) { values.add(Value.fromJson(itr.next())); } return new NaryValueRelationalExpression(field, op, values); } } } } } throw Error.get(QueryConstants.ERR_INVALID_COMPARISON_EXPRESSION, node.toString()); } }
valueList.add(x.getRvalue()); newList.add(new NaryValueRelationalExpression(entry.getKey(), relationalOp, new ArrayList<>(valueList))); } else {
valueList.add(x.getRvalue()); newList.add(new NaryValueRelationalExpression(entry.getKey(), relationalOp, new ArrayList<>(valueList))); } else {
valueList.addAll(x.getValues()); newList.add(new NaryValueRelationalExpression(entry.getKey(), relationalOp, new ArrayList<>(valueList)));
valueList.addAll(x.getValues()); newList.add(new NaryValueRelationalExpression(entry.getKey(), relationalOp, new ArrayList<>(valueList)));
@Override protected QueryExpression itrNaryValueRelationalExpression(NaryValueRelationalExpression q, Path context) { return new NaryValueRelationalExpression(toRelative(q.getField(), context), q.getOp(), q.getValues()); }
@Override protected QueryExpression itrNaryValueRelationalExpression(NaryValueRelationalExpression q, Path context) { return new NaryValueRelationalExpression(toRelative(q.getField(), context), q.getOp(), q.getValues()); }
protected QueryExpression itrNaryValueRelationalExpression(NaryValueRelationalExpression q, Path context) { Binder binding = getBoundValue(q.getValues()); if (binding != null) { return new NaryValueRelationalExpression(q.getField(), q.getOp(), (List<Value>) binding.getValue()); } else { return q; } }
protected QueryExpression itrNaryValueRelationalExpression(NaryValueRelationalExpression q, Path context) { Binder binding = getBoundValue(q.getValues()); if (binding != null) { return new NaryValueRelationalExpression(q.getField(), q.getOp(), (List<Value>) binding.getValue()); } else { return q; } }
@Override protected QueryExpression itrNaryValueRelationalExpression(NaryValueRelationalExpression q, Path context) { Path p = map(applyContext(context, q.getField())); if (p != null) { return new NaryValueRelationalExpression(removeContext(context, p, q.getField()), q.getOp(), q.getValues()); } else { return q; } }
@Override protected QueryExpression itrNaryValueRelationalExpression(NaryValueRelationalExpression q, Path context) { Path p = map(applyContext(context, q.getField())); if (p != null) { return new NaryValueRelationalExpression(removeContext(context, p, q.getField()), q.getOp(), q.getValues()); } else { return q; } }
protected QueryExpression itrValueComparisonExpression(ValueComparisonExpression q, Path context) { Binder binding = getBoundValue(q.getRvalue()); if (binding != null) { if(binding.getValue() instanceof List) { // If field = [v1,v2,v3], then rewrite the query as: // field in [v1,v2,v3] // otherwise if query is field op [v1,v2,v3], then: // $or:[ // { field op v1}, // { field op v2}, // { field op v3 } ] if(q.getOp()==BinaryComparisonOperator._eq) { return new NaryValueRelationalExpression(q.getField(),NaryRelationalOperator._in,(List<Value>)binding.getValue()); } else { List<QueryExpression> resultList=new ArrayList<>(); for(Value v:(List<Value>)binding.getValue()) { resultList.add(new ValueComparisonExpression(q.getField(),q.getOp(),v)); } return new NaryLogicalExpression(NaryLogicalOperator._or,resultList); } } else { return new ValueComparisonExpression(q.getField(), q.getOp(), (Value) binding.getValue()); } } else { return q; } }
@Override protected QueryExpression itrNaryValueRelationalExpression(NaryValueRelationalExpression q, Path context) { QueryFieldInfo qfi = findFieldInfo(q.getField(), q); if (qfi.getFieldEntity() != currentEntity) { return new TruePH(); } else if (qfi.getFieldNameInClause().equals(qfi.getEntityRelativeFieldName()) && nestedFieldPrefix.isEmpty()) { return q; } else { return new NaryValueRelationalExpression(addPrefix(qfi.getEntityRelativeFieldName()), q.getOp(), q.getValues()); } }
protected QueryExpression itrValueComparisonExpression(ValueComparisonExpression q, Path context) { Binder binding = getBoundValue(q.getRvalue()); if (binding != null) { if(binding.getValue() instanceof List) { // If field = [v1,v2,v3], then rewrite the query as: // field in [v1,v2,v3] // otherwise if query is field op [v1,v2,v3], then: // $or:[ // { field op v1}, // { field op v2}, // { field op v3 } ] if(q.getOp()==BinaryComparisonOperator._eq) { return new NaryValueRelationalExpression(q.getField(),NaryRelationalOperator._in,(List<Value>)binding.getValue()); } else { List<QueryExpression> resultList=new ArrayList<>(); for(Value v:(List<Value>)binding.getValue()) { resultList.add(new ValueComparisonExpression(q.getField(),q.getOp(),v)); } return new NaryLogicalExpression(NaryLogicalOperator._or,resultList); } } else { return new ValueComparisonExpression(q.getField(), q.getOp(), (Value) binding.getValue()); } } else { return q; } }
@Override protected QueryExpression itrNaryValueRelationalExpression(NaryValueRelationalExpression q, Path context) { QueryFieldInfo qfi = findFieldInfo(q.getField(), q); if (qfi.getFieldEntity() != currentEntity) { return new TruePH(); } else if (qfi.getFieldNameInClause().equals(qfi.getEntityRelativeFieldName()) && nestedFieldPrefix.isEmpty()) { return q; } else { return new NaryValueRelationalExpression(addPrefix(qfi.getEntityRelativeFieldName()), q.getOp(), q.getValues()); } }
if (rfi.getFieldEntity() != currentEntity) { List<Value> value = bindList(rfi); return new NaryValueRelationalExpression(removeContext(lfi.getFieldEntity(),addPrefix(lfi.getEntityRelativeFieldName())), q.getOp(), value); } else if (nestedFieldPrefix.isEmpty()) { return q;
if (rfi.getFieldEntity() != currentEntity) { List<Value> value = bindList(rfi); return new NaryValueRelationalExpression(removeContext(lfi.getFieldEntity(),addPrefix(lfi.getEntityRelativeFieldName())), q.getOp(), value); } else if (nestedFieldPrefix.isEmpty()) { return q;
@Override public QueryExpression rewrite(QueryExpression q) { UnaryLogicalExpression le = dyncast(UnaryLogicalExpression.class, q); if (le != null && le.getOp() == UnaryLogicalOperator._not) { ValueComparisonExpression vce = dyncast(ValueComparisonExpression.class, le.getQuery()); if (vce != null) { return new ValueComparisonExpression(vce.getField(), vce.getOp().negate(), vce.getRvalue()); } else { FieldComparisonExpression fce = dyncast(FieldComparisonExpression.class, le.getQuery()); if (fce != null) { return new FieldComparisonExpression(fce.getField(), fce.getOp().negate(), fce.getRfield()); } else { NaryValueRelationalExpression nre = dyncast(NaryValueRelationalExpression.class, le.getQuery()); if (nre != null) { return new NaryValueRelationalExpression(nre.getField(), nre.getOp().negate(), nre.getValues()); } else { NaryFieldRelationalExpression nfe = dyncast(NaryFieldRelationalExpression.class, le.getQuery()); if (nfe != null) { return new NaryFieldRelationalExpression(nfe.getField(), nfe.getOp().negate(), nfe.getRfield()); } } } } } return q; } }
@Override public QueryExpression rewrite(QueryExpression q) { UnaryLogicalExpression le = dyncast(UnaryLogicalExpression.class, q); if (le != null && le.getOp() == UnaryLogicalOperator._not) { ValueComparisonExpression vce = dyncast(ValueComparisonExpression.class, le.getQuery()); if (vce != null) { return new ValueComparisonExpression(vce.getField(), vce.getOp().negate(), vce.getRvalue()); } else { FieldComparisonExpression fce = dyncast(FieldComparisonExpression.class, le.getQuery()); if (fce != null) { return new FieldComparisonExpression(fce.getField(), fce.getOp().negate(), fce.getRfield()); } else { NaryValueRelationalExpression nre = dyncast(NaryValueRelationalExpression.class, le.getQuery()); if (nre != null) { return new NaryValueRelationalExpression(nre.getField(), nre.getOp().negate(), nre.getValues()); } else { NaryFieldRelationalExpression nfe = dyncast(NaryFieldRelationalExpression.class, le.getQuery()); if (nfe != null) { return new NaryFieldRelationalExpression(nfe.getField(), nfe.getOp().negate(), nfe.getRfield()); } } } } } return q; } }