This is an automated email from the ASF dual-hosted git repository. yanxinyi pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/master by this push: new 3ea9558 PHOENIX-5997 Phoenix Explain Plan for Deletes does not clearly differentiate between server side and client side paths. 3ea9558 is described below commit 3ea9558d2be3f85e41dd829691667e667e20be34 Author: Daniel Wong <daniel.w...@salesforce.com> AuthorDate: Thu Jul 9 17:46:34 2020 -0700 PHOENIX-5997 Phoenix Explain Plan for Deletes does not clearly differentiate between server side and client side paths. Signed-off-by: Xinyi Yan <yanxi...@apache.org> --- .../phoenix/end2end/CostBasedDecisionIT.java | 4 +- .../org/apache/phoenix/compile/DeleteCompiler.java | 4 +- .../apache/phoenix/query/ExplainPlanTextTest.java | 69 ++++++++++++++++++++++ 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CostBasedDecisionIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CostBasedDecisionIT.java index d4b3422..0c93889 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CostBasedDecisionIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CostBasedDecisionIT.java @@ -245,7 +245,7 @@ public class CostBasedDecisionIT extends BaseUniqueNamesOwnClusterIT { String query = "DELETE FROM " + tableName + " where c1 BETWEEN 10 AND 20 AND c2 < 9000 AND C3 < 5000"; // Use the idx2 plan with a wider PK slot span when stats are not available. verifyQueryPlan(query, - "DELETE ROWS\n" + + "DELETE ROWS CLIENT SELECT\n" + "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + tableName + " [2,*] - [2,9,000]\n" + " SERVER FILTER BY ((\"C1\" >= 10 AND \"C1\" <= 20) AND TO_INTEGER(\"C3\") < 5000)\n" + "CLIENT MERGE SORT"); @@ -263,7 +263,7 @@ public class CostBasedDecisionIT extends BaseUniqueNamesOwnClusterIT { // Use the idx2 plan that scans less data when stats become available. verifyQueryPlan(query, - "DELETE ROWS\n" + + "DELETE ROWS CLIENT SELECT\n" + "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + tableName + " [1,10] - [1,20]\n" + " SERVER FILTER BY (\"C2\" < 9000 AND \"C3\" < 5000)\n" + "CLIENT MERGE SORT"); diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java index 78b1531..aa14385 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java @@ -818,7 +818,7 @@ public class DeleteCompiler { public ExplainPlan getExplainPlan() throws SQLException { List<String> queryPlanSteps = aggPlan.getExplainPlan().getPlanSteps(); List<String> planSteps = Lists.newArrayListWithExpectedSize(queryPlanSteps.size()+1); - planSteps.add("DELETE ROWS"); + planSteps.add("DELETE ROWS SERVER SELECT"); planSteps.addAll(queryPlanSteps); return new ExplainPlan(planSteps); } @@ -954,7 +954,7 @@ public class DeleteCompiler { public ExplainPlan getExplainPlan() throws SQLException { List<String> queryPlanSteps = bestPlan.getExplainPlan().getPlanSteps(); List<String> planSteps = Lists.newArrayListWithExpectedSize(queryPlanSteps.size()+1); - planSteps.add("DELETE ROWS"); + planSteps.add("DELETE ROWS CLIENT SELECT"); planSteps.addAll(queryPlanSteps); return new ExplainPlan(planSteps); } diff --git a/phoenix-core/src/test/java/org/apache/phoenix/query/ExplainPlanTextTest.java b/phoenix-core/src/test/java/org/apache/phoenix/query/ExplainPlanTextTest.java new file mode 100644 index 0000000..828751f --- /dev/null +++ b/phoenix-core/src/test/java/org/apache/phoenix/query/ExplainPlanTextTest.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.phoenix.query; + +import org.apache.phoenix.util.PropertiesUtil; +import org.junit.Test; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import static org.apache.phoenix.query.QueryServices.AUTO_COMMIT_ATTRIB; +import static org.apache.phoenix.util.TestUtil.ATABLE_NAME; +import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES; +import static org.junit.Assert.assertEquals; + +public class ExplainPlanTextTest extends BaseConnectionlessQueryTest{ + + String defaultDeleteStatement = "DELETE FROM " + ATABLE_NAME + " WHERE entity_id='abc'"; + + @Test + public void explainDeleteClientTest() throws Exception { + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + List<String> plan = getExplain(defaultDeleteStatement, props); + assertEquals("DELETE ROWS CLIENT SELECT", plan.get(0)); + } + + @Test + public void explainDeleteServerTest() throws Exception { + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(AUTO_COMMIT_ATTRIB,"true"); //need autocommit for server today + List<String> plan = getExplain(defaultDeleteStatement, props); + assertEquals("DELETE ROWS SERVER SELECT", plan.get(0)); + } + + private List<String> getExplain(String query, Properties props) throws SQLException { + List<String> explainPlan = new ArrayList<>(); + try(Connection conn = DriverManager.getConnection(getUrl(), props); + PreparedStatement statement = conn.prepareStatement("EXPLAIN " + query); + ResultSet rs = statement.executeQuery()) { + while(rs.next()) { + String plan = rs.getString(1); + explainPlan.add(plan); + } + } + return explainPlan; + } +} +