in src/main/java/org/apache/paimon/trino/TrinoFilterConverter.java [140:214]
private Predicate toPredicate(int columnIndex, String field, Type type, Domain domain) {
if (domain.isAll()) {
// TODO alwaysTrue
throw new UnsupportedOperationException();
}
if (domain.getValues().isNone()) {
if (domain.isNullAllowed()) {
return builder.isNull((columnIndex));
}
// TODO alwaysFalse
throw new UnsupportedOperationException();
}
if (domain.getValues().isAll()) {
if (domain.isNullAllowed()) {
// TODO alwaysTrue
throw new UnsupportedOperationException();
}
return builder.isNotNull((columnIndex));
}
// TODO support structural types
if (type instanceof ArrayType || type instanceof io.trino.spi.type.RowType) {
// Fail fast. Ignoring expression could lead to data loss in case of deletions.
throw new UnsupportedOperationException();
}
if (type instanceof MapType) {
List<Range> orderedRanges = domain.getValues().getRanges().getOrderedRanges();
List<Object> values = new ArrayList<>();
List<Predicate> predicates = new ArrayList<>();
for (Range range : orderedRanges) {
if (range.isSingleValue()) {
values.add(
getLiteralValue(
((MapType) type).getValueType(), range.getLowBoundedValue()));
}
}
if (!values.isEmpty()) {
Predicate predicate =
new LeafPredicate(
In.INSTANCE,
TrinoTypeUtils.toPaimonType(type),
columnIndex,
field,
values);
predicates.add(predicate);
}
return or(predicates);
}
if (type.isOrderable()) {
List<Range> orderedRanges = domain.getValues().getRanges().getOrderedRanges();
List<Object> values = new ArrayList<>();
List<Predicate> predicates = new ArrayList<>();
for (Range range : orderedRanges) {
if (range.isSingleValue()) {
values.add(getLiteralValue(type, range.getLowBoundedValue()));
} else {
predicates.add(toPredicate(columnIndex, range));
}
}
if (!values.isEmpty()) {
predicates.add(builder.in(columnIndex, values));
}
if (domain.isNullAllowed()) {
predicates.add(builder.isNull(columnIndex));
}
return or(predicates);
}
throw new UnsupportedOperationException();
}