in athena-docdb/src/main/java/com/amazonaws/athena/connectors/docdb/QueryUtils.java [127:215]
public static Document makePredicate(Field field, ValueSet constraint)
{
String name = field.getName();
if (constraint.isNone()) {
return documentOf(name, isNullPredicate());
}
if (constraint.isAll()) {
return documentOf(name, isNotNullPredicate());
}
if (constraint.isNullAllowed()) {
//TODO: support nulls mixed with discrete value constraints
return null;
}
if (constraint instanceof EquatableValueSet) {
Block block = ((EquatableValueSet) constraint).getValues();
List<Object> singleValues = new ArrayList<>();
FieldReader fieldReader = block.getFieldReaders().get(0);
for (int i = 0; i < block.getRowCount(); i++) {
Document nextEqVal = new Document();
fieldReader.setPosition(i);
Object value = fieldReader.readObject();
nextEqVal.put(EQ_OP, convert(value));
singleValues.add(singleValues);
}
return orPredicate(singleValues.stream()
.map(next -> new Document(name, next))
.collect(toList()));
}
List<Object> singleValues = new ArrayList<>();
List<Document> disjuncts = new ArrayList<>();
for (Range range : constraint.getRanges().getOrderedRanges()) {
if (range.isSingleValue()) {
singleValues.add(convert(range.getSingleValue()));
}
else {
Document rangeConjuncts = new Document();
if (!range.getLow().isLowerUnbounded()) {
switch (range.getLow().getBound()) {
case ABOVE:
rangeConjuncts.put(GT_OP, convert(range.getLow().getValue()));
break;
case EXACTLY:
rangeConjuncts.put(GTE_OP, convert(range.getLow().getValue()));
break;
case BELOW:
throw new IllegalArgumentException("Low Marker should never use BELOW bound: " + range);
default:
throw new AssertionError("Unhandled bound: " + range.getLow().getBound());
}
}
if (!range.getHigh().isUpperUnbounded()) {
switch (range.getHigh().getBound()) {
case ABOVE:
throw new IllegalArgumentException("High Marker should never use ABOVE bound: " + range);
case EXACTLY:
rangeConjuncts.put(LTE_OP, convert(range.getHigh().getValue()));
break;
case BELOW:
rangeConjuncts.put(LT_OP, convert(range.getHigh().getValue()));
break;
default:
throw new AssertionError("Unhandled bound: " + range.getHigh().getBound());
}
}
// If rangeConjuncts is null, then the range was ALL, which should already have been checked for
verify(!rangeConjuncts.isEmpty());
disjuncts.add(rangeConjuncts);
}
}
// Add back all of the possible single values either as an equality or an IN predicate
if (singleValues.size() == 1) {
disjuncts.add(documentOf(EQ_OP, singleValues.get(0)));
}
else if (singleValues.size() > 1) {
disjuncts.add(documentOf(IN_OP, singleValues));
}
return orPredicate(disjuncts.stream()
.map(disjunct -> new Document(name, disjunct))
.collect(toList()));
}