private boolean containsObjects(KVArray value) { for (KVValue<?> subValue : value) { if (subValue.getType().equals(DocumentType.INSTANCE)) { return true; } } return false; }
@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 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; }
@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); }
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(); }