gortiz commented on code in PR #13966:
URL: https://github.com/apache/pinot/pull/13966#discussion_r1751609385
##########
pinot-query-planner/src/main/java/org/apache/pinot/calcite/rel/rules/PinotJoinExchangeNodeInsertRule.java:
##########
@@ -56,27 +63,49 @@ public boolean matches(RelOptRuleCall call) {
@Override
public void onMatch(RelOptRuleCall call) {
Join join = call.rel(0);
- RelNode leftInput = join.getInput(0);
- RelNode rightInput = join.getInput(1);
-
- RelNode leftExchange;
- RelNode rightExchange;
+ RelNode leftInput = PinotRuleUtils.unboxRel(join.getInput(0));
+ RelNode rightInput = PinotRuleUtils.unboxRel(join.getInput(1));
JoinInfo joinInfo = join.analyzeCondition();
+ String joinStrategy =
PinotHintStrategyTable.getHintOption(join.getHints(),
PinotHintOptions.JOIN_HINT_OPTIONS,
+ PinotHintOptions.JoinHintOptions.JOIN_STRATEGY);
- if (joinInfo.leftKeys.isEmpty()) {
- // when there's no JOIN key, use broadcast.
- leftExchange = PinotLogicalExchange.create(leftInput,
RelDistributions.RANDOM_DISTRIBUTED);
- rightExchange = PinotLogicalExchange.create(rightInput,
RelDistributions.BROADCAST_DISTRIBUTED);
+ RelNode newLeftInput;
+ RelNode newRightInput;
+ if
(PinotHintOptions.JoinHintOptions.LOOKUP_JOIN_STRATEGY.equals(joinStrategy)) {
+ // Lookup join
+ Preconditions.checkArgument(!joinInfo.leftKeys.isEmpty(), "Lookup join
requires join keys");
+ newLeftInput = PinotLogicalExchange.create(leftInput,
RelDistributions.hash(joinInfo.leftKeys));
+ // Right table should be a dimension table, and the right input should
be an identifier only ProjectNode over
+ // TableScanNode.
+ Preconditions.checkState(rightInput instanceof Project, "Right input for
lookup join must be a Project, got: %s",
+ rightInput.getClass().getSimpleName());
+ Project project = (Project) rightInput;
+ for (RexNode node : project.getProjects()) {
+ Preconditions.checkState(node instanceof RexInputRef,
+ "Right input for lookup join must be an identifier (RexInputRef)
only Project, got: %s in project",
+ node.getClass().getSimpleName());
+ }
+ RelNode projectInput = PinotRuleUtils.unboxRel(project.getInput());
+ Preconditions.checkState(projectInput instanceof TableScan,
+ "Right input for lookup join must be a Project over TableScan, got
Project over: %s",
+ projectInput.getClass().getSimpleName());
+ newRightInput = rightInput;
Review Comment:
Maybe not needed for this PR, but in the future I think we should need to
start moving logic to new rules. For example, we can have a rule that only
applies when the hint is enabled and the right hand side is a project and
(...all conditions). If the rule applies, we change the node to a DimJoin +
exchanges.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]