Search in sources :

Example 6 with Range

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);
}
Also used : VarcharType.createUnboundedVarcharType(com.facebook.presto.common.type.VarcharType.createUnboundedVarcharType) Type(com.facebook.presto.common.type.Type) Range(com.facebook.presto.common.predicate.Range) Test(org.testng.annotations.Test)

Example 7 with Range

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);
}
Also used : VarcharType.createUnboundedVarcharType(com.facebook.presto.common.type.VarcharType.createUnboundedVarcharType) Type(com.facebook.presto.common.type.Type) Range(com.facebook.presto.common.predicate.Range) Test(org.testng.annotations.Test)

Example 8 with Range

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;
}
Also used : SortedRangeSet(com.facebook.presto.common.predicate.SortedRangeSet) ArrayList(java.util.ArrayList) LiteralEncoder.toRowExpression(com.facebook.presto.sql.planner.LiteralEncoder.toRowExpression) RowExpression(com.facebook.presto.spi.relation.RowExpression) Range(com.facebook.presto.common.predicate.Range)

Example 9 with Range

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()));
}
Also used : KafkaHandleResolver.convertColumnHandle(com.facebook.presto.kafka.KafkaHandleResolver.convertColumnHandle) ColumnHandle(com.facebook.presto.spi.ColumnHandle) Marker(com.facebook.presto.common.predicate.Marker) Range(com.facebook.presto.common.predicate.Range) ConnectorTableLayoutResult(com.facebook.presto.spi.ConnectorTableLayoutResult) ConnectorTableLayout(com.facebook.presto.spi.ConnectorTableLayout) Domain(com.facebook.presto.common.predicate.Domain) Map(java.util.Map) ImmutableMap(com.google.common.collect.ImmutableMap)

Example 10 with Range

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()));
}
Also used : VarcharType.createUnboundedVarcharType(com.facebook.presto.common.type.VarcharType.createUnboundedVarcharType) Type(com.facebook.presto.common.type.Type) ArrayList(java.util.ArrayList) Document(org.bson.Document) Range(com.facebook.presto.common.predicate.Range)

Aggregations

Range (com.facebook.presto.common.predicate.Range)25 Domain (com.facebook.presto.common.predicate.Domain)11 TupleDomain (com.facebook.presto.common.predicate.TupleDomain)10 ArrayList (java.util.ArrayList)10 ValueSet (com.facebook.presto.common.predicate.ValueSet)7 ColumnHandle (com.facebook.presto.spi.ColumnHandle)7 Test (org.testng.annotations.Test)7 Type (com.facebook.presto.common.type.Type)6 ImmutableList (com.google.common.collect.ImmutableList)6 SortedRangeSet (com.facebook.presto.common.predicate.SortedRangeSet)4 VarcharType.createUnboundedVarcharType (com.facebook.presto.common.type.VarcharType.createUnboundedVarcharType)4 Instant (java.time.Instant)4 List (java.util.List)4 Map (java.util.Map)4 Marker (com.facebook.presto.common.predicate.Marker)3 PrometheusSplitManager.decimalSecondString (com.facebook.presto.plugin.prometheus.PrometheusSplitManager.decimalSecondString)3 Slice (io.airlift.slice.Slice)3 Duration (java.time.Duration)3 TemporalAmount (java.time.temporal.TemporalAmount)3 Objects.requireNonNull (java.util.Objects.requireNonNull)3