@Override public String toJsonLiteral(ScalarArray value) { StringBuilder sb = new StringBuilder(value.size() * 20); sb.append("["); for (ScalarValue<?> child : value) { sb.append(valueToArrayConverterProvider.getConverter(child.getType()).toJsonLiteral(child)); sb.append(","); } if (!value.isEmpty()) { sb.delete(sb.length()-1, sb.length()); } sb.append("]"); return sb.toString(); }
@Override public Builder add(String key, ScalarValue value) { super.add(key, value); attributes.put(key, new SubDocAttribute(key, value.getType())); return this; }
public Builder add(@Nonnull SubDocAttribute att, @Nonnull ScalarValue value) { if (values.containsKey(att.getKey())) { throw new IllegalArgumentException("There is another attribute with " + att.getKey()); } if (!att.getType().equals(value.getType())) { throw new IllegalArgumentException("Type of attribute " + att + " is " + att.getType() + " which is different " + "than the type of the given value (value is " + value + " and its type is " + value.getType()); } values.put(att.getKey(), value); return this; }
private ScalarValue<?> resolve(List<? extends AttributeReference.Key> keys, int depth) { AttributeReference.Key localKey = keys.get(depth); if (!(localKey instanceof AttributeReference.ArrayKey)) { throw new IllegalArgumentException("Recived keys (" +keys +") contains key '" + localKey+"' which is not" + "an array key ("+localKey+" is at depth "+depth+")"); } ScalarValue<?> referencedValue = get(((AttributeReference.ArrayKey) localKey).getIndex()); if (depth == keys.size()) { return referencedValue; } else { if (!(referencedValue instanceof ScalarArray)) { throw new IllegalArgumentException(keys + " is not valid because element at "+depth+ " ("+keys.subList(0, depth)+") is a "+referencedValue.getType()+" while an array was expected"); } return ((ScalarArray) referencedValue).resolve(keys, depth + 1); } } }
@Nullable static QueryCriteria getStructureQueryCriteria(AttributeAndValueQueryCriteria criteria) { return getStructureQueryCriteria(criteria.getAttributeReference(), criteria.getValue().getType()); }
protected Param<?> translateValueToSQL(ScalarValue value) { DataType<?> dataType = databaseInterface.getValueToJooqDataTypeProvider().getDataType(value.getType()); return DSL.value(value, dataType); }
protected Param<?> translateValueToArraySerialization(ScalarValue value) { DataType<?> dataType = databaseInterface.getValueToArrayDataTypeProvider() .getDataType(value.getType()); return DSL.value(value, dataType); }
public static List<ProcessedQueryCriteria> process( AttributeAndValueQueryCriteria criteria, QueryCriteriaVisitor<List<ProcessedQueryCriteria>, Void> visitor) { //An extra query is added in the structure part that filters all documents that does not have the given key //or it has incompatible type @see CompareProcessor#comparableTypes(ScalarType) AttributeReference attRef = criteria.getAttributeReference(); ScalarType type = criteria.getValue().getType(); QueryCriteria structureCriteria = Utils.getStructureQueryCriteria(attRef, comparableTypes(type)); return Collections.singletonList( new ProcessedQueryCriteria( structureCriteria, criteria ) ); }
byTypeValues.put(value.getType(), value);
@Override public Condition visit(IsGreaterQueryCriteria criteria, Boolean inArray) { String[] keys = translateArrayRef(criteria); Field field = DSL.field(databaseInterface.arraySerializer().getFieldName(keys)); Param<?> value; Condition typeCondition = null; if (!isInArrayValue(criteria.getAttributeReference(), inArray)) { value = translateValueToSQL(criteria.getValue()); } else { value = translateValueToArraySerialization(criteria.getValue()); typeCondition = databaseInterface.arraySerializer().typeof( field.getName(), getJsonType(criteria.getValue().getType()) ); } Condition criteriaCondition = field.greaterThan(value); if (typeCondition != null) { criteriaCondition = typeCondition.and(criteriaCondition); } return addArrayCondition(criteria, criteriaCondition, keys, inArray); }
@Override public Condition visit(IsLessQueryCriteria criteria, Boolean inArray) { String[] keys = translateArrayRef(criteria); Field field = DSL.field(databaseInterface.arraySerializer().getFieldName(keys)); Param<?> value; Condition typeCondition = null; if (!isInArrayValue(criteria.getAttributeReference(), inArray)) { value = translateValueToSQL(criteria.getValue()); } else { value = translateValueToArraySerialization(criteria.getValue()); typeCondition = databaseInterface.arraySerializer().typeof( field.getName(), getJsonType(criteria.getValue().getType()) ); } Condition criteriaCondition = field.lessThan(value); if (typeCondition != null) { criteriaCondition = typeCondition.and(criteriaCondition); } return addArrayCondition(criteria, criteriaCondition, keys, inArray); }
@Override public Condition visit(IsLessOrEqualQueryCriteria criteria, Boolean inArray) { String[] keys = translateArrayRef(criteria); Field field = DSL.field(databaseInterface.arraySerializer().getFieldName(keys)); Param<?> value; Condition typeCondition = null; if (!isInArrayValue(criteria.getAttributeReference(), inArray)) { value = translateValueToSQL(criteria.getValue()); } else { value = translateValueToArraySerialization(criteria.getValue()); typeCondition = databaseInterface.arraySerializer().typeof( field.getName(), getJsonType(criteria.getValue().getType()) ); } Condition criteriaCondition = field.lessOrEqual(value); if (typeCondition != null) { criteriaCondition = typeCondition.and(criteriaCondition); } return addArrayCondition(criteria, criteriaCondition, keys, inArray); }
@Override public Condition visit(IsGreaterOrEqualQueryCriteria criteria, Boolean inArray) { String[] keys = translateArrayRef(criteria); Field field = DSL.field(databaseInterface.arraySerializer().getFieldName(keys)); Param<?> value; Condition typeCondition = null; if (!isInArrayValue(criteria.getAttributeReference(), inArray)) { value = translateValueToSQL(criteria.getValue()); } else { value = translateValueToArraySerialization(criteria.getValue()); typeCondition = databaseInterface.arraySerializer().typeof( field.getName(), getJsonType(criteria.getValue().getType()) ); } Condition criteriaCondition = field.greaterOrEqual(value); if (typeCondition != null) { criteriaCondition = typeCondition.and(criteriaCondition); } return addArrayCondition(criteria, criteriaCondition, keys, inArray); }
@Override public Condition visit(IsEqualQueryCriteria criteria, Boolean inArray) { String[] keys = translateArrayRef(criteria); Field field = DSL.field(databaseInterface.arraySerializer().getFieldName(keys)); Param<?> value; Condition criteriaCondition; if (criteria.getValue().getType().equals(ScalarType.NULL)) { if (!isInArrayValue(criteria.getAttributeReference(), inArray)) { criteriaCondition = field.isNull(); } else { criteriaCondition = field.equal( translateValueToArraySerialization(criteria.getValue()) ); } } else { if (!isInArrayValue(criteria.getAttributeReference(), inArray)) { value = translateValueToSQL(criteria.getValue()); } else { value = translateValueToArraySerialization(criteria.getValue()); } criteriaCondition = field.equal(value); } return addArrayCondition(criteria, criteriaCondition, keys, inArray); }