use of io.trino.sql.planner.assertions.MatchResult.NO_MATCH in project trino by trinodb.
the class PatternRecognitionMatcher 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());
PatternRecognitionNode patternRecognitionNode = (PatternRecognitionNode) node;
boolean specificationMatches = specification.map(expected -> expected.getExpectedValue(symbolAliases).equals(patternRecognitionNode.getSpecification())).orElse(true);
if (!specificationMatches) {
return NO_MATCH;
}
if (frame.isPresent()) {
if (patternRecognitionNode.getCommonBaseFrame().isEmpty()) {
return NO_MATCH;
}
if (!frame.get().getExpectedValue(symbolAliases).equals(patternRecognitionNode.getCommonBaseFrame().get())) {
return NO_MATCH;
}
}
if (rowsPerMatch != patternRecognitionNode.getRowsPerMatch()) {
return NO_MATCH;
}
if (!skipToLabel.equals(patternRecognitionNode.getSkipToLabel())) {
return NO_MATCH;
}
if (skipToPosition != patternRecognitionNode.getSkipToPosition()) {
return NO_MATCH;
}
if (initial != patternRecognitionNode.isInitial()) {
return NO_MATCH;
}
if (!pattern.equals(patternRecognitionNode.getPattern())) {
return NO_MATCH;
}
if (!subsets.equals(patternRecognitionNode.getSubsets())) {
return NO_MATCH;
}
if (variableDefinitions.size() != patternRecognitionNode.getVariableDefinitions().size()) {
return NO_MATCH;
}
for (Map.Entry<IrLabel, ExpressionAndValuePointers> entry : variableDefinitions.entrySet()) {
IrLabel name = entry.getKey();
ExpressionAndValuePointers actual = patternRecognitionNode.getVariableDefinitions().get(name);
if (actual == null) {
return NO_MATCH;
}
ExpressionAndValuePointers expected = entry.getValue();
ExpressionVerifier verifier = new ExpressionVerifier(symbolAliases);
if (!ExpressionAndValuePointersEquivalence.equivalent(actual, expected, (actualSymbol, expectedSymbol) -> verifier.process(actualSymbol.toSymbolReference(), expectedSymbol.toSymbolReference()))) {
return NO_MATCH;
}
}
return match();
}
use of io.trino.sql.planner.assertions.MatchResult.NO_MATCH in project trino by trinodb.
the class SemiJoinMatcher 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());
SemiJoinNode semiJoinNode = (SemiJoinNode) node;
if (!(symbolAliases.get(sourceSymbolAlias).equals(semiJoinNode.getSourceJoinSymbol().toSymbolReference()) && symbolAliases.get(filteringSymbolAlias).equals(semiJoinNode.getFilteringSourceJoinSymbol().toSymbolReference()))) {
return NO_MATCH;
}
if (distributionType.isPresent() && !distributionType.equals(semiJoinNode.getDistributionType())) {
return NO_MATCH;
}
if (hasDynamicFilter.isPresent()) {
if (hasDynamicFilter.get()) {
if (semiJoinNode.getDynamicFilterId().isEmpty()) {
return NO_MATCH;
}
DynamicFilterId dynamicFilterId = semiJoinNode.getDynamicFilterId().get();
List<DynamicFilters.Descriptor> matchingDescriptors = searchFrom(semiJoinNode.getSource()).where(FilterNode.class::isInstance).findAll().stream().flatMap(filterNode -> extractExpressions(filterNode).stream()).flatMap(expression -> extractDynamicFilters(expression).getDynamicConjuncts().stream()).filter(descriptor -> descriptor.getId().equals(dynamicFilterId)).collect(toImmutableList());
boolean sourceSymbolsMatch = matchingDescriptors.stream().map(descriptor -> Symbol.from(descriptor.getInput())).allMatch(sourceSymbol -> symbolAliases.get(sourceSymbolAlias).equals(sourceSymbol.toSymbolReference()));
if (!matchingDescriptors.isEmpty() && sourceSymbolsMatch) {
return match(outputAlias, semiJoinNode.getSemiJoinOutput().toSymbolReference());
}
return NO_MATCH;
}
if (semiJoinNode.getDynamicFilterId().isPresent()) {
return NO_MATCH;
}
}
return match(outputAlias, semiJoinNode.getSemiJoinOutput().toSymbolReference());
}
use of io.trino.sql.planner.assertions.MatchResult.NO_MATCH in project trino by trinodb.
the class TableWriterMatcher 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());
TableWriterNode tableWriterNode = (TableWriterNode) node;
if (!tableWriterNode.getColumnNames().equals(columnNames)) {
return NO_MATCH;
}
if (!columns.stream().map(s -> Symbol.from(symbolAliases.get(s))).collect(toImmutableList()).equals(tableWriterNode.getColumns())) {
return NO_MATCH;
}
return match();
}
use of io.trino.sql.planner.assertions.MatchResult.NO_MATCH in project trino by trinodb.
the class AggregationMatcher 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());
AggregationNode aggregationNode = (AggregationNode) node;
if (groupId.isPresent() != aggregationNode.getGroupIdSymbol().isPresent()) {
return NO_MATCH;
}
if (!matches(groupingSets.getGroupingKeys(), aggregationNode.getGroupingKeys(), symbolAliases)) {
return NO_MATCH;
}
if (groupingSets.getGroupingSetCount() != aggregationNode.getGroupingSetCount()) {
return NO_MATCH;
}
if (!groupingSets.getGlobalGroupingSets().equals(aggregationNode.getGlobalGroupingSets())) {
return NO_MATCH;
}
Set<Symbol> actualMasks = aggregationNode.getAggregations().values().stream().filter(aggregation -> aggregation.getMask().isPresent()).map(aggregation -> aggregation.getMask().get()).collect(toImmutableSet());
Set<Symbol> expectedMasks = masks.stream().map(name -> new Symbol(symbolAliases.get(name).getName())).collect(toImmutableSet());
if (!actualMasks.equals(expectedMasks)) {
return NO_MATCH;
}
if (step != aggregationNode.getStep()) {
return NO_MATCH;
}
if (!matches(preGroupedSymbols, aggregationNode.getPreGroupedSymbols(), symbolAliases)) {
return NO_MATCH;
}
if (!preGroupedSymbols.isEmpty() && !aggregationNode.isStreamable()) {
return NO_MATCH;
}
return match();
}
use of io.trino.sql.planner.assertions.MatchResult.NO_MATCH in project trino by trinodb.
the class WindowMatcher 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());
WindowNode windowNode = (WindowNode) node;
if (!prePartitionedInputs.map(expectedInputs -> expectedInputs.stream().map(alias -> alias.toSymbol(symbolAliases)).collect(toImmutableSet()).equals(windowNode.getPrePartitionedInputs())).orElse(true)) {
return NO_MATCH;
}
if (!specification.map(expectedSpecification -> expectedSpecification.getExpectedValue(symbolAliases).equals(windowNode.getSpecification())).orElse(true)) {
return NO_MATCH;
}
if (!preSortedOrderPrefix.map(Integer.valueOf(windowNode.getPreSortedOrderPrefix())::equals).orElse(true)) {
return NO_MATCH;
}
if (!hashSymbol.map(expectedHashSymbol -> expectedHashSymbol.map(alias -> alias.toSymbol(symbolAliases)).equals(windowNode.getHashSymbol())).orElse(true)) {
return NO_MATCH;
}
/*
* Window functions produce a symbol (the result of the function call) that we might
* want to bind to an alias so we can reference it further up the tree. As such,
* they need to be matched with an Alias matcher so we can bind the symbol if desired.
*/
return match();
}
Aggregations