use of io.trino.sql.planner.plan.DynamicFilterId in project trino by trinodb.
the class TestRemoveUnsupportedDynamicFilters method testRemoveUnsupportedCast.
@Test
public void testRemoveUnsupportedCast() {
// Use lineitem with DOUBLE orderkey to simulate the case of implicit casts
// Dynamic filter is removed because there isn't an injective mapping from bigint -> double
Symbol lineitemDoubleOrderKeySymbol = builder.symbol("LINEITEM_DOUBLE_OK", DOUBLE);
PlanNode root = builder.output(ImmutableList.of(), ImmutableList.of(), builder.join(INNER, builder.filter(createDynamicFilterExpression(TEST_SESSION, metadata, new DynamicFilterId("DF"), BIGINT, expression("CAST(LINEITEM_DOUBLE_OK AS BIGINT)")), builder.tableScan(lineitemTableHandle, ImmutableList.of(lineitemDoubleOrderKeySymbol), ImmutableMap.of(lineitemDoubleOrderKeySymbol, new TpchColumnHandle("orderkey", DOUBLE)))), ordersTableScanNode, ImmutableList.of(new JoinNode.EquiJoinClause(lineitemDoubleOrderKeySymbol, ordersOrderKeySymbol)), ImmutableList.of(lineitemDoubleOrderKeySymbol), ImmutableList.of(ordersOrderKeySymbol), Optional.empty(), Optional.empty(), Optional.empty(), ImmutableMap.of(new DynamicFilterId("DF"), ordersOrderKeySymbol)));
assertPlan(removeUnsupportedDynamicFilters(root), output(join(INNER, ImmutableList.of(equiJoinClause("LINEITEM_DOUBLE_OK", "ORDERS_OK")), ImmutableMap.of(), tableScan("lineitem", ImmutableMap.of("LINEITEM_DOUBLE_OK", "orderkey")), tableScan("orders", ImmutableMap.of("ORDERS_OK", "orderkey")))));
}
use of io.trino.sql.planner.plan.DynamicFilterId in project trino by trinodb.
the class TestRemoveUnsupportedDynamicFilters method testUnconsumedDynamicFilterInSemiJoin.
@Test
public void testUnconsumedDynamicFilterInSemiJoin() {
PlanNode root = builder.semiJoin(builder.filter(expression("ORDERS_OK > 0"), ordersTableScanNode), lineitemTableScanNode, ordersOrderKeySymbol, lineitemOrderKeySymbol, new Symbol("SEMIJOIN_OUTPUT"), Optional.empty(), Optional.empty(), Optional.empty(), Optional.of(new DynamicFilterId("DF")));
assertPlan(removeUnsupportedDynamicFilters(root), semiJoin("ORDERS_OK", "LINEITEM_OK", "SEMIJOIN_OUTPUT", false, filter(expression("ORDERS_OK > 0"), tableScan("orders", ImmutableMap.of("ORDERS_OK", "orderkey"))), tableScan("lineitem", ImmutableMap.of("LINEITEM_OK", "orderkey"))));
}
use of io.trino.sql.planner.plan.DynamicFilterId in project trino by trinodb.
the class TestDynamicFiltersChecker method testUnconsumedDynamicFilterInSemiJoin.
@Test
public void testUnconsumedDynamicFilterInSemiJoin() {
PlanNode root = builder.semiJoin(builder.filter(expression("ORDERS_OK > 0"), ordersTableScanNode), lineitemTableScanNode, ordersOrderKeySymbol, lineitemOrderKeySymbol, new Symbol("SEMIJOIN_OUTPUT"), Optional.empty(), Optional.empty(), Optional.empty(), Optional.of(new DynamicFilterId("DF")));
assertThatThrownBy(() -> validatePlan(root)).isInstanceOf(VerifyException.class).hasMessage("The dynamic filter DF present in semi-join was not consumed by it's source side.");
}
use of io.trino.sql.planner.plan.DynamicFilterId in project trino by trinodb.
the class TestDynamicFiltersChecker method testUnconsumedDynamicFilterInJoin.
@Test
public void testUnconsumedDynamicFilterInJoin() {
PlanNode root = builder.join(INNER, builder.filter(expression("ORDERS_OK > 0"), ordersTableScanNode), lineitemTableScanNode, ImmutableList.of(new JoinNode.EquiJoinClause(ordersOrderKeySymbol, lineitemOrderKeySymbol)), ImmutableList.of(ordersOrderKeySymbol), ImmutableList.of(), Optional.empty(), Optional.empty(), Optional.empty(), ImmutableMap.of(new DynamicFilterId("DF"), lineitemOrderKeySymbol));
assertThatThrownBy(() -> validatePlan(root)).isInstanceOf(VerifyException.class).hasMessageMatching("Dynamic filters \\[DF\\] present in join were not fully consumed by it's probe side.");
}
use of io.trino.sql.planner.plan.DynamicFilterId in project trino by trinodb.
the class TestDynamicFiltersChecker method testDynamicFilterConsumedOnFilteringSourceSideInSemiJoin.
@Test
public void testDynamicFilterConsumedOnFilteringSourceSideInSemiJoin() {
PlanNode root = builder.semiJoin(builder.filter(combineConjuncts(metadata, expression("ORDERS_OK > 0"), createDynamicFilterExpression(TEST_SESSION, metadata, new DynamicFilterId("DF"), BIGINT, lineitemOrderKeySymbol.toSymbolReference())), ordersTableScanNode), builder.filter(combineConjuncts(metadata, expression("LINEITEM_OK > 0"), createDynamicFilterExpression(TEST_SESSION, metadata, new DynamicFilterId("DF"), BIGINT, lineitemOrderKeySymbol.toSymbolReference())), lineitemTableScanNode), ordersOrderKeySymbol, lineitemOrderKeySymbol, new Symbol("SEMIJOIN_OUTPUT"), Optional.empty(), Optional.empty(), Optional.empty(), Optional.of(new DynamicFilterId("DF")));
assertThatThrownBy(() -> validatePlan(root)).isInstanceOf(VerifyException.class).hasMessage("The dynamic filter DF present in semi-join was consumed by it's filtering source side.");
}
Aggregations