/** * Constructs evaluator for {field op value} style comparison * * @param expr The expression * @param md Entity metadata */ public ValueComparisonEvaluator(ValueComparisonExpression expr, FieldTreeNode context) { this.field = expr.getField(); fieldMd = context.resolve(field); if (fieldMd == null) { throw new EvaluationError(expr, CrudConstants.ERR_FIELD_NOT_THERE + field); } operator = expr.getOp(); rvalue = expr.getRvalue(); LOGGER.debug("ctor {} {}", field, operator); }
/** * Constructs evaluator for {field op value} style comparison * * @param expr The expression * @param md Entity metadata */ public ValueComparisonEvaluator(ValueComparisonExpression expr, FieldTreeNode context) { this.field = expr.getField(); fieldMd = context.resolve(field); if (fieldMd == null) { throw new EvaluationError(expr, CrudConstants.ERR_FIELD_NOT_THERE + field); } operator = expr.getOp(); rvalue = expr.getRvalue(); LOGGER.debug("ctor {} {}", field, operator); }
/** * Constructs evaluator for {field op value} style comparison * * @param expr The expression * @param md Entity metadata */ public ValueComparisonEvaluator(ValueComparisonExpression expr, FieldTreeNode context) { this.field = expr.getField(); fieldMd = context.resolve(field); if (fieldMd == null) { throw new EvaluationError(expr, CrudConstants.ERR_FIELD_NOT_THERE + field); } operator = expr.getOp(); rvalue = expr.getRvalue(); LOGGER.debug("ctor {} {}", field, operator); }
@Override protected QueryExpression itrValueComparisonExpression(ValueComparisonExpression q, Path context) { return new ValueComparisonExpression(toRelative(q.getField(), context), q.getOp(), q.getRvalue()); }
@Override protected QueryExpression itrValueComparisonExpression(ValueComparisonExpression q, Path context) { return new ValueComparisonExpression(toRelative(q.getField(), context), q.getOp(), q.getRvalue()); }
@Override protected LookupSpec processValueComparisonExpression(ValueComparisonExpression q) { switch(q.getOp()) { case _eq: return new ValueLookupSpec(simpleKeySpec(findFieldInfo(q.getField(),q)),q.getRvalue().getValue()); case _lte: case _lt: return new RangeLookupSpec(simpleKeySpec(findFieldInfo(q.getField(),q)),null,q.getRvalue().getValue()); case _gte: case _gt: return new RangeLookupSpec(simpleKeySpec(findFieldInfo(q.getField(),q)),q.getRvalue().getValue(),null); } return null; }
@Override protected QueryExpression itrValueComparisonExpression(ValueComparisonExpression q, Path context) { Path p = rewrite(context, q.getField()); if (!p.equals(q.getField())) { return new ValueComparisonExpression(p, q.getOp(), q.getRvalue()); } else { return q; } }
@Override protected QueryExpression itrValueComparisonExpression(ValueComparisonExpression q, Path context) { Path p = rewrite(context, q.getField()); if (!p.equals(q.getField())) { return new ValueComparisonExpression(p, q.getOp(), q.getRvalue()); } else { return q; } }
@Override protected LookupSpec processValueComparisonExpression(ValueComparisonExpression q) { switch(q.getOp()) { case _eq: return new ValueLookupSpec(simpleKeySpec(findFieldInfo(q.getField(),q)),q.getRvalue().getValue()); case _lte: case _lt: return new RangeLookupSpec(simpleKeySpec(findFieldInfo(q.getField(),q)),null,q.getRvalue().getValue()); case _gte: case _gt: return new RangeLookupSpec(simpleKeySpec(findFieldInfo(q.getField(),q)),q.getRvalue().getValue(),null); } return null; }
@Override protected QueryExpression itrValueComparisonExpression(ValueComparisonExpression q, Path context) { Path p = rewrite(context, q.getField()); if (!p.equals(q.getField())) { return new ValueComparisonExpression(p, q.getOp(), q.getRvalue()); } else { return q; } }
@Override protected QueryExpression itrValueComparisonExpression(ValueComparisonExpression q, Path context) { Path p = map(applyContext(context, q.getField())); if (p != null) { return new ValueComparisonExpression(removeContext(context, p, q.getField()), q.getOp(), q.getRvalue()); } else { return q; } }
@Override protected QueryExpression itrValueComparisonExpression(ValueComparisonExpression q, Path context) { Path p = map(applyContext(context, q.getField())); if (p != null) { return new ValueComparisonExpression(removeContext(context, p, q.getField()), q.getOp(), q.getRvalue()); } else { return q; } }
private DBObject translateValueComparisonExpression(FieldTreeNode context, EntityMetadata md, ValueComparisonExpression expr,MutablePath fullPath) { FieldInfo finfo=resolveFieldForQuery(context,fullPath.immutableCopy(),expr.getField()); Type t = finfo.fieldMd.getType(); Object value = expr.getRvalue().getValue(); if (expr.getOp() == BinaryComparisonOperator._eq || expr.getOp() == BinaryComparisonOperator._neq) { if (!t.supportsEq() && value != null) { throw Error.get(ERR_INVALID_COMPARISON, expr.toString()); } } else if (!t.supportsOrdering()) { throw Error.get(ERR_INVALID_COMPARISON, expr.toString()); } Object valueObject = DocTranslator.filterBigNumbers(t.cast(value)); if (finfo.field.equals(ID_PATH)) { valueObject = DocTranslator.createIdFrom(valueObject); } if (expr.getOp() == BinaryComparisonOperator._eq) { return new BasicDBObject(translatePath(finfo.field), valueObject); } else { return new BasicDBObject(translatePath(finfo.field), new BasicDBObject(BINARY_COMPARISON_OPERATOR_MAP.get(expr.getOp()), valueObject)); } }
private DBObject translateValueComparisonExpression(FieldTreeNode context, ValueComparisonExpression expr) { Type t = resolve(context, expr.getField()).getType(); Object value=expr.getRvalue().getValue(); if (expr.getOp() == BinaryComparisonOperator._eq || expr.getOp() == BinaryComparisonOperator._neq) { if (!t.supportsEq()&&value!=null) { throw Error.get(ERR_INVALID_COMPARISON, expr.toString()); } } else { if (!t.supportsOrdering()) { throw Error.get(ERR_INVALID_COMPARISON, expr.toString()); } } Object valueObject = filterBigNumbers(t.cast(value)); if (expr.getField().equals(ID_PATH)) { valueObject = createIdFrom(valueObject); } if (expr.getOp() == BinaryComparisonOperator._eq) { return new BasicDBObject(translatePath(expr.getField()), valueObject); } else { return new BasicDBObject(translatePath(expr.getField()), new BasicDBObject(BINARY_COMPARISON_OPERATOR_MAP.get(expr.getOp()), valueObject)); } }
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 itrValueComparisonExpression(ValueComparisonExpression 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 ValueComparisonExpression(addPrefix(qfi.getEntityRelativeFieldName()), q.getOp(), q.getRvalue()); } }
@Override protected QueryExpression itrValueComparisonExpression(ValueComparisonExpression 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 ValueComparisonExpression(addPrefix(qfi.getEntityRelativeFieldName()), q.getOp(), q.getRvalue()); } }
@Override public QueryExpression rewrite(QueryExpression q) { ArrayMatchExpression ae = dyncast(ArrayMatchExpression.class, q); QueryExpression newq = q; if (ae != null) { QueryExpression nestedq = ae.getElemMatch(); ValueComparisonExpression vce; FieldComparisonExpression fce; NaryValueRelationalExpression nvre; NaryFieldRelationalExpression nfre; if ((vce = dyncast(ValueComparisonExpression.class, nestedq)) != null) { newq = new ValueComparisonExpression(normalize(ae, vce.getField()), vce.getOp(), vce.getRvalue()); } else if ((fce = dyncast(FieldComparisonExpression.class, nestedq)) != null) { newq = new FieldComparisonExpression(normalize(ae, fce.getField()), fce.getOp(), normalize(ae, fce.getRfield())); } } return newq; }
@Override public QueryExpression rewrite(QueryExpression q) { ArrayMatchExpression ae = dyncast(ArrayMatchExpression.class, q); QueryExpression newq = q; if (ae != null) { QueryExpression nestedq = ae.getElemMatch(); ValueComparisonExpression vce; FieldComparisonExpression fce; NaryValueRelationalExpression nvre; NaryFieldRelationalExpression nfre; if ((vce = dyncast(ValueComparisonExpression.class, nestedq)) != null) { newq = new ValueComparisonExpression(normalize(ae, vce.getField()), vce.getOp(), vce.getRvalue()); } else if ((fce = dyncast(FieldComparisonExpression.class, nestedq)) != null) { newq = new FieldComparisonExpression(normalize(ae, fce.getField()), fce.getOp(), normalize(ae, fce.getRfield())); } } return newq; }
@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 { NaryRelationalExpression nre=dyncast(NaryRelationalExpression.class,le.getQuery()); if(nre!=null) { return new NaryRelationalExpression(nre.getField(),nre.getOp().negate(),nre.getValues()); } } } } return q; } }