PHOENIX-4790 Simplify check for client side delete

Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/48b5fe61
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/48b5fe61
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/48b5fe61

Branch: refs/heads/4.14-cdh5.14
Commit: 48b5fe616baa7850ffef356a870509da90d1500f
Parents: 8730fa9
Author: James Taylor <jamestay...@apache.org>
Authored: Tue Jun 19 15:33:21 2018 +0100
Committer: Pedro Boado <pbo...@apache.org>
Committed: Wed Oct 17 20:42:05 2018 +0100

----------------------------------------------------------------------
 .../apache/phoenix/compile/DeleteCompiler.java  | 24 ++++----------------
 1 file changed, 5 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/48b5fe61/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java
----------------------------------------------------------------------
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 5f9c76c..78b2db9 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
@@ -46,7 +46,6 @@ import org.apache.phoenix.execute.AggregatePlan;
 import org.apache.phoenix.execute.MutationState;
 import org.apache.phoenix.execute.MutationState.MultiRowMutationState;
 import org.apache.phoenix.execute.MutationState.RowMutationState;
-import org.apache.phoenix.filter.SkipScanFilter;
 import org.apache.phoenix.hbase.index.ValueGetter;
 import org.apache.phoenix.hbase.index.covered.update.ColumnReference;
 import org.apache.phoenix.hbase.index.util.ImmutableBytesPtr;
@@ -481,6 +480,7 @@ public class DeleteCompiler {
             projectedColumns.add(column);
             aliasedNodes.add(FACTORY.aliasedNode(null, FACTORY.column(null, 
'"' + column.getName().getString() + '"', null)));
         }
+        boolean noQueryReqd = true;
         // Project all non PK indexed columns so that we can do the proper 
index maintenance
         for (PTable index : table.getIndexes()) {
             IndexMaintainer maintainer = index.getIndexMaintainer(table, 
connection);
@@ -492,6 +492,8 @@ public class DeleteCompiler {
                     boolean hasNoColumnFamilies = 
table.getColumnFamilies().isEmpty();
                     PColumn column = hasNoColumnFamilies ? 
table.getColumnForColumnName(columnName) : 
table.getColumnFamily(familyName).getPColumnForColumnName(columnName);
                     if(!projectedColumns.contains(column)) {
+                        // We must run a query if any index contains a non pk 
column
+                        noQueryReqd = false;
                         projectedColumns.add(column);
                         aliasedNodes.add(FACTORY.aliasedNode(null, 
FACTORY.column(hasNoColumnFamilies ? null : TableName.create(null, familyName), 
'"' + columnName + '"', null)));
                     }
@@ -511,7 +513,7 @@ public class DeleteCompiler {
             select = StatementNormalizer.normalize(transformedSelect, 
resolverToBe);
         }
         final boolean hasPreOrPostProcessing = hasPreProcessing || 
hasPostProcessing;
-        boolean noQueryReqd = !hasPreOrPostProcessing;
+        noQueryReqd &= !hasPreOrPostProcessing;
         // No limit and no sub queries, joins, etc in where clause
         // Can't run on same server for transactional data, as we need the row 
keys for the data
         // that is being upserted for conflict detection purposes.
@@ -550,24 +552,8 @@ public class DeleteCompiler {
         }
         
         runOnServer &= queryPlans.get(0).getTableRef().getTable().getType() != 
PTableType.INDEX;
-        
-        // We need to have all indexed columns available in all immutable 
indexes in order
-        // to generate the delete markers from the query. We also cannot have 
any filters
-        // except for our SkipScanFilter for point lookups.
-        // A simple check of the non existence of a where clause in the parse 
node is not sufficient, as the where clause
-        // may have been optimized out. Instead, we check that there's a 
single SkipScanFilter
-        // If we can generate a plan for every index, that means all the 
required columns are available in every index,
-        // hence we can drive the delete from any of the plans.
-        noQueryReqd &= queryPlans.size() == 1 + clientSideIndexes.size();
-        int queryPlanIndex = 0;
-        while (noQueryReqd && queryPlanIndex < queryPlans.size()) {
-            QueryPlan plan = queryPlans.get(queryPlanIndex++);
-            StatementContext context = plan.getContext();
-            noQueryReqd &= (!context.getScan().hasFilter()
-                    || context.getScan().getFilter() instanceof SkipScanFilter)
-                && context.getScanRanges().isPointLookup();
-        }
 
+        noQueryReqd &= queryPlans.size() == 1 + clientSideIndexes.size();
         final int maxSize = 
services.getProps().getInt(QueryServices.MAX_MUTATION_SIZE_ATTRIB,QueryServicesOptions.DEFAULT_MAX_MUTATION_SIZE);
         final int maxSizeBytes = 
services.getProps().getInt(QueryServices.MAX_MUTATION_SIZE_BYTES_ATTRIB,QueryServicesOptions.DEFAULT_MAX_MUTATION_SIZE_BYTES);
  

Reply via email to