private String toPredicate(Domain domain, Type type, int position) checkArgument(domain.getType().isOrderable(), "Domain type must be orderable"); if (domain.getValues().isNone()) { if (domain.isNullAllowed()) { return format("s._%d", position + 1) + " = '' "; if (domain.getValues().isAll()) { if (domain.isNullAllowed()) { return "TRUE"; for (Range range : domain.getValues().getRanges().getOrderedRanges()) { checkState(!range.isAll()); if (range.isSingleValue()) { singleValues.add(range.getLow().getValue()); continue;
private static TupleDomain<HiveColumnHandle> toCompactTupleDomain(TupleDomain<ColumnHandle> effectivePredicate, int threshold) { ImmutableMap.Builder<HiveColumnHandle, Domain> builder = ImmutableMap.builder(); effectivePredicate.getDomains().ifPresent(domains -> { for (Map.Entry<ColumnHandle, Domain> entry : domains.entrySet()) { HiveColumnHandle hiveColumnHandle = (HiveColumnHandle) entry.getKey(); ValueSet values = entry.getValue().getValues(); ValueSet compactValueSet = values.getValuesProcessor().<Optional<ValueSet>>transform( ranges -> ranges.getRangeCount() > threshold ? Optional.of(ValueSet.ofRanges(ranges.getSpan())) : Optional.empty(), discreteValues -> discreteValues.getValues().size() > threshold ? Optional.of(ValueSet.all(values.getType())) : Optional.empty(), allOrNone -> Optional.empty()) .orElse(values); builder.put(hiveColumnHandle, Domain.create(compactValueSet, entry.getValue().isNullAllowed())); } }); return TupleDomain.withColumnDomains(builder.build()); }
/** * Reduces the number of discrete components in the Domain if there are too many. */ public Domain simplify() { ValueSet simplifiedValueSet = values.getValuesProcessor().<Optional<ValueSet>>transform( ranges -> { if (ranges.getOrderedRanges().size() <= 32) { return Optional.empty(); } return Optional.of(ValueSet.ofRanges(ranges.getSpan())); }, discreteValues -> { if (discreteValues.getValues().size() <= 32) { return Optional.empty(); } return Optional.of(ValueSet.all(values.getType())); }, allOrNone -> Optional.empty()) .orElse(values); return Domain.create(simplifiedValueSet, nullAllowed); }
private static OptionalInt extractUpperBound(TupleDomain<Symbol> tupleDomain, Symbol symbol) { if (tupleDomain.isNone()) { return OptionalInt.empty(); } Domain rowNumberDomain = tupleDomain.getDomains().get().get(symbol); if (rowNumberDomain == null) { return OptionalInt.empty(); } ValueSet values = rowNumberDomain.getValues(); if (values.isAll() || values.isNone() || values.getRanges().getRangeCount() <= 0) { return OptionalInt.empty(); } Range span = values.getRanges().getSpan(); if (span.getHigh().isUpperUnbounded()) { return OptionalInt.empty(); } verify(rowNumberDomain.getType().equals(BIGINT)); long upperBound = (Long) span.getHigh().getValue(); if (span.getHigh().getBound() == BELOW) { upperBound--; } if (upperBound > 0 && upperBound <= Integer.MAX_VALUE) { return OptionalInt.of(toIntExact(upperBound)); } return OptionalInt.empty(); }
if (domain.isNullAllowed()) { parts.add("NULL"); Type type = domain.getType(); domain.getValues().getValuesProcessor().consume( ranges -> { for (Range range : ranges.getOrderedRanges()) { StringBuilder builder = new StringBuilder(); if (range.isSingleValue()) { String value = castToVarchar(type, range.getSingleValue(), functionRegistry, session); builder.append('[').append(value).append(']'); builder.append((range.getLow().getBound() == Marker.Bound.EXACTLY) ? '[' : '('); if (range.getLow().isLowerUnbounded()) {
if (domain.getValues().isNone() && domain.isNullAllowed()) { return documentOf(name, isNullPredicate()); if (domain.getValues().isAll() && !domain.isNullAllowed()) { return documentOf(name, isNotNullPredicate()); for (Range range : domain.getValues().getRanges().getOrderedRanges()) { if (range.isSingleValue()) { singleValues.add(translateValue(range.getSingleValue(), type)); if (!range.getLow().isLowerUnbounded()) { switch (range.getLow().getBound()) { case ABOVE:
ColumnSchema columnSchema = schema.getColumnByIndex(position); Domain domain = columnDomain.getDomain(); if (domain.isNone()) { return false; else if (domain.isAll()) { else if (domain.isOnlyNull()) { builder.addPredicate(KuduPredicate.newIsNullPredicate(columnSchema)); else if (domain.getValues().isAll() && domain.isNullAllowed()) { builder.addPredicate(KuduPredicate.newIsNotNullPredicate(columnSchema)); Range span = ranges.getSpan(); Marker low = span.getLow(); if (!low.isLowerUnbounded()) { KuduPredicate.ComparisonOp op = (low.getBound() == Marker.Bound.ABOVE) builder.addPredicate(predicate); Marker high = span.getHigh(); if (!high.isUpperUnbounded()) { KuduPredicate.ComparisonOp op = (low.getBound() == Marker.Bound.BELOW)
private FormattedDomain parseDomain(Domain domain) { ImmutableSet.Builder<FormattedRange> formattedRanges = ImmutableSet.builder(); Type type = domain.getType(); domain.getValues().getValuesProcessor().consume( ranges -> formattedRanges.addAll( ranges.getOrderedRanges().stream() .map(range -> new FormattedRange(formatMarker(range.getLow()), formatMarker(range.getHigh()))) .collect(toImmutableSet())), discreteValues -> formattedRanges.addAll( discreteValues.getValues().stream() .map(value -> getVarcharValue(type, value)) .map(value -> new FormattedMarker(Optional.of(value), EXACTLY)) .map(marker -> new FormattedRange(marker, marker)) .collect(toImmutableSet())), allOrNone -> { throw new IllegalStateException("Unreachable AllOrNone consumer"); }); return new FormattedDomain(domain.isNullAllowed(), formattedRanges.build()); }
if (domain.isNullAllowed() || domain.isAll()) { continue; if (!domain.getType().isOrderable()) { continue; Ranges ranges = domain.getValues().getRanges(); if (ranges.getRangeCount() > MAX_RANGE_COUNT) { continue; for (Range range : ranges.getOrderedRanges()) { Object minValue = null; Object maxValue = null; if (range.isSingleValue()) { minValue = range.getSingleValue(); maxValue = range.getSingleValue();
List<ValueBuffer> bindValues) if (domain.getValues().isAll()) { return domain.isNullAllowed() ? "TRUE" : columnName + " IS NOT NULL"; if (domain.getValues().isNone()) { return domain.isNullAllowed() ? columnName + " IS NULL" : "FALSE"; return domain.getValues().getValuesProcessor().transform( ranges -> { for (Range range : ranges.getOrderedRanges()) { checkState(!range.isAll()); // Already checked if (range.isSingleValue()) { singleValues.add(range.getLow().getValue());
private QueryBuilder buildTermQuery(BoolQueryBuilder queryBuilder, String columnName, Domain domain, Type type) for (Range range : domain.getValues().getRanges().getOrderedRanges()) { BoolQueryBuilder rangeQueryBuilder = new BoolQueryBuilder(); Set<Object> valuesToInclude = new HashSet<>(); checkState(!range.isAll(), "Invalid range for column: " + columnName); if (range.isSingleValue()) { valuesToInclude.add(range.getLow().getValue());
/** * Reduces the number of discrete components in the Domain if there are too many. */ public static Domain simplifyDomain(Domain domain) { ValueSet values = domain.getValues(); ValueSet simplifiedValueSet = values.getValuesProcessor().<Optional<ValueSet>>transform( ranges -> { if (ranges.getOrderedRanges().size() <= 32) { return Optional.empty(); } return Optional.of(ValueSet.ofRanges(ranges.getSpan())); }, discreteValues -> { if (discreteValues.getValues().size() <= 32) { return Optional.empty(); } return Optional.of(ValueSet.all(domain.getType())); }, allOrNone -> Optional.empty()) .orElse(values); return Domain.create(simplifiedValueSet, domain.isNullAllowed()); } }
if (domain.isNullAllowed()) { return ImmutableList.of(); Set<Object> values = domain.getValues().getValuesProcessor().transform( ranges -> { ImmutableSet.Builder<Object> columnValues = ImmutableSet.builder(); for (Range range : ranges.getOrderedRanges()) { if (!range.isSingleValue()) { return ImmutableSet.of(); Object value = range.getSingleValue();
/** * Gets a collection of Accumulo Range objects from the given Presto domain. * This maps the column constraints of the given Domain to an Accumulo Range scan. * * @param domain Domain, can be null (returns (-inf, +inf) Range) * @param serializer Instance of an {@link AccumuloRowSerializer} * @return A collection of Accumulo Range objects * @throws TableNotFoundException If the Accumulo table is not found */ public static Collection<Range> getRangesFromDomain(Optional<Domain> domain, AccumuloRowSerializer serializer) throws TableNotFoundException { // if we have no predicate pushdown, use the full range if (!domain.isPresent()) { return ImmutableSet.of(new Range()); } ImmutableSet.Builder<Range> rangeBuilder = ImmutableSet.builder(); for (com.facebook.presto.spi.predicate.Range range : domain.get().getValues().getRanges().getOrderedRanges()) { rangeBuilder.add(getRangeFromPrestoRange(range, serializer)); } return rangeBuilder.build(); }
|| ((EthereumColumnHandle) entry.getKey()).getName().equals("tx_blockNumber") || ((EthereumColumnHandle) entry.getKey()).getName().equals("erc20_blockNumber"))) { entry.getValue().getValues().getRanges().getOrderedRanges().forEach(r -> { Marker low = r.getLow(); Marker high = r.getHigh(); builder.add(EthereumBlockRange.fromMarkers(low, high)); }); && (((EthereumColumnHandle) entry.getKey()).getName().equals("block_hash") || ((EthereumColumnHandle) entry.getKey()).getName().equals("tx_blockHash"))) { entry.getValue().getValues().getRanges().getOrderedRanges().stream() .filter(Range::isSingleValue).forEach(r -> { String blockHash = ((Slice) r.getSingleValue()).toStringUtf8(); try { long blockNumber = web3j.ethGetBlockByHash(blockHash, true).send().getBlock().getNumber().longValue(); log.info(entry.getValue().getValues().toString(null)); } else if (entry.getKey() instanceof EthereumColumnHandle && (((EthereumColumnHandle) entry.getKey()).getName().equals("block_timestamp"))) { entry.getValue().getValues().getRanges().getOrderedRanges().forEach(r -> { Marker low = r.getLow(); Marker high = r.getHigh();
@VisibleForTesting public static Optional<Collection<Object>> extractDiscreteValues(ValueSet valueSet) { return valueSet.getValuesProcessor().transform( ranges -> { ImmutableList.Builder<Object> discreteValues = ImmutableList.builder(); for (Range range : ranges.getOrderedRanges()) { if (!range.isSingleValue()) { return Optional.empty(); } discreteValues.add(range.getSingleValue()); } return Optional.of(discreteValues.build()); }, discreteValues -> Optional.of(discreteValues.getValues()), allOrNone -> allOrNone.isAll() ? Optional.empty() : Optional.of(ImmutableList.of())); }
List<Range> orderedRanges = ranges.getOrderedRanges(); if (range.isSingleValue()) { singleValues.add(literalEncoder.toExpression(range.getSingleValue(), type)); continue; while (singleValueExclusions.hasNext() && range.contains(singleValueExclusions.peek())) { singleValuesInRange.add(literalEncoder.toExpression(singleValueExclusions.next().getSingleValue(), type));
private static String createShardPredicate(ImmutableList.Builder<JDBCType> types, ImmutableList.Builder<Object> values, Domain domain, JDBCType jdbcType) { List<Range> ranges = domain.getValues().getRanges().getOrderedRanges(); // only apply predicates if all ranges are single values if (ranges.isEmpty() || !ranges.stream().allMatch(Range::isSingleValue)) { return "true"; } ImmutableList.Builder<Object> valuesBuilder = ImmutableList.builder(); ImmutableList.Builder<JDBCType> typesBuilder = ImmutableList.builder(); StringJoiner rangePredicate = new StringJoiner(" OR "); for (Range range : ranges) { Slice uuidText = (Slice) range.getSingleValue(); try { Slice uuidBytes = uuidStringToBytes(uuidText); typesBuilder.add(jdbcType); valuesBuilder.add(uuidBytes); } catch (IllegalArgumentException e) { return "true"; } rangePredicate.add("shard_uuid = ?"); } types.addAll(typesBuilder.build()); values.addAll(valuesBuilder.build()); return rangePredicate.toString(); }
break; if (domain.isNullAllowed()) { break; predicateString = domain.getValues().getValuesProcessor().transform( ranges -> { List<Object> singleValues = new ArrayList<>(); String predicate = null; for (Range range : ranges.getOrderedRanges()) { if (range.isAll()) { return null; if (range.isSingleValue()) { singleValues.add(CassandraCqlUtils.cqlValue(toCQLCompatibleString(range.getSingleValue()), columnHandle.getCassandraType()));
ColumnSchema columnSchema = schema.getColumnByIndex(position); Domain domain = columnDomain.getDomain(); if (domain.isNone()) { return false; } else if (domain.isAll()) { ValueSet valueSet = domain.getValues(); if (valueSet instanceof EquatableValueSet) { DiscreteValues discreteValues = valueSet.getDiscreteValues(); KuduPredicate predicate = createInListPredicate(columnSchema, discreteValues); builder.addPredicate(predicate); } else if (valueSet instanceof SortedRangeSet) { Ranges ranges = ((SortedRangeSet) valueSet).getRanges(); Range span = ranges.getSpan(); Marker low = span.getLow(); if (!low.isLowerUnbounded()) { KuduPredicate.ComparisonOp op = (low.getBound() == Marker.Bound.ABOVE) builder.addPredicate(predicate); Marker high = span.getHigh(); if (!high.isUpperUnbounded()) { KuduPredicate.ComparisonOp op = (low.getBound() == Marker.Bound.BELOW)