private FieldData initializeObject(RValueExpression rvalue, FieldTreeNode refMdNode, FieldTreeNode mdNode, Path field, Path refPath) { if (rvalue.getType() == RValueExpression.RValueType._dereference) { if (!(refMdNode instanceof ObjectField)) { throw new EvaluationError(CrudConstants.ERR_INCOMPATIBLE_ASSIGNMENT + field + " <- " + refPath); } } else if (rvalue.getType() != RValueExpression.RValueType._null) { Value v = rvalue.getValue(); if (!(v.getValue() instanceof ObjectNode)) { throw new EvaluationError(CrudConstants.ERR_INCOMPATIBLE_ASSIGNMENT + field + " <- " + rvalue.getValue()); } } return new FieldData(field, mdNode.getType(), refPath, refMdNode == null ? null : refMdNode.getType(), rvalue, mdNode.getFullPath()); }
private void initializeArrayField(FieldTreeNode context, ArrayAddExpression expr) { for (RValueExpression rvalue : expr.getValues()) { Path refPath = null; FieldTreeNode refMd = null; if (rvalue.getType() == RValueExpression.RValueType._dereference) { refPath = rvalue.getPath(); refMd = context.resolve(refPath); if (refMd == null) { throw new EvaluationError(CrudConstants.ERR_INVALID_DEREFERENCE + refPath); } } ArrayElement element = fieldMd.getElement(); validateArrayElement(element, refMd, rvalue, refPath); values.add(new RValueData(refPath, refMd == null ? null : refMd.getType(), rvalue.getValue(), rvalue.getType())); } }
/** * Parses an rvalue from a json node. */ public static RValueExpression fromJson(JsonNode node) { if (node instanceof ObjectNode) { if (node.size() == 1) { JsonNode path = node.get("$valueof"); if (path != null && path.isValueNode()) { return new RValueExpression(new Path(path.asText())); } else { return new RValueExpression(new Value(node)); } } else { return new RValueExpression(new Value(node)); } } if (node instanceof ArrayNode) { return new RValueExpression(new Value(node)); } else if (node.isValueNode()) { if (node.asText().equals("$null")) { return NULL; } else { return new RValueExpression(Value.fromJson(node)); } } throw Error.get(QueryConstants.ERR_INVALID_RVALUE_EXPRESSION, node.toString()); }
private FieldData initializeSimple(RValueExpression rvalue, FieldTreeNode refMdNode, FieldTreeNode mdNode, Path field, Path refPath) { if (rvalue.getType() == RValueExpression.RValueType._dereference) { if (!mdNode.getType().equals(refMdNode.getType())) { throw new EvaluationError(CrudConstants.ERR_INCOMPATIBLE_DEREFERENCE + field + " <- " + refPath); } } else if (rvalue.getType() == RValueExpression.RValueType._emptyObject) { throw new EvaluationError(CrudConstants.ERR_INCOMPATIBLE_ASSIGNMENT + field + " <- {}"); } return new FieldData(field, mdNode.getType(), refPath, refMdNode == null ? null : refMdNode.getType(), rvalue, mdNode.getFullPath()); }
@Override public JsonNode toJson() { ObjectNode node = getFactory().objectNode(); ObjectNode args = getFactory().objectNode(); if (values.size() == 1) { args.set(field.toString(), values.get(0).toJson()); } else { ArrayNode arr = getFactory().arrayNode(); for (RValueExpression v : values) { arr.add(v.toJson()); } args.set(field.toString(), arr); } node.set(op.toString(), args); return node; }
@Override public JsonNode toJson() { switch (type) { case _value: return value.toJson(); case _dereference: ObjectNode node = getFactory().objectNode(); node.put("$valueof", path.toString()); return node; default: return getFactory().nullNode(); } }
private void validateArrayElement(ArrayElement element, FieldTreeNode refMd, RValueExpression rvalue, Path refPath) { if (element instanceof ObjectArrayElement) { if (refMd != null && !refMd.getType().equals(element.getType())) { throw new EvaluationError(CrudConstants.ERR_INVALID_ASSIGNMENT + arrayField + " <- " + refPath); } else if (rvalue.getType() == RValueExpression.RValueType._value) { throw new EvaluationError(CrudConstants.ERR_EXPECTED_OBJECT_VALUE + arrayField); } } else { if (refMd != null && !refMd.getType().equals(element.getType())) { throw new EvaluationError(CrudConstants.ERR_INVALID_ASSIGNMENT + arrayField + "<-" + refPath); } else if (rvalue.getType() == RValueExpression.RValueType._emptyObject) { throw new EvaluationError(CrudConstants.ERR_EXPECTED_VALUE + arrayField); } } }
@Override public JsonNode toJson() { ObjectNode node = getFactory().objectNode(); ObjectNode args = getFactory().objectNode(); if (values.size() == 1) { args.set(field.toString(), values.get(0).toJson()); } else { ArrayNode arr = getFactory().arrayNode(); for (RValueExpression v : values) { arr.add(v.toJson()); } args.set(field.toString(), arr); } node.set(op.toString(), args); return node; }
@Override public JsonNode toJson() { switch (type) { case _value: return value.toJson(); case _dereference: ObjectNode node = getFactory().objectNode(); node.put("$valueof", path.toString()); return node; default: return getFactory().nullNode(); } }
private FieldData initializeArray(RValueExpression rvalue, FieldTreeNode refMdNode, FieldTreeNode mdNode, Path field, Path refPath) { if (rvalue.getType() == RValueExpression.RValueType._dereference) { if (!(refMdNode instanceof ArrayField)) { throw new EvaluationError(CrudConstants.ERR_INCOMPATIBLE_ASSIGNMENT + field + " <- " + refPath); } } else if (rvalue.getType() != RValueExpression.RValueType._null) { Value v = rvalue.getValue(); if (!(v.getValue() instanceof ArrayNode)) { throw new EvaluationError(CrudConstants.ERR_INCOMPATIBLE_ASSIGNMENT + field + " <- " + rvalue.getValue()); } } return new FieldData(field, mdNode.getType(), refPath, refMdNode == null ? null : refMdNode.getType(), rvalue, mdNode.getFullPath()); }
private void initializeArrayField(FieldTreeNode context, ArrayAddExpression expr) { for (RValueExpression rvalue : expr.getValues()) { Path refPath = null; FieldTreeNode refMd = null; if (rvalue.getType() == RValueExpression.RValueType._dereference) { refPath = rvalue.getPath(); refMd = context.resolve(refPath); if (refMd == null) { throw new EvaluationError(CrudConstants.ERR_INVALID_DEREFERENCE + refPath); } } ArrayElement element = fieldMd.getElement(); validateArrayElement(element, refMd, rvalue, refPath); values.add(new RValueData(refPath, refMd == null ? null : refMd.getType(), rvalue.getValue(), rvalue.getType())); } }
@Override public JsonNode toJson() { ObjectNode node = getFactory().objectNode(); ObjectNode values = getFactory().objectNode(); for (FieldAndRValue x : fields) { values.set(x.getField().toString(), x.getRValue().toJson()); } node.set(op.toString(), values); return node; }
/** * Parses a set expression using the given json object */ public static SetExpression fromJson(ObjectNode node) { if (node.size() == 1) { UpdateOperator op = null; if (node.has(UpdateOperator._add.toString())) { op = UpdateOperator._add; } else if (node.has(UpdateOperator._set.toString())) { op = UpdateOperator._set; } if (op != null) { ObjectNode arg = (ObjectNode) node.get(op.toString()); List<FieldAndRValue> list = new ArrayList<>(); for (Iterator<Map.Entry<String, JsonNode>> itr = arg.fields(); itr.hasNext();) { Map.Entry<String, JsonNode> entry = itr.next(); Path field = new Path(entry.getKey()); RValueExpression rvalue = RValueExpression.fromJson(entry.getValue()); list.add(new FieldAndRValue(field, rvalue)); } return new SetExpression(op, list); } } throw Error.get(QueryConstants.ERR_INVALID_SET_EXPRESSION, node.toString()); }
/** * Parses an rvalue from a json node. */ public static RValueExpression fromJson(JsonNode node) { if (node instanceof ObjectNode) { if (node.size() == 1) { JsonNode path = node.get("$valueof"); if (path != null && path.isValueNode()) { return new RValueExpression(new Path(path.asText())); } else { return new RValueExpression(new Value(node)); } } else { return new RValueExpression(new Value(node)); } } if (node instanceof ArrayNode) { return new RValueExpression(new Value(node)); } else if (node.isValueNode()) { if (node.asText().equals("$null")) { return NULL; } else { return new RValueExpression(Value.fromJson(node)); } } throw Error.get(QueryConstants.ERR_INVALID_RVALUE_EXPRESSION, node.toString()); }
private FieldData initializeArray(RValueExpression rvalue, FieldTreeNode refMdNode, FieldTreeNode mdNode, Path field, Path refPath) { if (rvalue.getType() == RValueExpression.RValueType._dereference) { if (!(refMdNode instanceof ArrayField)) { throw new EvaluationError(CrudConstants.ERR_INCOMPATIBLE_ASSIGNMENT + field + " <- " + refPath); } } else if (rvalue.getType() != RValueExpression.RValueType._null) { Value v = rvalue.getValue(); if (!(v.getValue() instanceof ArrayNode)) { throw new EvaluationError(CrudConstants.ERR_INCOMPATIBLE_ASSIGNMENT + field + " <- " + rvalue.getValue()); } } return new FieldData(field, mdNode.getType(), refPath, refMdNode == null ? null : refMdNode.getType(), rvalue, mdNode.getFullPath()); }