@Override public KVValue<?> apply(@Nonnull ScalarValue<?> input) { return (KVValue<?>) input.accept(this, null); }
@Override public Builder add(String key, ScalarValue value) { super.add(key, value); attributes.put(key, new SubDocAttribute(key, value.getType())); return this; }
@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; }
@SuppressFBWarnings("BC_UNCONFIRMED_CAST") @Override public boolean semanticEquals(QueryCriteria obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final ModIsQueryCriteria other = (ModIsQueryCriteria) obj; if (!this.getAttributeReference().equals(other.getAttributeReference())) { return false; } if (this.divisor != other.divisor && !this.divisor.equals(other.divisor)) { return false; } if (this.reminder != other.reminder && !this.reminder.equals(other.reminder)) { return false; } return true; }
@SuppressFBWarnings("BC_UNCONFIRMED_CAST") @Override public boolean semanticEquals(QueryCriteria obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final AttributeAndValueQueryCriteria other = (AttributeAndValueQueryCriteria) obj; if (this.value != other.value && (this.value == null || !this.value.equals(other.value))) { return false; } if (this.getAttributeReference() != other.getAttributeReference() && !this.getAttributeReference().equals(other.getAttributeReference())) { return false; } return true; } }
@Override public int hashCode() { int hash = getBaseHash(); hash = 17 * hash + this.getValue().hashCode(); hash = 17 * hash + this.getAttributeReference().hashCode(); return hash; }
@Override public Void visit(ScalarArray value, StringBuilder arg) { arg.append('['); for (ScalarValue<?> child : value) { child.accept(this, arg); arg.append(','); } if (!value.isEmpty()) { arg.replace(arg.length() - 1, arg.length(), "]"); } return null; }
@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 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; }
@Override public Boolean visit(IsEqualQueryCriteria criteria, KVValue<?> arg) { KVValue<?> referenced = resolve(criteria.getAttributeReference(), arg); if (referenced == null) { return false; } return criteria.getValue().equals(KVValueToScalarValue.fromDocValue(referenced)); }
@Override public Void visit(ScalarArray value, StringBuilder arg) { arg.append('['); for (ScalarValue<?> child : value) { child.accept(this, arg); arg.append(','); } if (!value.isEmpty()) { arg.replace(arg.length() - 1, arg.length(), "]"); } return null; }
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; }
@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 Boolean visit(InQueryCriteria criteria, KVValue<?> arg) { KVValue<?> referenced = resolve(criteria.getAttributeReference(), arg); if (referenced == null) { return false; } ScalarValue<?> converted = KVValueToScalarValue.fromDocValue(referenced); for (ScalarValue<?> expectedValue : criteria.getValue()) { if (converted.equals(expectedValue)) { return true; } } return false; }
@Override public Void visit(ScalarArray value, StringBuilder arg) { arg.append('['); for (ScalarValue<?> child : value) { child.accept(IN_ARRAY_CONVERTER, arg); arg.append(','); } if (!value.isEmpty()) { arg.replace(arg.length() - 1, arg.length(), "]"); } else { arg.append(']'); } return null; }
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); } } }
@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(ScalarArray value, StringBuilder arg) { arg.append('['); for (ScalarValue<?> child : value) { child.accept(IN_ARRAY_CONVERTER, arg); arg.append(','); } if (!value.isEmpty()) { arg.replace(arg.length() - 1, arg.length(), "]"); } else { arg.append(']'); } return null; }
@Nullable static QueryCriteria getStructureQueryCriteria(AttributeAndValueQueryCriteria criteria) { return getStructureQueryCriteria(criteria.getAttributeReference(), criteria.getValue().getType()); }