@Override public int size() { return delegate.size(); }
@Override public ArrayType getType() { if (type == null) { type = new ArrayType(calculateElementType(this)); } return type; }
/** * Two ArrayValues values are equal if their contains equal elements in the * same position. * * An easy way to implement that is to delegate on * {@link Iterators#elementsEqual(java.lang.Iterator, java.lang.Iterator) } * * @param obj * @return */ @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj == null) { return false; } if (!(obj instanceof KVArray)) { return false; } KVArray other = (KVArray) obj; if (!other.getElementType().equals(this.getElementType())) { return false; } if (!equalsOptimization(other)) { return false; } return Iterables.elementsEqual(other, this); }
/** * @return * {@linkplain Hashing#goodFastHash(int) Hashing.goodFastHash(32).newHasher().putInt(size()).putInt(getElementType().hashCode()).hash().asInt();} */ @Override public int hashCode() { return Hashing.goodFastHash(32).newHasher().putInt(size()).putInt(getElementType().hashCode()).hash().asInt(); }
@Override public boolean isEmpty() { return delegate.isEmpty(); }
@Override public ScalarValue<?> get(int index) throws IndexOutOfBoundsException { return fromDocValue(delegate.get(index)); } }
@Nonnull public KVType getElementType() { return getType().getElementType(); }
@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; }
public boolean isEmpty() { return size() == 0; }
@Override protected boolean equalsOptimization(@Nonnull KVArray other) { if (other instanceof ListKVArray) { return this.size() == other.size(); } return true; }
@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); }
@Override public Boolean visit(SizeIsQueryCriteria criteria, KVValue<?> arg) { KVValue<?> referenced = resolve(criteria.getAttributeReference(), arg); if (referenced == null) { return false; } if (!(referenced instanceof KVArray)) { return false; } return ((KVArray) referenced).size() == criteria.getValue().getValue(); }
assert result.size() == value.size();
@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; }