Repository: asterixdb
Updated Branches:
  refs/heads/master 1f821f2b2 -> 5ea2a4652


[ASTERIXDB-2434][COMP] Ensure execution mode before 
EnforceStructuralPropertiesRule

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
- Inherit input operator execution mode when creating operators in
  InsertProjectBeforeUnionRule, InjectTypeCastForUnionRule, 
IntroduceDynamicTypeCastRule
- Set source locations for operators created by
  PushAssignBelowUnionAllRule, PushProjectDownRule

Change-Id: Iafe8d1dc0ae75735ba7f52a2ec5c82085c9e7f73
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2846
Sonar-Qube: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Reviewed-by: Taewoo Kim <wangs...@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/5ea2a465
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/5ea2a465
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/5ea2a465

Branch: refs/heads/master
Commit: 5ea2a4652a8e7d4ee46aebf1befd992e7ef6594f
Parents: 1f821f2
Author: Dmitry Lychagin <dmitry.lycha...@couchbase.com>
Authored: Mon Aug 6 20:55:21 2018 -0700
Committer: Dmitry Lychagin <dmitry.lycha...@couchbase.com>
Committed: Tue Aug 7 16:00:06 2018 -0700

----------------------------------------------------------------------
 .../rules/InjectTypeCastForUnionRule.java       |  8 ++--
 .../rules/IntroduceDynamicTypeCastRule.java     |  1 +
 .../queries/query-ASTERIXDB-2354.sqlpp          | 27 ++++++++++++
 .../results/query-ASTERIXDB-2354.plan           | 46 ++++++++++++++++++++
 .../rules/InsertProjectBeforeUnionRule.java     |  7 +--
 .../rules/PushAssignBelowUnionAllRule.java      |  1 +
 .../rewriter/rules/PushProjectDownRule.java     |  1 +
 7 files changed, 85 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ea2a465/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InjectTypeCastForUnionRule.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InjectTypeCastForUnionRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InjectTypeCastForUnionRule.java
index b7c1854..8c39d12 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InjectTypeCastForUnionRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InjectTypeCastForUnionRule.java
@@ -69,8 +69,9 @@ public class InjectTypeCastForUnionRule implements 
IAlgebraicRewriteRule {
         // Gets the type environments for the union all operator and its child 
operator with the right child index.
         IVariableTypeEnvironment env = context.getOutputTypeEnvironment(op);
         Mutable<ILogicalOperator> branchOpRef = op.getInputs().get(childIndex);
-        IVariableTypeEnvironment childEnv = 
context.getOutputTypeEnvironment(branchOpRef.getValue());
-        SourceLocation sourceLoc = branchOpRef.getValue().getSourceLocation();
+        ILogicalOperator branchOp = branchOpRef.getValue();
+        IVariableTypeEnvironment childEnv = 
context.getOutputTypeEnvironment(branchOp);
+        SourceLocation sourceLoc = branchOp.getSourceLocation();
 
         // The two lists are used for the assign operator that calls cast 
functions.
         List<LogicalVariable> varsToCast = new ArrayList<>();
@@ -109,7 +110,8 @@ public class InjectTypeCastForUnionRule implements 
IAlgebraicRewriteRule {
         // Injects an assign operator to perform type casts.
         AssignOperator assignOp = new AssignOperator(varsToCast, 
castFunctionsForLeft);
         assignOp.setSourceLocation(sourceLoc);
-        assignOp.getInputs().add(new MutableObject<>(branchOpRef.getValue()));
+        assignOp.setExecutionMode(branchOp.getExecutionMode());
+        assignOp.getInputs().add(new MutableObject<>(branchOp));
         branchOpRef.setValue(assignOp);
         context.computeAndSetTypeEnvironmentForOperator(assignOp);
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ea2a465/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceDynamicTypeCastRule.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceDynamicTypeCastRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceDynamicTypeCastRule.java
index a7ed0fd..4044965 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceDynamicTypeCastRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceDynamicTypeCastRule.java
@@ -223,6 +223,7 @@ public class IntroduceDynamicTypeCastRule implements 
IAlgebraicRewriteRule {
                     AssignOperator newAssignOperator =
                             new AssignOperator(newAssignVar, new 
MutableObject<ILogicalExpression>(cast));
                     newAssignOperator.setSourceLocation(sourceLoc);
+                    newAssignOperator.setExecutionMode(op.getExecutionMode());
                     newAssignOperator.getInputs().add(new 
MutableObject<ILogicalOperator>(op));
                     opRef.setValue(newAssignOperator);
                     
context.computeAndSetTypeEnvironmentForOperator(newAssignOperator);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ea2a465/asterixdb/asterix-app/src/test/resources/optimizerts/queries/query-ASTERIXDB-2354.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/query-ASTERIXDB-2354.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/query-ASTERIXDB-2354.sqlpp
new file mode 100644
index 0000000..8586437
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/query-ASTERIXDB-2354.sqlpp
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+SELECT ds.DatasetName as v1
+FROM Metadata.`Dataset` ds
+WHERE ds.DatasetName LIKE "Orders%"
+UNION ALL
+SELECT ds.DatasetName v1, idx.DatasetName v2, idx.IndexName v3
+FROM Metadata.`Index` idx, Metadata.`Dataset` ds
+WHERE ds.DatasetName LIKE "Orders%" and idx.DatasetName LIKE "Orders%"
+ORDER BY v1, v2, v3;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ea2a465/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-2354.plan
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-2354.plan
 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-2354.plan
new file mode 100644
index 0000000..90d5b09
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-2354.plan
@@ -0,0 +1,46 @@
+-- DISTRIBUTE_RESULT  |PARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$69(ASC), $$70(ASC), $$71(ASC) ]  |PARTITIONED|
+        -- STABLE_SORT [$$69(ASC), $$70(ASC), $$71(ASC)]  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            -- UNION_ALL  |PARTITIONED|
+              -- RANDOM_PARTITION_EXCHANGE  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- ASSIGN  |PARTITIONED|
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      -- ASSIGN  |PARTITIONED|
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          -- ASSIGN  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- REPLICATE  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- STREAM_SELECT  |PARTITIONED|
+                                    -- STREAM_PROJECT  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- DATASOURCE_SCAN  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- EMPTY_TUPLE_SOURCE  
|PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- ASSIGN  |PARTITIONED|
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      -- ASSIGN  |PARTITIONED|
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          -- NESTED_LOOP  |PARTITIONED|
+                            -- RANDOM_PARTITION_EXCHANGE  |PARTITIONED|
+                              -- STREAM_SELECT  |PARTITIONED|
+                                -- STREAM_PROJECT  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- DATASOURCE_SCAN  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                            -- BROADCAST_EXCHANGE  |PARTITIONED|
+                              -- REPLICATE  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- STREAM_SELECT  |PARTITIONED|
+                                    -- STREAM_PROJECT  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- DATASOURCE_SCAN  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- EMPTY_TUPLE_SOURCE  
|PARTITIONED|

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ea2a465/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InsertProjectBeforeUnionRule.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InsertProjectBeforeUnionRule.java
 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InsertProjectBeforeUnionRule.java
index 2772d8d..c4ae57d 100644
--- 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InsertProjectBeforeUnionRule.java
+++ 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InsertProjectBeforeUnionRule.java
@@ -76,12 +76,13 @@ public class InsertProjectBeforeUnionRule implements 
IAlgebraicRewriteRule {
     private void insertProjectOperator(UnionAllOperator opUnion, int branch, 
ArrayList<LogicalVariable> usedVariables,
             IOptimizationContext context) throws AlgebricksException {
         ProjectOperator projectOp = new ProjectOperator(usedVariables);
-        ILogicalOperator parentOp = opUnion.getInputs().get(branch).getValue();
-        projectOp.getInputs().add(new 
MutableObject<ILogicalOperator>(parentOp));
+        ILogicalOperator inputOp = opUnion.getInputs().get(branch).getValue();
+        projectOp.getInputs().add(new 
MutableObject<ILogicalOperator>(inputOp));
         opUnion.getInputs().get(branch).setValue(projectOp);
         projectOp.setPhysicalOperator(new StreamProjectPOperator());
+        projectOp.setExecutionMode(inputOp.getExecutionMode());
         context.computeAndSetTypeEnvironmentForOperator(projectOp);
-        context.computeAndSetTypeEnvironmentForOperator(parentOp);
+        context.computeAndSetTypeEnvironmentForOperator(inputOp);
     }
 
     private boolean isIdentical(List<LogicalVariable> finalSchema, 
List<LogicalVariable> inputSchema)

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ea2a465/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushAssignBelowUnionAllRule.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushAssignBelowUnionAllRule.java
 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushAssignBelowUnionAllRule.java
index 43c58e2..f432c9f 100644
--- 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushAssignBelowUnionAllRule.java
+++ 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushAssignBelowUnionAllRule.java
@@ -163,6 +163,7 @@ public class PushAssignBelowUnionAllRule implements 
IAlgebraicRewriteRule {
                     
assignOp.getExpressions().get(i).getValue().cloneExpression()));
         }
         AssignOperator assignCloneOp = new AssignOperator(vars, exprs);
+        assignCloneOp.setSourceLocation(assignOp.getSourceLocation());
         assignCloneOp.setExecutionMode(assignOp.getExecutionMode());
         return assignCloneOp;
     }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/5ea2a465/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushProjectDownRule.java
----------------------------------------------------------------------
diff --git 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushProjectDownRule.java
 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushProjectDownRule.java
index 5675a03..1ce6329 100644
--- 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushProjectDownRule.java
+++ 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushProjectDownRule.java
@@ -208,6 +208,7 @@ public class PushProjectDownRule implements 
IAlgebraicRewriteRule {
         }
 
         ProjectOperator pi2 = new ProjectOperator(new 
ArrayList<LogicalVariable>(toPush));
+        pi2.setSourceLocation(op.getSourceLocation());
         pi2.getInputs().add(new MutableObject<ILogicalOperator>(op));
         opRef.setValue(pi2);
         pi2.setExecutionMode(op.getExecutionMode());

Reply via email to