use of org.apache.druid.math.expr.Expr in project druid by druid-io.
the class JoinFilterAnalyzer method rewriteSelectorFilter.
/**
* Rewrites a selector filter on a join table into an IN filter on the base table.
*
* @param selectorFilter SelectorFilter to be rewritten
* @param joinFilterPreAnalysis The pre-analysis computed by {@link #computeJoinFilterPreAnalysis)}
* @param pushDownVirtualColumnsForLhsExprs See comments on {@link #analyzeJoinFilterClause}
*
* @return A JoinFilterAnalysis that indicates how to handle the potentially rewritten filter
*/
private static JoinFilterAnalysis rewriteSelectorFilter(SelectorFilter selectorFilter, JoinFilterPreAnalysis joinFilterPreAnalysis, Map<Expr, VirtualColumn> pushDownVirtualColumnsForLhsExprs) {
List<Filter> newFilters = new ArrayList<>();
String filteringColumn = selectorFilter.getDimension();
String filteringValue = selectorFilter.getValue();
if (areSomeColumnsFromPostJoinVirtualColumns(joinFilterPreAnalysis.getPostJoinVirtualColumns(), selectorFilter.getRequiredColumns())) {
return JoinFilterAnalysis.createNoPushdownFilterAnalysis(selectorFilter);
}
if (!joinFilterPreAnalysis.getJoinableClauses().areSomeColumnsFromJoin(selectorFilter.getRequiredColumns())) {
return new JoinFilterAnalysis(false, selectorFilter, selectorFilter);
}
List<JoinFilterColumnCorrelationAnalysis> correlationAnalyses = joinFilterPreAnalysis.getCorrelationsByFilteringColumn().get(filteringColumn);
if (correlationAnalyses == null) {
return JoinFilterAnalysis.createNoPushdownFilterAnalysis(selectorFilter);
}
for (JoinFilterColumnCorrelationAnalysis correlationAnalysis : correlationAnalyses) {
if (correlationAnalysis.supportsPushDown()) {
Optional<Set<String>> correlatedValues = correlationAnalysis.getCorrelatedValuesMap().get(Pair.of(filteringColumn, filteringValue));
if (!correlatedValues.isPresent()) {
return JoinFilterAnalysis.createNoPushdownFilterAnalysis(selectorFilter);
}
Set<String> newFilterValues = correlatedValues.get();
// in nothing => match nothing
if (newFilterValues.isEmpty()) {
return new JoinFilterAnalysis(true, selectorFilter, FalseFilter.instance());
}
for (String correlatedBaseColumn : correlationAnalysis.getBaseColumns()) {
Filter rewrittenFilter = new InDimFilter(correlatedBaseColumn, newFilterValues).toFilter();
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 = new InDimFilter(pushDownVirtualColumn.getOutputName(), newFilterValues).toFilter();
newFilters.add(rewrittenFilter);
}
}
}
if (newFilters.isEmpty()) {
return JoinFilterAnalysis.createNoPushdownFilterAnalysis(selectorFilter);
}
return new JoinFilterAnalysis(true, selectorFilter, Filters.maybeAnd(newFilters).orElse(null));
}
use of org.apache.druid.math.expr.Expr in project druid by druid-io.
the class IPv4AddressParseExprMacroTest method testInvalidLongArgTooHigh.
@Test
public void testInvalidLongArgTooHigh() {
Expr tooHigh = ExprEval.ofLong(0x1_00_00_00_00L).toExpr();
Assert.assertEquals(NULL, eval(tooHigh));
}
use of org.apache.druid.math.expr.Expr in project druid by druid-io.
the class IPv4AddressParseExprMacroTest method testValidStringArgIPv6Mapped.
@Test
public void testValidStringArgIPv6Mapped() {
Expr ipv6Mapped = ExprEval.of("::ffff:192.168.0.1").toExpr();
Assert.assertEquals(NULL, eval(ipv6Mapped));
}
use of org.apache.druid.math.expr.Expr in project druid by druid-io.
the class IPv4AddressParseExprMacroTest method testInvalidArgType.
@Test
public void testInvalidArgType() {
Expr longArray = ExprEval.ofLongArray(new Long[] { 1L, 2L }).toExpr();
Assert.assertEquals(NULL, eval(longArray));
}
use of org.apache.druid.math.expr.Expr in project druid by druid-io.
the class IPv4AddressParseExprMacroTest method testValidLongArg.
@Test
public void testValidLongArg() {
long value = EXPECTED;
Expr valid = ExprEval.ofLong(value).toExpr();
Assert.assertEquals(value, eval(valid));
}
Aggregations