use of com.facebook.presto.common.predicate.Range in project presto by prestodb.
the class TestHiveSplitManager method testPartitionStatsBasedOptimizationForDate.
@Test
public void testPartitionStatsBasedOptimizationForDate() throws Exception {
Type type = DATE;
Range partitionRange = range(type, 10L, true, 20L, true);
HiveColumnHandle columnHandle = new HiveColumnHandle("t_date", HIVE_DATE, type.getTypeSignature(), 0, REGULAR, Optional.empty(), Optional.empty());
// Test no partition stats
assertRedundantColumnDomains(partitionRange, PartitionStatistics.empty(), ImmutableList.of(ImmutableSet.of()), columnHandle);
// Test partition left unchanged
assertRedundantColumnDomains(partitionRange, createDatePartitionStatistics(5, 25, columnHandle.getName()), ImmutableList.of(ImmutableSet.of()), columnHandle);
// Test partition being pruned
assertRedundantColumnDomains(partitionRange, createDatePartitionStatistics(1, 3, columnHandle.getName()), ImmutableList.of(), columnHandle);
// Test partition having subfield domain stripped
assertRedundantColumnDomains(partitionRange, createDatePartitionStatistics(13, 15, columnHandle.getName()), ImmutableList.of(ImmutableSet.of(columnHandle)), columnHandle);
}
use of com.facebook.presto.common.predicate.Range in project presto by prestodb.
the class TestHiveSplitManager method testPartitionStatsBasedOptimizationForReal.
@Test
public void testPartitionStatsBasedOptimizationForReal() throws Exception {
Type type = REAL;
Range partitionRange = range(type, (long) floatToIntBits(10.0f), true, (long) floatToIntBits(20.0f), true);
HiveColumnHandle columnHandle = new HiveColumnHandle("t_real", HIVE_FLOAT, type.getTypeSignature(), 0, REGULAR, Optional.empty(), Optional.empty());
// Test no partition stats
assertRedundantColumnDomains(partitionRange, PartitionStatistics.empty(), ImmutableList.of(ImmutableSet.of()), columnHandle);
// Test partition left unchanged
assertRedundantColumnDomains(partitionRange, createDoublePartitionStatistics(5.0, 25.0, columnHandle.getName()), ImmutableList.of(ImmutableSet.of()), columnHandle);
// Test partition being pruned
assertRedundantColumnDomains(partitionRange, createDoublePartitionStatistics(1.0, 3.0, columnHandle.getName()), ImmutableList.of(), columnHandle);
// Test partition having subfield domain stripped
assertRedundantColumnDomains(partitionRange, createDoublePartitionStatistics(13.0, 15.0, columnHandle.getName()), ImmutableList.of(ImmutableSet.of(columnHandle)), columnHandle);
}
use of com.facebook.presto.common.predicate.Range in project presto by prestodb.
the class RowExpressionDomainTranslator method extractDisjuncts.
private List<RowExpression> extractDisjuncts(Type type, Ranges ranges, RowExpression reference) {
List<RowExpression> disjuncts = new ArrayList<>();
List<RowExpression> singleValues = new ArrayList<>();
List<Range> orderedRanges = ranges.getOrderedRanges();
SortedRangeSet sortedRangeSet = SortedRangeSet.copyOf(type, orderedRanges);
SortedRangeSet complement = sortedRangeSet.complement();
List<Range> singleValueExclusionsList = complement.getOrderedRanges().stream().filter(Range::isSingleValue).collect(toList());
List<Range> originalUnionSingleValues = SortedRangeSet.copyOf(type, singleValueExclusionsList).union(sortedRangeSet).getOrderedRanges();
PeekingIterator<Range> singleValueExclusions = peekingIterator(singleValueExclusionsList.iterator());
for (Range range : originalUnionSingleValues) {
if (range.isSingleValue()) {
singleValues.add(toRowExpression(reference.getSourceLocation(), range.getSingleValue(), type));
continue;
}
// attempt to optimize ranges that can be coalesced as long as single value points are excluded
List<RowExpression> singleValuesInRange = new ArrayList<>();
while (singleValueExclusions.hasNext() && range.contains(singleValueExclusions.peek())) {
singleValuesInRange.add(toRowExpression(reference.getSourceLocation(), singleValueExclusions.next().getSingleValue(), type));
}
if (!singleValuesInRange.isEmpty()) {
disjuncts.add(combineRangeWithExcludedPoints(type, reference, range, singleValuesInRange));
continue;
}
disjuncts.add(processRange(type, range, reference));
}
// Add back all of the possible single values either as an equality or an IN predicate
if (singleValues.size() == 1) {
disjuncts.add(equal(reference, getOnlyElement(singleValues)));
} else if (singleValues.size() > 1) {
disjuncts.add(in(reference, singleValues));
}
return disjuncts;
}
use of com.facebook.presto.common.predicate.Range in project presto by prestodb.
the class KafkaMetadata method getTableLayouts.
@Override
public List<ConnectorTableLayoutResult> getTableLayouts(ConnectorSession session, ConnectorTableHandle table, Constraint<ColumnHandle> constraint, Optional<Set<ColumnHandle>> desiredColumns) {
KafkaTableHandle handle = convertTableHandle(table);
long startTimestamp = 0;
long endTimestamp = 0;
Optional<Map<ColumnHandle, Domain>> domains = constraint.getSummary().getDomains();
if (domains.isPresent()) {
Map<ColumnHandle, Domain> columnHandleDomainMap = domains.get();
for (Map.Entry<ColumnHandle, Domain> entry : columnHandleDomainMap.entrySet()) {
if (entry.getKey() instanceof KafkaColumnHandle && ((KafkaColumnHandle) entry.getKey()).getName().equals(KafkaInternalFieldDescription.OFFSET_TIMESTAMP_FIELD.getColumnName())) {
Range span = entry.getValue().getValues().getRanges().getSpan();
Marker low = span.getLow();
Marker high = span.getHigh();
if (!low.isLowerUnbounded()) {
startTimestamp = (long) low.getValue();
}
if (!high.isUpperUnbounded()) {
endTimestamp = (long) high.getValue();
}
}
}
}
ConnectorTableLayout layout = new ConnectorTableLayout(new KafkaTableLayoutHandle(handle, startTimestamp, endTimestamp));
return ImmutableList.of(new ConnectorTableLayoutResult(layout, constraint.getSummary()));
}
use of com.facebook.presto.common.predicate.Range in project presto by prestodb.
the class MongoSession method buildPredicate.
private static Document buildPredicate(MongoColumnHandle column, Domain domain) {
String name = column.getName();
Type type = column.getType();
if (domain.getValues().isNone() && domain.isNullAllowed()) {
return documentOf(name, isNullPredicate());
}
if (domain.getValues().isAll() && !domain.isNullAllowed()) {
return documentOf(name, isNotNullPredicate());
}
List<Object> singleValues = new ArrayList<>();
List<Document> disjuncts = new ArrayList<>();
for (Range range : domain.getValues().getRanges().getOrderedRanges()) {
if (range.isSingleValue()) {
singleValues.add(translateValue(range.getSingleValue(), type));
} else {
Document rangeConjuncts = new Document();
if (!range.isLowUnbounded()) {
rangeConjuncts.put(range.isLowInclusive() ? GTE_OP : GT_OP, translateValue(range.getLowBoundedValue(), type));
}
if (!range.isHighUnbounded()) {
rangeConjuncts.put(range.isHighInclusive() ? LTE_OP : LT_OP, translateValue(range.getHighBoundedValue(), type));
}
// 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));
}
if (domain.isNullAllowed()) {
disjuncts.add(isNullPredicate());
}
return orPredicate(disjuncts.stream().map(disjunct -> new Document(name, disjunct)).collect(toList()));
}
Aggregations