diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/approximation/Approximation.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/approximation/Approximation.java index 75a3f8aae9a8f..dee4c8939315c 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/approximation/Approximation.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/approximation/Approximation.java @@ -66,7 +66,7 @@ import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; import org.elasticsearch.xpack.esql.plan.logical.inference.Rerank; import org.elasticsearch.xpack.esql.plan.logical.join.InlineJoin; -import org.elasticsearch.xpack.esql.plan.logical.join.Join; +import org.elasticsearch.xpack.esql.plan.logical.join.LookupJoin; import org.elasticsearch.xpack.esql.plan.logical.join.StubRelation; import org.elasticsearch.xpack.esql.plan.logical.local.CopyingLocalSupplier; import org.elasticsearch.xpack.esql.plan.logical.local.LocalRelation; @@ -151,8 +151,8 @@ public record QueryProperties(boolean hasGrouping, boolean canDecreaseRowCount, Grok.class, InlineJoin.class, Insist.class, - Join.class, LocalRelation.class, + LookupJoin.class, MvExpand.class, OrderBy.class, Project.class, @@ -499,7 +499,7 @@ private LogicalPlan getLeftmostLeaf(LogicalPlan plan) { while (plan instanceof LeafPlan == false) { plan = switch (plan) { case UnaryPlan unaryPlan -> unaryPlan.child(); - case Join join -> join.left(); + case LookupJoin join -> join.left(); default -> throw new IllegalStateException("unsupported plan type: " + plan.getClass()); }; } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownJoinPastProject.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownJoinPastProject.java index cc6bf3a688748..48ac49970e605 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownJoinPastProject.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownJoinPastProject.java @@ -111,9 +111,7 @@ protected LogicalPlan rule(Join join) { List renamesForEval = new ArrayList<>(aliasesForReplacedAttributesBuilder.build().values()); Eval eval = new Eval(project.source(), project.child(), renamesForEval); - Join finalJoin = new Join(join.source(), eval, updatedJoin.right(), updatedJoin.config()); - - return new Project(project.source(), finalJoin, finalProjections); + return new Project(project.source(), updatedJoin.replaceLeft(eval), finalProjections); } return join; diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/join/LookupJoin.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/join/LookupJoin.java index 726c3752dfa7c..f871cbb306ba9 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/join/LookupJoin.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/join/LookupJoin.java @@ -17,7 +17,6 @@ import org.elasticsearch.xpack.esql.core.tree.Source; import org.elasticsearch.xpack.esql.plan.logical.Limit; import org.elasticsearch.xpack.esql.plan.logical.LogicalPlan; -import org.elasticsearch.xpack.esql.plan.logical.SurrogateLogicalPlan; import java.util.List; @@ -28,7 +27,7 @@ * Lookup join - specialized LEFT (OUTER) JOIN between the main left side and a lookup index (index_mode = lookup) on the right. * This is only used during parsing and substituted to a regular {@link Join} during analysis. */ -public class LookupJoin extends Join implements SurrogateLogicalPlan, TelemetryAware, PostAnalysisVerificationAware { +public class LookupJoin extends Join implements TelemetryAware, PostAnalysisVerificationAware { public LookupJoin( Source source, @@ -61,15 +60,6 @@ public LookupJoin(Source source, LogicalPlan left, LogicalPlan right, JoinConfig super(source, left, right, joinConfig, isRemote); } - /** - * Translate the expression into a regular join with a Projection on top, to deal with serialization & co. - */ - @Override - public LogicalPlan surrogate() { - // TODO: decide whether to introduce USING or just basic ON semantics - keep the ordering out for now - return new Join(source(), left(), right(), config(), isRemote()); - } - @Override public Join replaceChildren(LogicalPlan left, LogicalPlan right) { return new LookupJoin(source(), left, right, config(), isRemote());