Search in sources :

Example 6 with Expr

use of org.apache.druid.math.expr.Expr in project druid by druid-io.

the class JoinFilterAnalyzer method splitFilter.

/**
 * @param joinFilterPreAnalysis The pre-analysis computed by {@link #computeJoinFilterPreAnalysis)}
 * @param baseFilter - Filter on base table that was specified in the query itself
 *
 * @return A JoinFilterSplit indicating what parts of the filter should be applied pre-join and post-join
 */
public static JoinFilterSplit splitFilter(JoinFilterPreAnalysis joinFilterPreAnalysis, @Nullable Filter baseFilter) {
    if (joinFilterPreAnalysis.getOriginalFilter() == null || !joinFilterPreAnalysis.isEnableFilterPushDown()) {
        return new JoinFilterSplit(baseFilter, joinFilterPreAnalysis.getOriginalFilter(), ImmutableSet.of());
    }
    // Pushdown filters, rewriting if necessary
    List<Filter> leftFilters = new ArrayList<>();
    List<Filter> rightFilters = new ArrayList<>();
    Map<Expr, VirtualColumn> pushDownVirtualColumnsForLhsExprs = new HashMap<>();
    if (null != baseFilter) {
        leftFilters.add(baseFilter);
    }
    for (Filter baseTableFilter : joinFilterPreAnalysis.getNormalizedBaseTableClauses()) {
        if (!Filters.filterMatchesNull(baseTableFilter)) {
            leftFilters.add(baseTableFilter);
        } else {
            rightFilters.add(baseTableFilter);
        }
    }
    for (Filter orClause : joinFilterPreAnalysis.getNormalizedJoinTableClauses()) {
        JoinFilterAnalysis joinFilterAnalysis = analyzeJoinFilterClause(orClause, joinFilterPreAnalysis, pushDownVirtualColumnsForLhsExprs);
        if (joinFilterAnalysis.isCanPushDown()) {
            // noinspection OptionalGetWithoutIsPresent isCanPushDown checks isPresent
            leftFilters.add(joinFilterAnalysis.getPushDownFilter().get());
        }
        if (joinFilterAnalysis.isRetainAfterJoin()) {
            rightFilters.add(joinFilterAnalysis.getOriginalFilter());
        }
    }
    return new JoinFilterSplit(Filters.maybeAnd(leftFilters).orElse(null), Filters.maybeAnd(rightFilters).orElse(null), new HashSet<>(pushDownVirtualColumnsForLhsExprs.values()));
}
Also used : Expr(org.apache.druid.math.expr.Expr) SelectorFilter(org.apache.druid.segment.filter.SelectorFilter) FalseFilter(org.apache.druid.segment.filter.FalseFilter) OrFilter(org.apache.druid.segment.filter.OrFilter) InDimFilter(org.apache.druid.query.filter.InDimFilter) Filter(org.apache.druid.query.filter.Filter) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) VirtualColumn(org.apache.druid.segment.VirtualColumn) ExpressionVirtualColumn(org.apache.druid.segment.virtual.ExpressionVirtualColumn)

Example 7 with Expr

use of org.apache.druid.math.expr.Expr in project druid by druid-io.

the class JoinFilterAnalyzer method rewriteFilterDirect.

private static JoinFilterAnalysis rewriteFilterDirect(Filter filterClause, JoinFilterPreAnalysis joinFilterPreAnalysis, Map<Expr, VirtualColumn> pushDownVirtualColumnsForLhsExprs) {
    if (!filterClause.supportsRequiredColumnRewrite()) {
        return JoinFilterAnalysis.createNoPushdownFilterAnalysis(filterClause);
    }
    List<Filter> newFilters = new ArrayList<>();
    // we only support direct rewrites of filters that reference a single column
    String reqColumn = filterClause.getRequiredColumns().iterator().next();
    List<JoinFilterColumnCorrelationAnalysis> correlationAnalyses = joinFilterPreAnalysis.getCorrelationsByDirectFilteringColumn().get(reqColumn);
    if (correlationAnalyses == null) {
        return JoinFilterAnalysis.createNoPushdownFilterAnalysis(filterClause);
    }
    for (JoinFilterColumnCorrelationAnalysis correlationAnalysis : correlationAnalyses) {
        if (correlationAnalysis.supportsPushDown()) {
            for (String correlatedBaseColumn : correlationAnalysis.getBaseColumns()) {
                Filter rewrittenFilter = filterClause.rewriteRequiredColumns(ImmutableMap.of(reqColumn, correlatedBaseColumn));
                newFilters.add(rewrittenFilter);
            }
            for (Expr correlatedBaseExpr : correlationAnalysis.getBaseExpressions()) {
                // We need to create a virtual column for the expressions when pushing down
                VirtualColumn pushDownVirtualColumn = pushDownVirtualColumnsForLhsExprs.computeIfAbsent(correlatedBaseExpr, (expr) -> {
                    String vcName = getCorrelatedBaseExprVirtualColumnName(pushDownVirtualColumnsForLhsExprs.size());
                    return new ExpressionVirtualColumn(vcName, correlatedBaseExpr, ColumnType.STRING);
                });
                Filter rewrittenFilter = filterClause.rewriteRequiredColumns(ImmutableMap.of(reqColumn, pushDownVirtualColumn.getOutputName()));
                newFilters.add(rewrittenFilter);
            }
        }
    }
    if (newFilters.isEmpty()) {
        return JoinFilterAnalysis.createNoPushdownFilterAnalysis(filterClause);
    }
    return new JoinFilterAnalysis(false, filterClause, Filters.maybeAnd(newFilters).orElse(null));
}
Also used : ExpressionVirtualColumn(org.apache.druid.segment.virtual.ExpressionVirtualColumn) Expr(org.apache.druid.math.expr.Expr) SelectorFilter(org.apache.druid.segment.filter.SelectorFilter) FalseFilter(org.apache.druid.segment.filter.FalseFilter) OrFilter(org.apache.druid.segment.filter.OrFilter) InDimFilter(org.apache.druid.query.filter.InDimFilter) Filter(org.apache.druid.query.filter.Filter) ArrayList(java.util.ArrayList) VirtualColumn(org.apache.druid.segment.VirtualColumn) ExpressionVirtualColumn(org.apache.druid.segment.virtual.ExpressionVirtualColumn)

Example 8 with Expr

use of org.apache.druid.math.expr.Expr in project druid by druid-io.

the class ExprMacroTest method assertExpr.

private void assertExpr(final String expression, final Object expectedResult) {
    final Expr expr = Parser.parse(expression, TestExprMacroTable.INSTANCE);
    Assert.assertEquals(expression, expectedResult, expr.eval(BINDINGS).value());
    final Expr exprNotFlattened = Parser.parse(expression, TestExprMacroTable.INSTANCE, false);
    final Expr roundTripNotFlattened = Parser.parse(exprNotFlattened.stringify(), TestExprMacroTable.INSTANCE);
    Assert.assertEquals(exprNotFlattened.stringify(), expectedResult, roundTripNotFlattened.eval(BINDINGS).value());
    final Expr roundTrip = Parser.parse(expr.stringify(), TestExprMacroTable.INSTANCE);
    Assert.assertEquals(exprNotFlattened.stringify(), expectedResult, roundTrip.eval(BINDINGS).value());
}
Also used : Expr(org.apache.druid.math.expr.Expr)

Example 9 with Expr

use of org.apache.druid.math.expr.Expr in project druid by druid-io.

the class IPv4AddressParseExprMacroTest method testInvalidStringArgIPv6Compatible.

@Test
public void testInvalidStringArgIPv6Compatible() {
    Expr ipv6Compatible = ExprEval.of("::192.168.0.1").toExpr();
    Assert.assertEquals(NULL, eval(ipv6Compatible));
}
Also used : Expr(org.apache.druid.math.expr.Expr) Test(org.junit.Test)

Example 10 with Expr

use of org.apache.druid.math.expr.Expr in project druid by druid-io.

the class IPv4AddressParseExprMacroTest method testInvalidLongArgTooLow.

@Test
public void testInvalidLongArgTooLow() {
    Expr tooLow = ExprEval.ofLong(-1L).toExpr();
    Assert.assertEquals(NULL, eval(tooLow));
}
Also used : Expr(org.apache.druid.math.expr.Expr) Test(org.junit.Test)

Aggregations

Expr (org.apache.druid.math.expr.Expr)104 Test (org.junit.Test)58 ExprEval (org.apache.druid.math.expr.ExprEval)18 InitializedNullHandlingTest (org.apache.druid.testing.InitializedNullHandlingTest)17 IAE (org.apache.druid.java.util.common.IAE)14 ExpressionType (org.apache.druid.math.expr.ExpressionType)8 DruidExpression (org.apache.druid.sql.calcite.expression.DruidExpression)7 ArrayList (java.util.ArrayList)6 Nullable (javax.annotation.Nullable)6 HashSet (java.util.HashSet)5 List (java.util.List)4 HyperLogLogCollector (org.apache.druid.hll.HyperLogLogCollector)4 BloomKFilter (org.apache.druid.query.filter.BloomKFilter)4 InDimFilter (org.apache.druid.query.filter.InDimFilter)4 RexNode (org.apache.calcite.rex.RexNode)3 Filter (org.apache.druid.query.filter.Filter)3 VirtualColumn (org.apache.druid.segment.VirtualColumn)3 FalseFilter (org.apache.druid.segment.filter.FalseFilter)3 OrFilter (org.apache.druid.segment.filter.OrFilter)3 SelectorFilter (org.apache.druid.segment.filter.SelectorFilter)3