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;
+    }
+}
+

Reply via email to