Search in sources :

Example 1 with EQUAL

use of com.facebook.presto.sql.tree.ComparisonExpression.Operator.EQUAL in project presto by prestodb.

the class ExpressionDomainTranslator method extractDisjuncts.

private List<Expression> extractDisjuncts(Type type, DiscreteValues discreteValues, SymbolReference reference) {
    List<Expression> values = discreteValues.getValues().stream().map(object -> literalEncoder.toExpression(object, type)).collect(toList());
    // If values is empty, then the equatableValues was either ALL or NONE, both of which should already have been checked for
    checkState(!values.isEmpty());
    Expression predicate;
    if (values.size() == 1) {
        predicate = new ComparisonExpression(EQUAL, reference, getOnlyElement(values));
    } else {
        predicate = new InPredicate(reference, new InListExpression(values));
    }
    if (!discreteValues.isWhiteList()) {
        predicate = new NotExpression(predicate);
    }
    return ImmutableList.of(predicate);
}
Also used : WarningCollector(com.facebook.presto.spi.WarningCollector) SATURATED_FLOOR_CAST(com.facebook.presto.metadata.CastType.SATURATED_FLOOR_CAST) DiscreteValues(com.facebook.presto.common.predicate.DiscreteValues) IsNullPredicate(com.facebook.presto.sql.tree.IsNullPredicate) SortedRangeSet(com.facebook.presto.common.predicate.SortedRangeSet) PeekingIterator(com.google.common.collect.PeekingIterator) NOT_EQUAL(com.facebook.presto.sql.tree.ComparisonExpression.Operator.NOT_EQUAL) Preconditions.checkArgument(com.google.common.base.Preconditions.checkArgument) Map(java.util.Map) Marker(com.facebook.presto.common.predicate.Marker) BetweenPredicate(com.facebook.presto.sql.tree.BetweenPredicate) NotExpression(com.facebook.presto.sql.tree.NotExpression) SymbolReference(com.facebook.presto.sql.tree.SymbolReference) NullableValue(com.facebook.presto.common.predicate.NullableValue) InterpretedFunctionInvoker(com.facebook.presto.sql.InterpretedFunctionInvoker) ImmutableMap(com.google.common.collect.ImmutableMap) Collections.emptyList(java.util.Collections.emptyList) ImmutableList.toImmutableList(com.google.common.collect.ImmutableList.toImmutableList) Range(com.facebook.presto.common.predicate.Range) SqlParser(com.facebook.presto.sql.parser.SqlParser) Preconditions.checkState(com.google.common.base.Preconditions.checkState) TRUE_LITERAL(com.facebook.presto.sql.tree.BooleanLiteral.TRUE_LITERAL) BooleanLiteral(com.facebook.presto.sql.tree.BooleanLiteral) NullLiteral(com.facebook.presto.sql.tree.NullLiteral) ExpressionUtils.combineDisjunctsWithDefault(com.facebook.presto.sql.ExpressionUtils.combineDisjunctsWithDefault) LogicalBinaryExpression(com.facebook.presto.sql.tree.LogicalBinaryExpression) List(java.util.List) InPredicate(com.facebook.presto.sql.tree.InPredicate) OperatorNotFoundException(com.facebook.presto.metadata.OperatorNotFoundException) Optional(java.util.Optional) CAST(com.facebook.presto.metadata.CastType.CAST) GREATER_THAN_OR_EQUAL(com.facebook.presto.sql.tree.ComparisonExpression.Operator.GREATER_THAN_OR_EQUAL) Ranges(com.facebook.presto.common.predicate.Ranges) Utils(com.facebook.presto.common.Utils) ExpressionUtils.combineConjuncts(com.facebook.presto.sql.ExpressionUtils.combineConjuncts) ExpressionUtils.and(com.facebook.presto.sql.ExpressionUtils.and) Collectors.collectingAndThen(java.util.stream.Collectors.collectingAndThen) ExpressionUtils(com.facebook.presto.sql.ExpressionUtils) ArrayList(java.util.ArrayList) LESS_THAN(com.facebook.presto.sql.tree.ComparisonExpression.Operator.LESS_THAN) InListExpression(com.facebook.presto.sql.tree.InListExpression) ImmutableList(com.google.common.collect.ImmutableList) Objects.requireNonNull(java.util.Objects.requireNonNull) Cast(com.facebook.presto.sql.tree.Cast) Comparator.comparing(java.util.Comparator.comparing) LESS_THAN_OR_EQUAL(com.facebook.presto.sql.tree.ComparisonExpression.Operator.LESS_THAN_OR_EQUAL) Iterators.peekingIterator(com.google.common.collect.Iterators.peekingIterator) Type(com.facebook.presto.common.type.Type) Nullable(javax.annotation.Nullable) ExpressionUtils.or(com.facebook.presto.sql.ExpressionUtils.or) FALSE_LITERAL(com.facebook.presto.sql.tree.BooleanLiteral.FALSE_LITERAL) Session(com.facebook.presto.Session) EQUAL(com.facebook.presto.sql.tree.ComparisonExpression.Operator.EQUAL) AstVisitor(com.facebook.presto.sql.tree.AstVisitor) Iterables.getOnlyElement(com.google.common.collect.Iterables.getOnlyElement) IsNotNullPredicate(com.facebook.presto.sql.tree.IsNotNullPredicate) ComparisonExpression(com.facebook.presto.sql.tree.ComparisonExpression) Domain(com.facebook.presto.common.predicate.Domain) TupleDomain(com.facebook.presto.common.predicate.TupleDomain) NodeRef(com.facebook.presto.sql.tree.NodeRef) Collectors.toList(java.util.stream.Collectors.toList) ExpressionAnalyzer(com.facebook.presto.sql.analyzer.ExpressionAnalyzer) Expression(com.facebook.presto.sql.tree.Expression) FunctionHandle(com.facebook.presto.spi.function.FunctionHandle) GREATER_THAN(com.facebook.presto.sql.tree.ComparisonExpression.Operator.GREATER_THAN) Block(com.facebook.presto.common.block.Block) ValueSet(com.facebook.presto.common.predicate.ValueSet) Metadata(com.facebook.presto.metadata.Metadata) ComparisonExpression(com.facebook.presto.sql.tree.ComparisonExpression) NotExpression(com.facebook.presto.sql.tree.NotExpression) LogicalBinaryExpression(com.facebook.presto.sql.tree.LogicalBinaryExpression) InListExpression(com.facebook.presto.sql.tree.InListExpression) ComparisonExpression(com.facebook.presto.sql.tree.ComparisonExpression) Expression(com.facebook.presto.sql.tree.Expression) InListExpression(com.facebook.presto.sql.tree.InListExpression) NotExpression(com.facebook.presto.sql.tree.NotExpression) InPredicate(com.facebook.presto.sql.tree.InPredicate)

Example 2 with EQUAL

use of com.facebook.presto.sql.tree.ComparisonExpression.Operator.EQUAL in project presto by prestodb.

the class TestComparisonStatsCalculator method symbolToSymbolEqualStats.

@Test
public void symbolToSymbolEqualStats() {
    // z's stats should be unchanged when not involved, except NDV capping to row count
    // Equal ranges
    double rowCount = 2.7;
    assertCalculate(new ComparisonExpression(EQUAL, new SymbolReference("u"), new SymbolReference("w"))).outputRowsCount(rowCount).variableStats(new VariableReferenceExpression(Optional.empty(), "u", DOUBLE), equalTo(capNDV(zeroNullsFraction(uStats), rowCount))).variableStats(new VariableReferenceExpression(Optional.empty(), "w", DOUBLE), equalTo(capNDV(zeroNullsFraction(wStats), rowCount))).variableStats(new VariableReferenceExpression(Optional.empty(), "z", DOUBLE), equalTo(capNDV(zStats, rowCount)));
    // One symbol's range is within the other's
    rowCount = 9.375;
    assertCalculate(new ComparisonExpression(EQUAL, new SymbolReference("x"), new SymbolReference("y"))).outputRowsCount(rowCount).variableStats(new VariableReferenceExpression(Optional.empty(), "x", DOUBLE), symbolAssert -> {
        symbolAssert.averageRowSize(4).lowValue(0).highValue(5).distinctValuesCount(9.375).nullsFraction(0);
    }).variableStats(new VariableReferenceExpression(Optional.empty(), "y", DOUBLE), symbolAssert -> {
        symbolAssert.averageRowSize(4).lowValue(0).highValue(5).distinctValuesCount(9.375).nullsFraction(0);
    }).variableStats(new VariableReferenceExpression(Optional.empty(), "z", DOUBLE), equalTo(capNDV(zStats, rowCount)));
    // Partially overlapping ranges
    rowCount = 16.875;
    assertCalculate(new ComparisonExpression(EQUAL, new SymbolReference("x"), new SymbolReference("w"))).outputRowsCount(rowCount).variableStats(new VariableReferenceExpression(Optional.empty(), "x", DOUBLE), symbolAssert -> {
        symbolAssert.averageRowSize(6).lowValue(0).highValue(10).distinctValuesCount(16.875).nullsFraction(0);
    }).variableStats(new VariableReferenceExpression(Optional.empty(), "w", DOUBLE), symbolAssert -> {
        symbolAssert.averageRowSize(6).lowValue(0).highValue(10).distinctValuesCount(16.875).nullsFraction(0);
    }).variableStats(new VariableReferenceExpression(Optional.empty(), "z", DOUBLE), equalTo(capNDV(zStats, rowCount)));
    // None of the ranges is included in the other, and one symbol has much higher cardinality, so that it has bigger NDV in intersect than the other in total
    rowCount = 2.25;
    assertCalculate(new ComparisonExpression(EQUAL, new SymbolReference("x"), new SymbolReference("u"))).outputRowsCount(rowCount).variableStats(new VariableReferenceExpression(Optional.empty(), "x", DOUBLE), symbolAssert -> {
        symbolAssert.averageRowSize(6).lowValue(0).highValue(10).distinctValuesCount(2.25).nullsFraction(0);
    }).variableStats(new VariableReferenceExpression(Optional.empty(), "u", DOUBLE), symbolAssert -> {
        symbolAssert.averageRowSize(6).lowValue(0).highValue(10).distinctValuesCount(2.25).nullsFraction(0);
    }).variableStats(new VariableReferenceExpression(Optional.empty(), "z", DOUBLE), equalTo(capNDV(zStats, rowCount)));
}
Also used : POSITIVE_INFINITY(java.lang.Double.POSITIVE_INFINITY) StandardTypes(com.facebook.presto.common.type.StandardTypes) MetadataManager(com.facebook.presto.metadata.MetadataManager) VariableReferenceExpression(com.facebook.presto.spi.relation.VariableReferenceExpression) Test(org.testng.annotations.Test) NEGATIVE_INFINITY(java.lang.Double.NEGATIVE_INFINITY) ArrayList(java.util.ArrayList) LESS_THAN(com.facebook.presto.sql.tree.ComparisonExpression.Operator.LESS_THAN) StringLiteral(com.facebook.presto.sql.tree.StringLiteral) NOT_EQUAL(com.facebook.presto.sql.tree.ComparisonExpression.Operator.NOT_EQUAL) DoubleLiteral(com.facebook.presto.sql.tree.DoubleLiteral) ImmutableList(com.google.common.collect.ImmutableList) NaN(java.lang.Double.NaN) TypeProvider(com.facebook.presto.sql.planner.TypeProvider) Cast(com.facebook.presto.sql.tree.Cast) SymbolReference(com.facebook.presto.sql.tree.SymbolReference) DOUBLE(com.facebook.presto.common.type.DoubleType.DOUBLE) Session(com.facebook.presto.Session) BeforeClass(org.testng.annotations.BeforeClass) Collection(java.util.Collection) EQUAL(com.facebook.presto.sql.tree.ComparisonExpression.Operator.EQUAL) VarcharType(com.facebook.presto.common.type.VarcharType) TestingSession.testSessionBuilder(com.facebook.presto.testing.TestingSession.testSessionBuilder) Math.min(java.lang.Math.min) ComparisonExpression(com.facebook.presto.sql.tree.ComparisonExpression) String.format(java.lang.String.format) Collectors.joining(java.util.stream.Collectors.joining) Objects(java.util.Objects) Consumer(java.util.function.Consumer) List(java.util.List) Expression(com.facebook.presto.sql.tree.Expression) Double.isNaN(java.lang.Double.isNaN) GREATER_THAN(com.facebook.presto.sql.tree.ComparisonExpression.Operator.GREATER_THAN) LongLiteral(com.facebook.presto.sql.tree.LongLiteral) Optional(java.util.Optional) ComparisonExpression(com.facebook.presto.sql.tree.ComparisonExpression) SymbolReference(com.facebook.presto.sql.tree.SymbolReference) VariableReferenceExpression(com.facebook.presto.spi.relation.VariableReferenceExpression) Test(org.testng.annotations.Test)

Aggregations

Session (com.facebook.presto.Session)2 Cast (com.facebook.presto.sql.tree.Cast)2 ComparisonExpression (com.facebook.presto.sql.tree.ComparisonExpression)2 EQUAL (com.facebook.presto.sql.tree.ComparisonExpression.Operator.EQUAL)2 GREATER_THAN (com.facebook.presto.sql.tree.ComparisonExpression.Operator.GREATER_THAN)2 LESS_THAN (com.facebook.presto.sql.tree.ComparisonExpression.Operator.LESS_THAN)2 NOT_EQUAL (com.facebook.presto.sql.tree.ComparisonExpression.Operator.NOT_EQUAL)2 Expression (com.facebook.presto.sql.tree.Expression)2 SymbolReference (com.facebook.presto.sql.tree.SymbolReference)2 ImmutableList (com.google.common.collect.ImmutableList)2 ArrayList (java.util.ArrayList)2 List (java.util.List)2 Optional (java.util.Optional)2 Utils (com.facebook.presto.common.Utils)1 Block (com.facebook.presto.common.block.Block)1 DiscreteValues (com.facebook.presto.common.predicate.DiscreteValues)1 Domain (com.facebook.presto.common.predicate.Domain)1 Marker (com.facebook.presto.common.predicate.Marker)1 NullableValue (com.facebook.presto.common.predicate.NullableValue)1 Range (com.facebook.presto.common.predicate.Range)1