This is an automated email from the ASF dual-hosted git repository.
apurtell pushed a commit to branch PHOENIX-7876-feature
in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/PHOENIX-7876-feature by this
push:
new be046f9e7d PHOENIX-7922 Consolidate the EXPLAIN rewrite pass entry
points (#2529)
be046f9e7d is described below
commit be046f9e7dbcb37c5d0d44b172def39011e5d53a
Author: Andrew Purtell <[email protected]>
AuthorDate: Sat Jun 13 21:59:23 2026 -0700
PHOENIX-7922 Consolidate the EXPLAIN rewrite pass entry points (#2529)
Co-authored-by: Claude Opus 4.8[1m] <[email protected]>
---
.../java/org/apache/phoenix/compile/DeleteCompiler.java | 4 +---
.../java/org/apache/phoenix/compile/QueryCompiler.java | 6 +-----
.../org/apache/phoenix/compile/StatementContext.java | 17 +++++++++++++++++
.../org/apache/phoenix/compile/SubqueryRewriter.java | 10 ----------
.../org/apache/phoenix/compile/SubselectRewriter.java | 5 -----
.../java/org/apache/phoenix/compile/UpsertCompiler.java | 4 +---
.../java/org/apache/phoenix/jdbc/PhoenixStatement.java | 6 +-----
.../src/test/java/org/apache/phoenix/util/TestUtil.java | 9 ++++++---
8 files changed, 27 insertions(+), 34 deletions(-)
diff --git
a/phoenix-core-client/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java
b/phoenix-core-client/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java
index 0ca150ef21..a727a0280d 100644
---
a/phoenix-core-client/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java
+++
b/phoenix-core-client/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java
@@ -598,9 +598,7 @@ public class DeleteCompiler {
select = StatementNormalizer.normalize(select, resolverToBe);
// Pre-build a context so the early rewrite pass records top of plan
breadcrumbs that are
// adopted by the DELETE data query plan's compilation context.
- StatementContext rewriteContext =
- new StatementContext(statement, FromCompiler.EMPTY_TABLE_RESOLVER,
- new BindManager(statement.getParameters()), new Scan(), new
SequenceManager(statement));
+ StatementContext rewriteContext = StatementContext.forRewrite(statement);
SelectStatement transformedSelect =
SubqueryRewriter.transform(select, resolverToBe, connection,
rewriteContext);
boolean hasPreProcessing = transformedSelect != select;
diff --git
a/phoenix-core-client/src/main/java/org/apache/phoenix/compile/QueryCompiler.java
b/phoenix-core-client/src/main/java/org/apache/phoenix/compile/QueryCompiler.java
index 5ba9ec29f1..6d38fb51bb 100644
---
a/phoenix-core-client/src/main/java/org/apache/phoenix/compile/QueryCompiler.java
+++
b/phoenix-core-client/src/main/java/org/apache/phoenix/compile/QueryCompiler.java
@@ -724,11 +724,7 @@ public class QueryCompiler {
protected QueryPlan compileSubquery(SelectStatement subquerySelectStatement,
boolean pushDownMaxRows, StatementContext parentContext) throws
SQLException {
- // Pre-build a context so the subquery's early rewrite pass records
breadcrumbs that are then
- // adopted by the subquery's compilation context.
- StatementContext rewriteContext =
- new StatementContext(this.statement, FromCompiler.EMPTY_TABLE_RESOLVER,
bindManager,
- new Scan(), new SequenceManager(this.statement));
+ StatementContext rewriteContext =
StatementContext.forRewrite(this.statement, bindManager);
RewriteResult rewriteResult =
ParseNodeUtil.rewrite(subquerySelectStatement, rewriteContext);
int maxRows = this.statement.getMaxRows();
// overwrite maxRows to avoid its impact on inner queries.
diff --git
a/phoenix-core-client/src/main/java/org/apache/phoenix/compile/StatementContext.java
b/phoenix-core-client/src/main/java/org/apache/phoenix/compile/StatementContext.java
index 1ae12afac5..abe3d446b3 100644
---
a/phoenix-core-client/src/main/java/org/apache/phoenix/compile/StatementContext.java
+++
b/phoenix-core-client/src/main/java/org/apache/phoenix/compile/StatementContext.java
@@ -125,6 +125,23 @@ public class StatementContext {
this(statement, new Scan());
}
+ /**
+ * Build a top-level {@link StatementContext} suitable for the early
+ * {@link SubselectRewriter}/{@link SubqueryRewriter} rewrite pass,
accumulating rewrite
+ * breadcrumbs.
+ */
+ public static StatementContext forRewrite(PhoenixStatement statement) {
+ return forRewrite(statement, new BindManager(statement.getParameters()));
+ }
+
+ /**
+ * Variant of {@link #forRewrite(PhoenixStatement)} that reuses an existing
{@link BindManager}.
+ */
+ public static StatementContext forRewrite(PhoenixStatement statement,
BindManager bindManager) {
+ return new StatementContext(statement, FromCompiler.EMPTY_TABLE_RESOLVER,
bindManager,
+ new Scan(), new SequenceManager(statement));
+ }
+
public StatementContext(StatementContext context) {
this.resolver = context.resolver;
this.connection = context.connection;
diff --git
a/phoenix-core-client/src/main/java/org/apache/phoenix/compile/SubqueryRewriter.java
b/phoenix-core-client/src/main/java/org/apache/phoenix/compile/SubqueryRewriter.java
index b5fd3bcde4..fbeb389f43 100644
---
a/phoenix-core-client/src/main/java/org/apache/phoenix/compile/SubqueryRewriter.java
+++
b/phoenix-core-client/src/main/java/org/apache/phoenix/compile/SubqueryRewriter.java
@@ -73,11 +73,6 @@ public class SubqueryRewriter extends ParseNodeRewriter {
private TableNode tableNode;
private ParseNode topNode;
- public static SelectStatement transform(SelectStatement select,
ColumnResolver resolver,
- PhoenixConnection connection) throws SQLException {
- return transform(select, resolver, connection, null);
- }
-
public static SelectStatement transform(SelectStatement select,
ColumnResolver resolver,
PhoenixConnection connection, StatementContext context) throws
SQLException {
ParseNode where = select.getWhere();
@@ -90,11 +85,6 @@ public class SubqueryRewriter extends ParseNodeRewriter {
return NODE_FACTORY.select(select, rewriter.tableNode, normWhere);
}
- protected SubqueryRewriter(SelectStatement select, ColumnResolver resolver,
- PhoenixConnection connection) {
- this(select, resolver, connection, null);
- }
-
protected SubqueryRewriter(SelectStatement select, ColumnResolver resolver,
PhoenixConnection connection, StatementContext context) {
this.columnResolver = resolver;
diff --git
a/phoenix-core-client/src/main/java/org/apache/phoenix/compile/SubselectRewriter.java
b/phoenix-core-client/src/main/java/org/apache/phoenix/compile/SubselectRewriter.java
index 032370d2ad..af56113125 100644
---
a/phoenix-core-client/src/main/java/org/apache/phoenix/compile/SubselectRewriter.java
+++
b/phoenix-core-client/src/main/java/org/apache/phoenix/compile/SubselectRewriter.java
@@ -298,11 +298,6 @@ public class SubselectRewriter extends ParseNodeRewriter {
newSelectAliasedNodes);
}
- public static SelectStatement flatten(SelectStatement select,
PhoenixConnection connection)
- throws SQLException {
- return flatten(select, connection, null);
- }
-
public static SelectStatement flatten(SelectStatement select,
PhoenixConnection connection,
StatementContext context) throws SQLException {
TableNode from = select.getFrom();
diff --git
a/phoenix-core-client/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java
b/phoenix-core-client/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java
index 25b182b546..fa06c95a82 100644
---
a/phoenix-core-client/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java
+++
b/phoenix-core-client/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java
@@ -583,9 +583,7 @@ public class UpsertCompiler {
assert (select != null);
// Pre-build a context so the early rewrite pass records top-of-plan
breadcrumbs that are
// adopted by the UPSERT SELECT query plan's compilation context.
- StatementContext rewriteContext =
- new StatementContext(statement, FromCompiler.EMPTY_TABLE_RESOLVER,
- new BindManager(statement.getParameters()), new Scan(), new
SequenceManager(statement));
+ StatementContext rewriteContext = StatementContext.forRewrite(statement);
select = SubselectRewriter.flatten(select, connection, rewriteContext);
ColumnResolver selectResolver =
FromCompiler.getResolverForQuery(select, connection, false,
upsert.getTable().getName());
diff --git
a/phoenix-core-client/src/main/java/org/apache/phoenix/jdbc/PhoenixStatement.java
b/phoenix-core-client/src/main/java/org/apache/phoenix/jdbc/PhoenixStatement.java
index b064bd78d7..ba808630fd 100644
---
a/phoenix-core-client/src/main/java/org/apache/phoenix/jdbc/PhoenixStatement.java
+++
b/phoenix-core-client/src/main/java/org/apache/phoenix/jdbc/PhoenixStatement.java
@@ -80,7 +80,6 @@ import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Pair;
import org.apache.phoenix.call.CallRunner;
import org.apache.phoenix.compile.BaseMutationPlan;
-import org.apache.phoenix.compile.BindManager;
import org.apache.phoenix.compile.CloseStatementCompiler;
import org.apache.phoenix.compile.ColumnProjector;
import org.apache.phoenix.compile.CreateFunctionCompiler;
@@ -95,7 +94,6 @@ import org.apache.phoenix.compile.ExplainJsonRenderer;
import org.apache.phoenix.compile.ExplainPlan;
import org.apache.phoenix.compile.ExplainPlanAttributes;
import org.apache.phoenix.compile.ExpressionProjector;
-import org.apache.phoenix.compile.FromCompiler;
import org.apache.phoenix.compile.GroupByCompiler.GroupBy;
import org.apache.phoenix.compile.ListJarsQueryPlan;
import org.apache.phoenix.compile.MutationPlan;
@@ -867,9 +865,7 @@ public class PhoenixStatement implements
PhoenixMonitoredStatement, SQLCloseable
// Pre-build the top-level StatementContext so the early
SubselectRewriter/SubqueryRewriter
// pass can record top of plan rewrite breadcrumbs onto it. The same
accumulator is then
// adopted by the compilation context via
QueryCompiler.withRewriteContext.
- StatementContext rewriteContext = new StatementContext(phoenixStatement,
- FromCompiler.EMPTY_TABLE_RESOLVER, new
BindManager(phoenixStatement.getParameters()),
- new Scan(), new SequenceManager(phoenixStatement));
+ StatementContext rewriteContext =
StatementContext.forRewrite(phoenixStatement);
RewriteResult rewriteResult = ParseNodeUtil.rewrite(this,
rewriteContext);
QueryPlan queryPlan = new QueryCompiler(phoenixStatement,
rewriteResult.getRewrittenSelectStatement(),
rewriteResult.getColumnResolver(),
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java
b/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java
index 69a191b5c2..2b7a37ddf0 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java
@@ -1445,15 +1445,18 @@ public class TestUtil {
public static JoinTable getJoinTable(String query, PhoenixConnection
connection)
throws SQLException {
SQLParser parser = new SQLParser(query);
- SelectStatement select = SubselectRewriter.flatten(parser.parseQuery(),
connection);
+ PhoenixStatement stmt =
connection.createStatement().unwrap(PhoenixStatement.class);
+ StatementContext rewriteContext = StatementContext.forRewrite(stmt);
+ SelectStatement select =
+ SubselectRewriter.flatten(parser.parseQuery(), connection,
rewriteContext);
ColumnResolver resolver = FromCompiler.getResolverForQuery(select,
connection);
select = StatementNormalizer.normalize(select, resolver);
- SelectStatement transformedSelect = SubqueryRewriter.transform(select,
resolver, connection);
+ SelectStatement transformedSelect =
+ SubqueryRewriter.transform(select, resolver, connection, rewriteContext);
if (transformedSelect != select) {
resolver = FromCompiler.getResolverForQuery(transformedSelect,
connection);
select = StatementNormalizer.normalize(transformedSelect, resolver);
}
- PhoenixStatement stmt =
connection.createStatement().unwrap(PhoenixStatement.class);
return JoinCompiler.compile(stmt, select, resolver);
}