public static ScalarValue<?> fromDocValue(KVValue<?> docValue) { return docValue.accept(AS_VISITOR, null); }
private boolean containsObjects(KVArray value) { for (KVValue<?> subValue : value) { if (subValue.getType().equals(DocumentType.INSTANCE)) { return true; } } return false; }
@Override public Boolean visit(IsLessQueryCriteria criteria, KVValue<?> arg) { KVValue<?> referenced = resolve(criteria.getAttributeReference(), arg); if (referenced == null) { return false; } Object innerValue = criteria.getValue().getValue(); if (innerValue instanceof Number) { if (referenced.getValue() instanceof Number) { Number refNumber = (Number) referenced.getValue(); return refNumber.doubleValue() < ((Number) innerValue).doubleValue(); } return false; } if (innerValue instanceof String) { if (referenced.getValue() instanceof String) { return ((String) referenced.getValue()).compareTo((String) innerValue) < 0; } return false; } return false; }
@Override public Void visit(KVArray value, LinkedList<AttributeReference.Key> arg) { if (!containsObjects(value)) { ScalarValue<?> arrValue = KVValueToScalarValue.fromDocValue(value); conjunctionBuilder.add( new IsEqualQueryCriteria( basicAttRef.append(arg), arrValue ) ); } for (int i = 0; i < value.size(); i++) { arg.addLast(new AttributeReference.ArrayKey(i)); KVValue<?> docValue = value.get(i); if (docValue.getType().equals(DocumentType.INSTANCE)) { docValue.accept(this, arg); } else if (docValue.getType() instanceof ArrayType) { docValue.accept(this, arg); } arg.removeLast(); } return null; }
/** * Two entries are equals if their keys and values are equal. * @param obj * @return */ @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj == null) { return false; } if (!(obj instanceof DocEntry)) { return false; } DocEntry<?> other = (DocEntry) obj; return this.getKey().equals(other.getKey()) && this.getValue().equals(other.getValue()); }
public static BsonValue<?> translate(KVValue<?> kvValue) { return kvValue.accept(ToBsonValueTranslator.getInstance(), null); }
@Nonnull protected static KVType calculateElementType(Iterable<KVValue<?>> iterable) { KVType result = null; for (KVValue<?> kVValue : iterable) { KVType iestType = kVValue.getType(); if (result == null) { result = iestType; } else if (!result.equals(iestType)) { result = GenericType.INSTANCE; break; } } if (result == null) { result = GenericType.INSTANCE; } return result; } }
@Override public Boolean visit(ModIsQueryCriteria criteria, KVValue<?> arg) { KVValue<?> referenced = resolve(criteria.getAttributeReference(), arg); if (referenced == null) { return false; } if (referenced.getValue() instanceof Integer || referenced.getValue() instanceof Long) { long refValue = ((Number) referenced.getValue()).longValue(); long reminder = refValue % criteria.getDivisor().getValue().longValue(); return reminder == criteria.getReminder().getValue().longValue(); } return false; }
@Override public BsonValue<?> visit(KVArray value, Void arg) { List<BsonValue<?>> list = new ArrayList<>(value.size()); for (KVValue<?> kVValue : value) { list.add(kVValue.accept(this, arg)); } return newArray(list); }
private SubDocType getSubDocType(KVDocument value) { SubDocType.Builder builder = subDocTypeBuilderProvider.get(); for (DocEntry<?> entry : value) { if (!(entry.getValue() instanceof KVDocument)) { ScalarType type = ScalarType.fromDocType(entry.getValue().getType()); SubDocAttribute att = new SubDocAttribute(entry.getKey(), type); builder.add(att); } } return builder.build(); }
@Override public Boolean visit(IsGreaterQueryCriteria criteria, KVValue<?> arg) { KVValue<?> referenced = resolve(criteria.getAttributeReference(), arg); if (referenced == null) { return false; } Object innerValue = criteria.getValue().getValue(); if (innerValue instanceof Number) { if (referenced.getValue() instanceof Number) { Number refNumber = (Number) referenced.getValue(); return refNumber.doubleValue() > ((Number) innerValue).doubleValue(); } return false; } if (innerValue instanceof String) { if (referenced.getValue() instanceof String) { return ((String) referenced.getValue()).compareTo((String) innerValue) > 0; } return false; } return false; }
public static QueryCriteria createEquality(AttributeReference attRef, KVValue<?> docValue) { EqualityQueryFinder eqf = new EqualityQueryFinder(attRef); LinkedList<AttributeReference.Key> keys = Lists.newLinkedList(); docValue.accept(eqf, keys); return eqf.getConjunctionBuilder(). build(); }
@Override public Boolean visit(TypeIsQueryCriteria criteria, KVValue<?> arg) { KVValue<?> referenced = resolve(criteria.getAttributeReference(), arg); if (referenced == null) { return false; } ScalarType basicType = ScalarType.fromDocType(referenced.getType()); return criteria.getExpectedType().equals(basicType); }
@Override public Boolean visit(IsLessOrEqualQueryCriteria criteria, KVValue<?> arg) { KVValue<?> referenced = resolve(criteria.getAttributeReference(), arg); if (referenced == null) { return false; } Object innerValue = criteria.getValue().getValue(); if (innerValue instanceof Number) { if (referenced.getValue() instanceof Number) { Number refNumber = (Number) referenced.getValue(); return refNumber.doubleValue() <= ((Number) innerValue).doubleValue(); } return false; } if (innerValue instanceof String) { if (referenced.getValue() instanceof String) { return ((String) referenced.getValue()).compareTo((String) innerValue) <= 0; } return false; } return false; }
@Override public BsonValue<?> visit(KVDocument value, Void arg) { List<Entry<?>> entryList = new ArrayList<>(value.size()); for (DocEntry<?> docEntry : value) { entryList.add(new SimpleEntry<>( docEntry.getKey(), docEntry.getValue().accept(this, arg)) ); } return newDocument(entryList); }
@Override public Boolean visit(IsGreaterOrEqualQueryCriteria criteria, KVValue<?> arg) { KVValue<?> referenced = resolve(criteria.getAttributeReference(), arg); if (referenced == null) { return false; } Object innerValue = criteria.getValue().getValue(); if (innerValue instanceof Number) { if (referenced.getValue() instanceof Number) { Number refNumber = (Number) referenced.getValue(); return refNumber.doubleValue() >= ((Number) innerValue).doubleValue(); } return false; } if (innerValue instanceof String) { if (referenced.getValue() instanceof String) { return ((String) referenced.getValue()).compareTo((String) innerValue) >= 0; } return false; } return false; }
@Override public Void visit(KVArray value, Arg arg) { preKVValue(value, arg); preArray(value, arg); for (KVValue<?> element : value) { element.accept(this, arg); } postArray(value, arg); postKVValue(value, arg); return null; }
@Override public Void visit(KVDocument value, LinkedList<AttributeReference.Key> arg) { for (DocEntry<?> entry : value) { arg.addLast(new AttributeReference.ObjectKey(entry.getKey())); entry.getValue().accept(this, arg); arg.removeLast(); } ContainsAttributesQueryCriteria caqc = new ContainsAttributesQueryCriteria( basicAttRef.append(arg), value.getKeys(), true); conjunctionBuilder.add(caqc); return null; }
@Override public Void visit(KVDocument value, Arg arg) { preKVValue(value, arg); preDoc(value, arg); for (DocEntry<?> entry : value) { entry.getValue().accept(this, arg); } postDoc(value, arg); postKVValue(value, arg); return null; }
@Override public Void visit(KVArray value, TranslatorConsumer arg) { List<ScalarValue<?>> valueBuilder = new ArrayList<>(value.size()); ArrayStructure.Builder structureBuilder = new ArrayStructure.Builder(); ArrayTranslatorConsumer consumer = new ArrayTranslatorConsumer( valueBuilder, structureBuilder); int i = 0; for (KVValue<?> child : value) { consumer.setIndex(i); child.accept(this, consumer); i++; //i is 0-based! } arg.consume(new ListScalarArray(valueBuilder)); arg.consume(structureBuilder.built()); return null; }