use of io.prestosql.spi.plan.PlanNode in project hetu-core by openlookeng.
the class JoinMatcher method detailMatches.
@Override
public MatchResult detailMatches(PlanNode node, StatsProvider stats, Session session, Metadata metadata, SymbolAliases symbolAliases) {
checkState(shapeMatches(node), "Plan testing framework error: shapeMatches returned false in detailMatches in %s", this.getClass().getName());
JoinNode joinNode = (JoinNode) node;
if (joinNode.getCriteria().size() != equiCriteria.size()) {
return NO_MATCH;
}
if (filter.isPresent()) {
if (!joinNode.getFilter().isPresent()) {
return NO_MATCH;
}
RowExpression expression = joinNode.getFilter().get();
if (isExpression(expression)) {
if (!new ExpressionVerifier(symbolAliases).process(castToExpression(expression), filter.get())) {
return NO_MATCH;
}
} else {
if (!new RowExpressionVerifier(symbolAliases, metadata, session, node.getOutputSymbols()).process(filter.get(), expression)) {
return NO_MATCH;
}
}
} else {
if (joinNode.getFilter().isPresent()) {
return NO_MATCH;
}
}
if (distributionType.isPresent() && !distributionType.equals(joinNode.getDistributionType())) {
return NO_MATCH;
}
if (spillable.isPresent() && !spillable.equals(joinNode.isSpillable())) {
return NO_MATCH;
}
/*
* Have to use order-independent comparison; there are no guarantees what order
* the equi criteria will have after planning and optimizing.
*/
Set<JoinNode.EquiJoinClause> actual = ImmutableSet.copyOf(joinNode.getCriteria());
Set<JoinNode.EquiJoinClause> expected = equiCriteria.stream().map(maker -> maker.getExpectedValue(symbolAliases)).collect(toImmutableSet());
if (!expected.equals(actual)) {
return NO_MATCH;
}
if (dynamicFilter.isPresent() && !dynamicFilter.get().match(joinNode, symbolAliases).isMatch()) {
return NO_MATCH;
}
return MatchResult.match();
}
use of io.prestosql.spi.plan.PlanNode in project hetu-core by openlookeng.
the class TestPruneWindowColumns method buildProjectedWindow.
private static PlanNode buildProjectedWindow(PlanBuilder p, Predicate<Symbol> projectionFilter, Predicate<Symbol> sourceFilter) {
Symbol orderKey = p.symbol("orderKey");
Symbol partitionKey = p.symbol("partitionKey");
Symbol hash = p.symbol("hash");
Symbol startValue1 = p.symbol("startValue1");
Symbol startValue2 = p.symbol("startValue2");
Symbol endValue1 = p.symbol("endValue1");
Symbol endValue2 = p.symbol("endValue2");
Symbol input1 = p.symbol("input1");
Symbol input2 = p.symbol("input2");
Symbol unused = p.symbol("unused");
Symbol output1 = p.symbol("output1");
Symbol output2 = p.symbol("output2");
List<Symbol> inputs = ImmutableList.of(orderKey, partitionKey, hash, startValue1, startValue2, endValue1, endValue2, input1, input2, unused);
List<Symbol> outputs = ImmutableList.<Symbol>builder().addAll(inputs).add(output1, output2).build();
return p.project(Assignments.copyOf(outputs.stream().filter(projectionFilter).collect(Collectors.toMap(v -> v, v -> p.variable(v.getName(), BIGINT)))), p.window(new WindowNode.Specification(ImmutableList.of(partitionKey), Optional.of(new OrderingScheme(ImmutableList.of(orderKey), ImmutableMap.of(orderKey, SortOrder.ASC_NULLS_FIRST)))), ImmutableMap.of(output1, new WindowNode.Function(call(FUNCTION_NAME, FUNCTION_HANDLE, BIGINT, ImmutableList.of(p.variable(input1.getName()))), ImmutableList.of(p.variable(input1.getName())), new WindowNode.Frame(WindowFrameType.RANGE, UNBOUNDED_PRECEDING, Optional.of(startValue1), CURRENT_ROW, Optional.of(endValue1), Optional.of(startValue1.getName()), Optional.of(endValue2.getName()))), output2, new WindowNode.Function(call(FUNCTION_NAME, FUNCTION_HANDLE, BIGINT, ImmutableList.of(p.variable(input2.getName()))), ImmutableList.of(p.variable(input2.getName())), new WindowNode.Frame(WindowFrameType.RANGE, UNBOUNDED_PRECEDING, Optional.of(startValue2), CURRENT_ROW, Optional.of(endValue2), Optional.of(startValue2.getName()), Optional.of(endValue2.getName())))), hash, p.values(inputs.stream().filter(sourceFilter).collect(toImmutableList()), ImmutableList.of())));
}
use of io.prestosql.spi.plan.PlanNode in project hetu-core by openlookeng.
the class TestMemo method testInsertNode.
/*
From: X -> Z
To: X -> Y -> Z
*/
@Test
public void testInsertNode() {
PlanNode z = node();
PlanNode x = node(z);
Memo memo = new Memo(idAllocator, x);
assertEquals(memo.getGroupCount(), 2);
int zGroup = getChildGroup(memo, memo.getRootGroup());
PlanNode y = node(memo.getNode(zGroup));
memo.replace(zGroup, y, "rule");
assertEquals(memo.getGroupCount(), 3);
assertMatchesStructure(memo.extract(), node(x.getId(), node(y.getId(), node(z.getId()))));
}
use of io.prestosql.spi.plan.PlanNode in project hetu-core by openlookeng.
the class TestMemo method testMultipleReferences.
/*
From: X -> Y -> Z
To: X --> Y1' --> Z
\-> Y2' -/
*/
@Test
public void testMultipleReferences() {
PlanNode z = node();
PlanNode y = node(z);
PlanNode x = node(y);
Memo memo = new Memo(idAllocator, x);
assertEquals(memo.getGroupCount(), 3);
int yGroup = getChildGroup(memo, memo.getRootGroup());
PlanNode rewrittenZ = memo.getNode(yGroup).getSources().get(0);
PlanNode y1 = node(rewrittenZ);
PlanNode y2 = node(rewrittenZ);
PlanNode newX = node(y1, y2);
memo.replace(memo.getRootGroup(), newX, "rule");
assertEquals(memo.getGroupCount(), 4);
assertMatchesStructure(memo.extract(), node(newX.getId(), node(y1.getId(), node(z.getId())), node(y2.getId(), node(z.getId()))));
}
use of io.prestosql.spi.plan.PlanNode in project hetu-core by openlookeng.
the class TestMemo method getChildGroup.
private int getChildGroup(Memo memo, int group) {
PlanNode node = memo.getNode(group);
GroupReference child = (GroupReference) node.getSources().get(0);
return child.getGroupId();
}
Aggregations