[NO ISSUE][COMP] Stop reusing variables of Intersect operator
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Intersect operator's input variables should not be reused as
its output variables (fixed IntroduceSelectAccessMethodRule
and IntroduceLSMComponentFilterRule)
- Remove HeuristicOptimizer.isHyracksOp() and updated
ExtractCommonOperatorsRule to use isMicroOperator() instead
- When copying Intersect operator OperatorDeepCopyVisitor now
properly handles its two kinds input variables
- Clear additional state in IntroduceSelectAccessMethodRule.clear()
and OptimizableOperatorSubTree.reset()
- Added testcases for index intersection
Change-Id: I551819b828450760797f6b29af02aad4e124646c
Reviewed-on: https://asterix-gerrit.ics.uci.edu/3450
Contrib: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Dmitry Lychagin <dmitry.lychagin@couchbase.com>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceLSMComponentFilterRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceLSMComponentFilterRule.java
index 7739833..bd5b7c4 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceLSMComponentFilterRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceLSMComponentFilterRule.java
@@ -270,10 +270,13 @@
filterVars.add(extraVars);
}
if (!filterVars.isEmpty()) {
- List<LogicalVariable> outputFilterVars = new ArrayList<>(filterVars.get(0));
+ int outputFilterVarsCount = filterVars.get(0).size();
+ List<LogicalVariable> outputFilterVars = new ArrayList<>(outputFilterVarsCount);
+ for (int i = 0; i < outputFilterVarsCount; i++) {
+ outputFilterVars.add(context.newVar());
+ }
IntersectOperator intersectWithFilter =
createIntersectWithFilter(outputFilterVars, filterVars, intersect);
-
intersectOrSortOrSplit.setValue(intersectWithFilter);
context.computeAndSetTypeEnvironmentForOperator(intersectWithFilter);
setPrimaryFilterVar(primaryOp, outputFilterVars.get(0), outputFilterVars.get(1), context);
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
index 0ea16ae..4199ece 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
@@ -50,6 +50,7 @@
import org.apache.hyracks.algebricks.core.algebra.operators.logical.IntersectOperator;
import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator;
import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities;
import org.apache.hyracks.algebricks.core.algebra.util.OperatorPropertiesUtil;
/**
@@ -291,8 +292,15 @@
inputVars.add(orderedColumn);
}
- List<LogicalVariable> outputVar = inputVars.get(0);
- IntersectOperator intersect = new IntersectOperator(outputVar, inputVars);
+ List<LogicalVariable> inputVars0 = inputVars.get(0);
+ List<LogicalVariable> outputVars = new ArrayList<>(inputVars0.size());
+ for (LogicalVariable inputVar : inputVars0) {
+ LogicalVariable outputVar = context.newVar();
+ outputVars.add(outputVar);
+ VariableUtilities.substituteVariables(lop, inputVar, outputVar, context);
+ }
+
+ IntersectOperator intersect = new IntersectOperator(outputVars, inputVars);
intersect.setSourceLocation(lop.getSourceLocation());
for (ILogicalOperator secondarySearch : subRoots) {
intersect.getInputs().add(secondarySearch.getInputs().get(0));
@@ -460,6 +468,7 @@
selectRef = null;
selectOp = null;
selectCond = null;
+ typeEnvironment = null;
subTree.reset();
}
}
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/OptimizableOperatorSubTree.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/OptimizableOperatorSubTree.java
index 9673da3..7311644 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/OptimizableOperatorSubTree.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/OptimizableOperatorSubTree.java
@@ -377,6 +377,7 @@
setRootRef(null);
getAssignsAndUnnestsRefs().clear();
getAssignsAndUnnests().clear();
+ getVarsToFieldNameMap().clear();
setDataSourceRef(null);
setDataSourceType(DataSourceType.NO_DATASOURCE);
setIxJoinOuterAdditionalDataSourceRefs(null);
@@ -384,6 +385,7 @@
setDataset(null);
setIxJoinOuterAdditionalDatasets(null);
setRecordType(null);
+ setMetaRecordType(null);
setIxJoinOuterAdditionalRecordTypes(null);
}
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/intersection-misc/intersection-misc-01.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/intersection-misc/intersection-misc-01.sqlpp
new file mode 100644
index 0000000..c84df18
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/intersection-misc/intersection-misc-01.sqlpp
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+
+/*
+ * Description: Test index intersection
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+
+use test;
+
+create type test.TestType as
+{
+ id : integer
+};
+
+create dataset c(TestType) primary key id;
+create dataset d(TestType) primary key id;
+
+create index idx_c5 on d(c5:bigint) type btree;
+create index idx_c6 on d(c6:string) type btree;
+
+FROM (
+ SELECT d.c3
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c5 = 1
+) t1
+INNER JOIN
+ d t2 ON t1.c3 = t2.c2
+INNER JOIN (
+ SELECT d.c4
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c6 BETWEEN "2019-01-01" AND "2019-02-01"
+ AND d.c5 = 1
+) t3 ON t2.c4 = t3.c4
+SELECT *
+ORDER BY t1.c3, t2.id, t3.c4;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/intersection-misc/intersection-misc-02.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/intersection-misc/intersection-misc-02.sqlpp
new file mode 100644
index 0000000..bfdf79d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/intersection-misc/intersection-misc-02.sqlpp
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+
+/*
+ * Description: Same query, skip some indexes -> no intersection
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+
+use test;
+
+create type test.TestType as
+{
+ id : integer
+};
+
+create dataset c(TestType) primary key id;
+create dataset d(TestType) primary key id;
+
+create index idx_c5 on d(c5:bigint) type btree;
+create index idx_c6 on d(c6:string) type btree;
+
+FROM (
+ SELECT d.c3
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c5 = 1
+) t1
+INNER JOIN
+ d t2 ON t1.c3 = t2.c2
+INNER JOIN (
+ SELECT d.c4
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c6 /*+ skip-index */ BETWEEN "2019-01-01" AND "2019-02-01"
+ AND d.c5 = 1
+) t3 ON t2.c4 = t3.c4
+SELECT *
+ORDER BY t1.c3, t2.id, t3.c4;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/intersection-misc/intersection-misc-03.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/intersection-misc/intersection-misc-03.sqlpp
new file mode 100644
index 0000000..88a8050
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/intersection-misc/intersection-misc-03.sqlpp
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+
+/*
+ * Description: Same query, skip some indexes -> no intersection
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+
+use test;
+
+create type test.TestType as
+{
+ id : integer
+};
+
+create dataset c(TestType) primary key id;
+create dataset d(TestType) primary key id;
+
+create index idx_c5 on d(c5:bigint) type btree;
+create index idx_c6 on d(c6:string) type btree;
+
+FROM (
+ SELECT d.c3
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c5 = 1
+) t1
+INNER JOIN
+ d t2 ON t1.c3 = t2.c2
+INNER JOIN (
+ SELECT d.c4
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c6 BETWEEN "2019-01-01" AND "2019-02-01"
+ AND d.c5 /*+ skip-index */ = 1
+) t3 ON t2.c4 = t3.c4
+SELECT *
+ORDER BY t1.c3, t2.id, t3.c4;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/intersection-misc/intersection-misc-04.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/intersection-misc/intersection-misc-04.sqlpp
new file mode 100644
index 0000000..dd16870
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/intersection-misc/intersection-misc-04.sqlpp
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+
+/*
+ * Description: Same query, skip some indexes -> no intersection
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+
+use test;
+
+create type test.TestType as
+{
+ id : integer
+};
+
+create dataset c(TestType) primary key id;
+create dataset d(TestType) primary key id;
+
+create index idx_c5 on d(c5:bigint) type btree;
+create index idx_c6 on d(c6:string) type btree;
+
+FROM (
+ SELECT d.c3
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c5 /*+ skip-index */ = 1
+) t1
+INNER JOIN
+ d t2 ON t1.c3 = t2.c2
+INNER JOIN (
+ SELECT d.c4
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c6 /*+ skip-index */ BETWEEN "2019-01-01" AND "2019-02-01"
+ AND d.c5 /*+ skip-index */ = 1
+) t3 ON t2.c4 = t3.c4
+SELECT *
+ORDER BY t1.c3, t2.id, t3.c4;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-01.plan
new file mode 100644
index 0000000..2f73b46
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-01.plan
@@ -0,0 +1,128 @@
+-- DISTRIBUTE_RESULT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- SORT_MERGE_EXCHANGE [$$128(ASC), $$118(ASC), $$130(ASC) ] |PARTITIONED|
+ -- STABLE_SORT [$$128(ASC), $$118(ASC), $$130(ASC)] |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$123][$$130] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$123] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$128][$$122] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$128] |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$116] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- STREAM_SELECT |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$116(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$116] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$125][$$71] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$125] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- BTREE_SEARCH |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$141(ASC)] |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- BTREE_SEARCH |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$71] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$122] |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$130] |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$119] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- STREAM_SELECT |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$119(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$119] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$126][$$90] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$126] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- BTREE_SEARCH |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- INTERSECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$141(ASC)] |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- BTREE_SEARCH |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$149(ASC)] |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- BTREE_SEARCH |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$71] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-02.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-02.plan
new file mode 100644
index 0000000..d08ddb8
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-02.plan
@@ -0,0 +1,116 @@
+-- DISTRIBUTE_RESULT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- SORT_MERGE_EXCHANGE [$$128(ASC), $$118(ASC), $$130(ASC) ] |PARTITIONED|
+ -- STABLE_SORT [$$128(ASC), $$118(ASC), $$130(ASC)] |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$123][$$130] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$123] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$128][$$122] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$128] |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$116] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- STREAM_SELECT |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$116(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$116] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$125][$$71] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$125] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- BTREE_SEARCH |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$141(ASC)] |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- BTREE_SEARCH |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$71] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$122] |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$130] |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$119] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- STREAM_SELECT |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$119(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$119] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$126][$$90] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$126] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- BTREE_SEARCH |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$141(ASC)] |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- BTREE_SEARCH |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$71] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-03.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-03.plan
new file mode 100644
index 0000000..f5f857c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-03.plan
@@ -0,0 +1,110 @@
+-- DISTRIBUTE_RESULT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- SORT_MERGE_EXCHANGE [$$128(ASC), $$118(ASC), $$130(ASC) ] |PARTITIONED|
+ -- STABLE_SORT [$$128(ASC), $$118(ASC), $$130(ASC)] |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$123][$$130] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$123] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$128][$$122] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$128] |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$116] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- STREAM_SELECT |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$116(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$116] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$125][$$71] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$125] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- BTREE_SEARCH |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$141(ASC)] |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- BTREE_SEARCH |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$71] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$122] |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$130] |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$119] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- STREAM_SELECT |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$119(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$119] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$126][$$90] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$126] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- BTREE_SEARCH |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$145(ASC)] |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- BTREE_SEARCH |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$71] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-04.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-04.plan
new file mode 100644
index 0000000..0d45fa3
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/intersection-misc/intersection-misc-04.plan
@@ -0,0 +1,106 @@
+-- DISTRIBUTE_RESULT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- SORT_MERGE_EXCHANGE [$$128(ASC), $$118(ASC), $$130(ASC) ] |PARTITIONED|
+ -- STABLE_SORT [$$128(ASC), $$118(ASC), $$130(ASC)] |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$123][$$130] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$123] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$128][$$122] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$128] |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$116] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- STREAM_SELECT |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$116(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$116] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$125][$$71] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$125] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$71] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$122] |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$130] |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$119] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- STREAM_SELECT |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STABLE_SORT [$$119(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$119] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$126][$$90] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$126] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |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|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$71] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/multi-indexes/two-rtree-intersect.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/multi-indexes/two-rtree-intersect.plan
index f4d7bba..d0946cd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/multi-indexes/two-rtree-intersect.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/multi-indexes/two-rtree-intersect.plan
@@ -12,13 +12,14 @@
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- RTREE_SEARCH |PARTITIONED|
- -- STREAM_PROJECT |PARTITIONED|
- -- ASSIGN |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- REPLICATE |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- ASSIGN |PARTITIONED|
- -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STABLE_SORT [$$33(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.1.ddl.sqlpp
new file mode 100644
index 0000000..22b71a5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.1.ddl.sqlpp
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+
+/*
+ * Description: Test index intersection
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+
+use test;
+
+create type test.TestType as
+{
+ id : integer
+};
+
+create dataset c(TestType) primary key id;
+create dataset d(TestType) primary key id;
+
+create index idx_c5 on d(c5:bigint) type btree;
+create index idx_c6 on d(c6:string) type btree;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.2.update.sqlpp
new file mode 100644
index 0000000..bd814d9
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.2.update.sqlpp
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+use test;
+
+insert into c
+([
+ {"id":0, "c11":"A" },
+ {"id":1, "c11":"B" }
+]);
+
+insert into d
+([
+ {"id":0, "c1":"A", "c2":"AA", "c3":"DD", "c4":100, "c5":1, "c6":"2019-01-01" },
+ {"id":1, "c1":"A", "c2":"AA", "c3":"CC", "c4":101, "c5":1, "c6":"2019-01-02" },
+ {"id":2, "c1":"A", "c2":"AA", "c3":"CC", "c4":102, "c5":1, "c6":"2019-01-03" },
+ {"id":3, "c1":"A", "c2":"BB", "c3":"CC", "c4":103, "c5":1, "c6":"2019-01-04" },
+ {"id":4, "c1":"A", "c2":"BB", "c3":"BB", "c4":104, "c5":1, "c6":"2019-01-05" },
+ {"id":5, "c1":"A", "c2":"BB", "c3":"BB", "c4":105, "c5":1, "c6":"2019-01-06" },
+ {"id":6, "c1":"A", "c2":"CC", "c3":"BB", "c4":106, "c5":1, "c6":"2019-01-07" },
+ {"id":7, "c1":"A", "c2":"CC", "c3":"AA", "c4":107, "c5":1, "c6":"2019-01-08" },
+ {"id":8, "c1":"A", "c2":"CC", "c3":"AA", "c4":108, "c5":1, "c6":"2019-01-09" },
+ {"id":9, "c1":"A", "c2":"DD", "c3":"AA", "c4":109, "c5":1, "c6":"2019-01-10" }
+]);
+
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.3.query.sqlpp
new file mode 100644
index 0000000..39efe73
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.3.query.sqlpp
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+/*
+ * Description: Test index intersection
+ */
+
+use test;
+
+FROM (
+ SELECT d.c3
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c5 = 1
+) t1
+INNER JOIN
+ d t2 ON t1.c3 = t2.c2
+INNER JOIN (
+ SELECT d.c4
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c6 BETWEEN "2019-01-01" AND "2019-02-01"
+ AND d.c5 = 1
+) t3 ON t2.c4 = t3.c4
+SELECT *
+ORDER BY t1.c3, t2.id, t3.c4;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.4.query.sqlpp
new file mode 100644
index 0000000..bd541a2
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.4.query.sqlpp
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+/*
+ * Description: Same query, skip some indexes -> no intersection
+ */
+
+use test;
+
+FROM (
+ SELECT d.c3
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c5 = 1
+) t1
+INNER JOIN
+ d t2 ON t1.c3 = t2.c2
+INNER JOIN (
+ SELECT d.c4
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c6 /*+ skip-index */ BETWEEN "2019-01-01" AND "2019-02-01"
+ AND d.c5 = 1
+) t3 ON t2.c4 = t3.c4
+SELECT *
+ORDER BY t1.c3, t2.id, t3.c4;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.5.query.sqlpp
new file mode 100644
index 0000000..b6ecb78
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.5.query.sqlpp
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+/*
+ * Description: Same query, skip some indexes -> no intersection
+ */
+
+use test;
+
+FROM (
+ SELECT d.c3
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c5 = 1
+) t1
+INNER JOIN
+ d t2 ON t1.c3 = t2.c2
+INNER JOIN (
+ SELECT d.c4
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c6 BETWEEN "2019-01-01" AND "2019-02-01"
+ AND d.c5 /*+ skip-index */ = 1
+) t3 ON t2.c4 = t3.c4
+SELECT *
+ORDER BY t1.c3, t2.id, t3.c4;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.6.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.6.query.sqlpp
new file mode 100644
index 0000000..d4cb940
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/intersection-misc-01/intersection-misc-01.6.query.sqlpp
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+/*
+ * Description: Same query, skip some indexes -> no intersection
+ */
+
+use test;
+
+FROM (
+ SELECT d.c3
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c5 /*+ skip-index */ = 1
+) t1
+INNER JOIN
+ d t2 ON t1.c3 = t2.c2
+INNER JOIN (
+ SELECT d.c4
+ FROM d
+ WHERE d.c1 IN (SELECT VALUE c.c11 FROM c)
+ AND d.c6 /*+ skip-index */ BETWEEN "2019-01-01" AND "2019-02-01"
+ AND d.c5 /*+ skip-index */ = 1
+) t3 ON t2.c4 = t3.c4
+SELECT *
+ORDER BY t1.c3, t2.id, t3.c4;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/intersection-misc-01/intersection-misc-01.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/intersection-misc-01/intersection-misc-01.3.adm
new file mode 100644
index 0000000..90e2311
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/intersection-misc-01/intersection-misc-01.3.adm
@@ -0,0 +1,28 @@
+{ "t1": { "c3": "AA" }, "t2": { "id": 0, "c1": "A", "c2": "AA", "c3": "DD", "c4": 100, "c5": 1, "c6": "2019-01-01" }, "t3": { "c4": 100 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 0, "c1": "A", "c2": "AA", "c3": "DD", "c4": 100, "c5": 1, "c6": "2019-01-01" }, "t3": { "c4": 100 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 0, "c1": "A", "c2": "AA", "c3": "DD", "c4": 100, "c5": 1, "c6": "2019-01-01" }, "t3": { "c4": 100 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 1, "c1": "A", "c2": "AA", "c3": "CC", "c4": 101, "c5": 1, "c6": "2019-01-02" }, "t3": { "c4": 101 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 1, "c1": "A", "c2": "AA", "c3": "CC", "c4": 101, "c5": 1, "c6": "2019-01-02" }, "t3": { "c4": 101 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 1, "c1": "A", "c2": "AA", "c3": "CC", "c4": 101, "c5": 1, "c6": "2019-01-02" }, "t3": { "c4": 101 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 2, "c1": "A", "c2": "AA", "c3": "CC", "c4": 102, "c5": 1, "c6": "2019-01-03" }, "t3": { "c4": 102 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 2, "c1": "A", "c2": "AA", "c3": "CC", "c4": 102, "c5": 1, "c6": "2019-01-03" }, "t3": { "c4": 102 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 2, "c1": "A", "c2": "AA", "c3": "CC", "c4": 102, "c5": 1, "c6": "2019-01-03" }, "t3": { "c4": 102 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 3, "c1": "A", "c2": "BB", "c3": "CC", "c4": 103, "c5": 1, "c6": "2019-01-04" }, "t3": { "c4": 103 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 3, "c1": "A", "c2": "BB", "c3": "CC", "c4": 103, "c5": 1, "c6": "2019-01-04" }, "t3": { "c4": 103 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 3, "c1": "A", "c2": "BB", "c3": "CC", "c4": 103, "c5": 1, "c6": "2019-01-04" }, "t3": { "c4": 103 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 4, "c1": "A", "c2": "BB", "c3": "BB", "c4": 104, "c5": 1, "c6": "2019-01-05" }, "t3": { "c4": 104 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 4, "c1": "A", "c2": "BB", "c3": "BB", "c4": 104, "c5": 1, "c6": "2019-01-05" }, "t3": { "c4": 104 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 4, "c1": "A", "c2": "BB", "c3": "BB", "c4": 104, "c5": 1, "c6": "2019-01-05" }, "t3": { "c4": 104 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 5, "c1": "A", "c2": "BB", "c3": "BB", "c4": 105, "c5": 1, "c6": "2019-01-06" }, "t3": { "c4": 105 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 5, "c1": "A", "c2": "BB", "c3": "BB", "c4": 105, "c5": 1, "c6": "2019-01-06" }, "t3": { "c4": 105 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 5, "c1": "A", "c2": "BB", "c3": "BB", "c4": 105, "c5": 1, "c6": "2019-01-06" }, "t3": { "c4": 105 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 6, "c1": "A", "c2": "CC", "c3": "BB", "c4": 106, "c5": 1, "c6": "2019-01-07" }, "t3": { "c4": 106 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 6, "c1": "A", "c2": "CC", "c3": "BB", "c4": 106, "c5": 1, "c6": "2019-01-07" }, "t3": { "c4": 106 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 6, "c1": "A", "c2": "CC", "c3": "BB", "c4": 106, "c5": 1, "c6": "2019-01-07" }, "t3": { "c4": 106 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 7, "c1": "A", "c2": "CC", "c3": "AA", "c4": 107, "c5": 1, "c6": "2019-01-08" }, "t3": { "c4": 107 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 7, "c1": "A", "c2": "CC", "c3": "AA", "c4": 107, "c5": 1, "c6": "2019-01-08" }, "t3": { "c4": 107 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 7, "c1": "A", "c2": "CC", "c3": "AA", "c4": 107, "c5": 1, "c6": "2019-01-08" }, "t3": { "c4": 107 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 8, "c1": "A", "c2": "CC", "c3": "AA", "c4": 108, "c5": 1, "c6": "2019-01-09" }, "t3": { "c4": 108 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 8, "c1": "A", "c2": "CC", "c3": "AA", "c4": 108, "c5": 1, "c6": "2019-01-09" }, "t3": { "c4": 108 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 8, "c1": "A", "c2": "CC", "c3": "AA", "c4": 108, "c5": 1, "c6": "2019-01-09" }, "t3": { "c4": 108 } }
+{ "t1": { "c3": "DD" }, "t2": { "id": 9, "c1": "A", "c2": "DD", "c3": "AA", "c4": 109, "c5": 1, "c6": "2019-01-10" }, "t3": { "c4": 109 } }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/intersection-misc-01/intersection-misc-01.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/intersection-misc-01/intersection-misc-01.4.adm
new file mode 100644
index 0000000..90e2311
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/intersection-misc-01/intersection-misc-01.4.adm
@@ -0,0 +1,28 @@
+{ "t1": { "c3": "AA" }, "t2": { "id": 0, "c1": "A", "c2": "AA", "c3": "DD", "c4": 100, "c5": 1, "c6": "2019-01-01" }, "t3": { "c4": 100 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 0, "c1": "A", "c2": "AA", "c3": "DD", "c4": 100, "c5": 1, "c6": "2019-01-01" }, "t3": { "c4": 100 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 0, "c1": "A", "c2": "AA", "c3": "DD", "c4": 100, "c5": 1, "c6": "2019-01-01" }, "t3": { "c4": 100 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 1, "c1": "A", "c2": "AA", "c3": "CC", "c4": 101, "c5": 1, "c6": "2019-01-02" }, "t3": { "c4": 101 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 1, "c1": "A", "c2": "AA", "c3": "CC", "c4": 101, "c5": 1, "c6": "2019-01-02" }, "t3": { "c4": 101 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 1, "c1": "A", "c2": "AA", "c3": "CC", "c4": 101, "c5": 1, "c6": "2019-01-02" }, "t3": { "c4": 101 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 2, "c1": "A", "c2": "AA", "c3": "CC", "c4": 102, "c5": 1, "c6": "2019-01-03" }, "t3": { "c4": 102 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 2, "c1": "A", "c2": "AA", "c3": "CC", "c4": 102, "c5": 1, "c6": "2019-01-03" }, "t3": { "c4": 102 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 2, "c1": "A", "c2": "AA", "c3": "CC", "c4": 102, "c5": 1, "c6": "2019-01-03" }, "t3": { "c4": 102 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 3, "c1": "A", "c2": "BB", "c3": "CC", "c4": 103, "c5": 1, "c6": "2019-01-04" }, "t3": { "c4": 103 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 3, "c1": "A", "c2": "BB", "c3": "CC", "c4": 103, "c5": 1, "c6": "2019-01-04" }, "t3": { "c4": 103 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 3, "c1": "A", "c2": "BB", "c3": "CC", "c4": 103, "c5": 1, "c6": "2019-01-04" }, "t3": { "c4": 103 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 4, "c1": "A", "c2": "BB", "c3": "BB", "c4": 104, "c5": 1, "c6": "2019-01-05" }, "t3": { "c4": 104 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 4, "c1": "A", "c2": "BB", "c3": "BB", "c4": 104, "c5": 1, "c6": "2019-01-05" }, "t3": { "c4": 104 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 4, "c1": "A", "c2": "BB", "c3": "BB", "c4": 104, "c5": 1, "c6": "2019-01-05" }, "t3": { "c4": 104 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 5, "c1": "A", "c2": "BB", "c3": "BB", "c4": 105, "c5": 1, "c6": "2019-01-06" }, "t3": { "c4": 105 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 5, "c1": "A", "c2": "BB", "c3": "BB", "c4": 105, "c5": 1, "c6": "2019-01-06" }, "t3": { "c4": 105 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 5, "c1": "A", "c2": "BB", "c3": "BB", "c4": 105, "c5": 1, "c6": "2019-01-06" }, "t3": { "c4": 105 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 6, "c1": "A", "c2": "CC", "c3": "BB", "c4": 106, "c5": 1, "c6": "2019-01-07" }, "t3": { "c4": 106 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 6, "c1": "A", "c2": "CC", "c3": "BB", "c4": 106, "c5": 1, "c6": "2019-01-07" }, "t3": { "c4": 106 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 6, "c1": "A", "c2": "CC", "c3": "BB", "c4": 106, "c5": 1, "c6": "2019-01-07" }, "t3": { "c4": 106 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 7, "c1": "A", "c2": "CC", "c3": "AA", "c4": 107, "c5": 1, "c6": "2019-01-08" }, "t3": { "c4": 107 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 7, "c1": "A", "c2": "CC", "c3": "AA", "c4": 107, "c5": 1, "c6": "2019-01-08" }, "t3": { "c4": 107 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 7, "c1": "A", "c2": "CC", "c3": "AA", "c4": 107, "c5": 1, "c6": "2019-01-08" }, "t3": { "c4": 107 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 8, "c1": "A", "c2": "CC", "c3": "AA", "c4": 108, "c5": 1, "c6": "2019-01-09" }, "t3": { "c4": 108 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 8, "c1": "A", "c2": "CC", "c3": "AA", "c4": 108, "c5": 1, "c6": "2019-01-09" }, "t3": { "c4": 108 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 8, "c1": "A", "c2": "CC", "c3": "AA", "c4": 108, "c5": 1, "c6": "2019-01-09" }, "t3": { "c4": 108 } }
+{ "t1": { "c3": "DD" }, "t2": { "id": 9, "c1": "A", "c2": "DD", "c3": "AA", "c4": 109, "c5": 1, "c6": "2019-01-10" }, "t3": { "c4": 109 } }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/intersection-misc-01/intersection-misc-01.5.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/intersection-misc-01/intersection-misc-01.5.adm
new file mode 100644
index 0000000..90e2311
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/intersection-misc-01/intersection-misc-01.5.adm
@@ -0,0 +1,28 @@
+{ "t1": { "c3": "AA" }, "t2": { "id": 0, "c1": "A", "c2": "AA", "c3": "DD", "c4": 100, "c5": 1, "c6": "2019-01-01" }, "t3": { "c4": 100 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 0, "c1": "A", "c2": "AA", "c3": "DD", "c4": 100, "c5": 1, "c6": "2019-01-01" }, "t3": { "c4": 100 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 0, "c1": "A", "c2": "AA", "c3": "DD", "c4": 100, "c5": 1, "c6": "2019-01-01" }, "t3": { "c4": 100 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 1, "c1": "A", "c2": "AA", "c3": "CC", "c4": 101, "c5": 1, "c6": "2019-01-02" }, "t3": { "c4": 101 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 1, "c1": "A", "c2": "AA", "c3": "CC", "c4": 101, "c5": 1, "c6": "2019-01-02" }, "t3": { "c4": 101 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 1, "c1": "A", "c2": "AA", "c3": "CC", "c4": 101, "c5": 1, "c6": "2019-01-02" }, "t3": { "c4": 101 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 2, "c1": "A", "c2": "AA", "c3": "CC", "c4": 102, "c5": 1, "c6": "2019-01-03" }, "t3": { "c4": 102 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 2, "c1": "A", "c2": "AA", "c3": "CC", "c4": 102, "c5": 1, "c6": "2019-01-03" }, "t3": { "c4": 102 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 2, "c1": "A", "c2": "AA", "c3": "CC", "c4": 102, "c5": 1, "c6": "2019-01-03" }, "t3": { "c4": 102 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 3, "c1": "A", "c2": "BB", "c3": "CC", "c4": 103, "c5": 1, "c6": "2019-01-04" }, "t3": { "c4": 103 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 3, "c1": "A", "c2": "BB", "c3": "CC", "c4": 103, "c5": 1, "c6": "2019-01-04" }, "t3": { "c4": 103 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 3, "c1": "A", "c2": "BB", "c3": "CC", "c4": 103, "c5": 1, "c6": "2019-01-04" }, "t3": { "c4": 103 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 4, "c1": "A", "c2": "BB", "c3": "BB", "c4": 104, "c5": 1, "c6": "2019-01-05" }, "t3": { "c4": 104 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 4, "c1": "A", "c2": "BB", "c3": "BB", "c4": 104, "c5": 1, "c6": "2019-01-05" }, "t3": { "c4": 104 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 4, "c1": "A", "c2": "BB", "c3": "BB", "c4": 104, "c5": 1, "c6": "2019-01-05" }, "t3": { "c4": 104 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 5, "c1": "A", "c2": "BB", "c3": "BB", "c4": 105, "c5": 1, "c6": "2019-01-06" }, "t3": { "c4": 105 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 5, "c1": "A", "c2": "BB", "c3": "BB", "c4": 105, "c5": 1, "c6": "2019-01-06" }, "t3": { "c4": 105 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 5, "c1": "A", "c2": "BB", "c3": "BB", "c4": 105, "c5": 1, "c6": "2019-01-06" }, "t3": { "c4": 105 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 6, "c1": "A", "c2": "CC", "c3": "BB", "c4": 106, "c5": 1, "c6": "2019-01-07" }, "t3": { "c4": 106 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 6, "c1": "A", "c2": "CC", "c3": "BB", "c4": 106, "c5": 1, "c6": "2019-01-07" }, "t3": { "c4": 106 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 6, "c1": "A", "c2": "CC", "c3": "BB", "c4": 106, "c5": 1, "c6": "2019-01-07" }, "t3": { "c4": 106 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 7, "c1": "A", "c2": "CC", "c3": "AA", "c4": 107, "c5": 1, "c6": "2019-01-08" }, "t3": { "c4": 107 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 7, "c1": "A", "c2": "CC", "c3": "AA", "c4": 107, "c5": 1, "c6": "2019-01-08" }, "t3": { "c4": 107 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 7, "c1": "A", "c2": "CC", "c3": "AA", "c4": 107, "c5": 1, "c6": "2019-01-08" }, "t3": { "c4": 107 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 8, "c1": "A", "c2": "CC", "c3": "AA", "c4": 108, "c5": 1, "c6": "2019-01-09" }, "t3": { "c4": 108 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 8, "c1": "A", "c2": "CC", "c3": "AA", "c4": 108, "c5": 1, "c6": "2019-01-09" }, "t3": { "c4": 108 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 8, "c1": "A", "c2": "CC", "c3": "AA", "c4": 108, "c5": 1, "c6": "2019-01-09" }, "t3": { "c4": 108 } }
+{ "t1": { "c3": "DD" }, "t2": { "id": 9, "c1": "A", "c2": "DD", "c3": "AA", "c4": 109, "c5": 1, "c6": "2019-01-10" }, "t3": { "c4": 109 } }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/intersection-misc-01/intersection-misc-01.6.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/intersection-misc-01/intersection-misc-01.6.adm
new file mode 100644
index 0000000..90e2311
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/intersection-misc-01/intersection-misc-01.6.adm
@@ -0,0 +1,28 @@
+{ "t1": { "c3": "AA" }, "t2": { "id": 0, "c1": "A", "c2": "AA", "c3": "DD", "c4": 100, "c5": 1, "c6": "2019-01-01" }, "t3": { "c4": 100 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 0, "c1": "A", "c2": "AA", "c3": "DD", "c4": 100, "c5": 1, "c6": "2019-01-01" }, "t3": { "c4": 100 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 0, "c1": "A", "c2": "AA", "c3": "DD", "c4": 100, "c5": 1, "c6": "2019-01-01" }, "t3": { "c4": 100 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 1, "c1": "A", "c2": "AA", "c3": "CC", "c4": 101, "c5": 1, "c6": "2019-01-02" }, "t3": { "c4": 101 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 1, "c1": "A", "c2": "AA", "c3": "CC", "c4": 101, "c5": 1, "c6": "2019-01-02" }, "t3": { "c4": 101 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 1, "c1": "A", "c2": "AA", "c3": "CC", "c4": 101, "c5": 1, "c6": "2019-01-02" }, "t3": { "c4": 101 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 2, "c1": "A", "c2": "AA", "c3": "CC", "c4": 102, "c5": 1, "c6": "2019-01-03" }, "t3": { "c4": 102 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 2, "c1": "A", "c2": "AA", "c3": "CC", "c4": 102, "c5": 1, "c6": "2019-01-03" }, "t3": { "c4": 102 } }
+{ "t1": { "c3": "AA" }, "t2": { "id": 2, "c1": "A", "c2": "AA", "c3": "CC", "c4": 102, "c5": 1, "c6": "2019-01-03" }, "t3": { "c4": 102 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 3, "c1": "A", "c2": "BB", "c3": "CC", "c4": 103, "c5": 1, "c6": "2019-01-04" }, "t3": { "c4": 103 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 3, "c1": "A", "c2": "BB", "c3": "CC", "c4": 103, "c5": 1, "c6": "2019-01-04" }, "t3": { "c4": 103 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 3, "c1": "A", "c2": "BB", "c3": "CC", "c4": 103, "c5": 1, "c6": "2019-01-04" }, "t3": { "c4": 103 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 4, "c1": "A", "c2": "BB", "c3": "BB", "c4": 104, "c5": 1, "c6": "2019-01-05" }, "t3": { "c4": 104 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 4, "c1": "A", "c2": "BB", "c3": "BB", "c4": 104, "c5": 1, "c6": "2019-01-05" }, "t3": { "c4": 104 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 4, "c1": "A", "c2": "BB", "c3": "BB", "c4": 104, "c5": 1, "c6": "2019-01-05" }, "t3": { "c4": 104 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 5, "c1": "A", "c2": "BB", "c3": "BB", "c4": 105, "c5": 1, "c6": "2019-01-06" }, "t3": { "c4": 105 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 5, "c1": "A", "c2": "BB", "c3": "BB", "c4": 105, "c5": 1, "c6": "2019-01-06" }, "t3": { "c4": 105 } }
+{ "t1": { "c3": "BB" }, "t2": { "id": 5, "c1": "A", "c2": "BB", "c3": "BB", "c4": 105, "c5": 1, "c6": "2019-01-06" }, "t3": { "c4": 105 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 6, "c1": "A", "c2": "CC", "c3": "BB", "c4": 106, "c5": 1, "c6": "2019-01-07" }, "t3": { "c4": 106 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 6, "c1": "A", "c2": "CC", "c3": "BB", "c4": 106, "c5": 1, "c6": "2019-01-07" }, "t3": { "c4": 106 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 6, "c1": "A", "c2": "CC", "c3": "BB", "c4": 106, "c5": 1, "c6": "2019-01-07" }, "t3": { "c4": 106 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 7, "c1": "A", "c2": "CC", "c3": "AA", "c4": 107, "c5": 1, "c6": "2019-01-08" }, "t3": { "c4": 107 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 7, "c1": "A", "c2": "CC", "c3": "AA", "c4": 107, "c5": 1, "c6": "2019-01-08" }, "t3": { "c4": 107 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 7, "c1": "A", "c2": "CC", "c3": "AA", "c4": 107, "c5": 1, "c6": "2019-01-08" }, "t3": { "c4": 107 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 8, "c1": "A", "c2": "CC", "c3": "AA", "c4": 108, "c5": 1, "c6": "2019-01-09" }, "t3": { "c4": 108 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 8, "c1": "A", "c2": "CC", "c3": "AA", "c4": 108, "c5": 1, "c6": "2019-01-09" }, "t3": { "c4": 108 } }
+{ "t1": { "c3": "CC" }, "t2": { "id": 8, "c1": "A", "c2": "CC", "c3": "AA", "c4": 108, "c5": 1, "c6": "2019-01-09" }, "t3": { "c4": 108 } }
+{ "t1": { "c3": "DD" }, "t2": { "id": 9, "c1": "A", "c2": "DD", "c3": "AA", "c4": 109, "c5": 1, "c6": "2019-01-10" }, "t3": { "c4": 109 } }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index 7191d03..349da99 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -5259,6 +5259,11 @@
</compilation-unit>
</test-case>
<test-case FilePath="index-selection">
+ <compilation-unit name="intersection-misc-01">
+ <output-dir compare="Text">intersection-misc-01</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="index-selection">
<compilation-unit name="intersection-with-between">
<output-dir compare="Text">intersection-with-between</output-dir>
</compilation-unit>
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/IntersectOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/IntersectOperator.java
index c2e4541..4af2d86 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/IntersectOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/IntersectOperator.java
@@ -110,23 +110,25 @@
public IVariableTypeEnvironment computeOutputTypeEnvironment(ITypingContext ctx) throws AlgebricksException {
IVariableTypeEnvironment typeEnv = ctx.getOutputTypeEnvironment(inputs.get(0).getValue());
+ List<LogicalVariable> compareVars0 = compareVars.get(0);
for (int i = 1; i < inputs.size(); i++) {
- checkTypeConsistency(typeEnv, compareVars.get(0), ctx.getOutputTypeEnvironment(inputs.get(i).getValue()),
+ checkTypeConsistency(typeEnv, compareVars0, ctx.getOutputTypeEnvironment(inputs.get(i).getValue()),
compareVars.get(i));
}
IVariableTypeEnvironment env =
new NonPropagatingTypeEnvironment(ctx.getExpressionTypeComputer(), ctx.getMetadataProvider());
int i = 0;
- for (; i < compareVars.get(0).size(); i++) {
- env.setVarType(outputVars.get(i), typeEnv.getVarType(compareVars.get(0).get(i)));
+ for (; i < compareVars0.size(); i++) {
+ env.setVarType(outputVars.get(i), typeEnv.getVarType(compareVars0.get(i)));
}
if (extraVars != null) {
- for (int k = 0; k < extraVars.get(0).size(); k++) {
- env.setVarType(outputVars.get(i + k), typeEnv.getVarType(extraVars.get(0).get(k)));
+ List<LogicalVariable> extraVars0 = extraVars.get(0);
+ for (int k = 0; k < extraVars0.size(); k++) {
+ env.setVarType(outputVars.get(i + k), typeEnv.getVarType(extraVars0.get(k)));
}
}
- return typeEnv;
+ return env;
}
public List<LogicalVariable> getOutputVars() {
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/OperatorDeepCopyVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/OperatorDeepCopyVisitor.java
index 1d64ad0..33e1bfa 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/OperatorDeepCopyVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/OperatorDeepCopyVisitor.java
@@ -209,12 +209,18 @@
@Override
public ILogicalOperator visitIntersectOperator(IntersectOperator op, Void arg) throws AlgebricksException {
- List<LogicalVariable> outputVar = new ArrayList<>(op.getOutputVars());
- List<List<LogicalVariable>> inputVars = new ArrayList<>(op.getNumInput());
- for (int i = 0; i < op.getNumInput(); i++) {
- inputVars.add(new ArrayList<>(op.getInputVariables(i)));
+ List<LogicalVariable> newOutputVars = new ArrayList<>(op.getOutputVars());
+ int numInput = op.getNumInput();
+ List<List<LogicalVariable>> newCompareVars = new ArrayList<>(numInput);
+ List<List<LogicalVariable>> extraVars = op.getExtraVariables();
+ List<List<LogicalVariable>> newExtraVars = extraVars != null ? new ArrayList<>(numInput) : null;
+ for (int i = 0; i < numInput; i++) {
+ newCompareVars.add(new ArrayList<>(op.getCompareVariables(i)));
+ if (extraVars != null) {
+ newExtraVars.add(new ArrayList<>(extraVars.get(i)));
+ }
}
- return new IntersectOperator(outputVar, inputVars);
+ return new IntersectOperator(newOutputVars, newCompareVars, newExtraVars);
}
@Override
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IntersectPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IntersectPOperator.java
index 544c546..d484fdf 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IntersectPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IntersectPOperator.java
@@ -31,6 +31,7 @@
import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
import org.apache.hyracks.algebricks.core.algebra.base.PhysicalOperatorTag;
+import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
import org.apache.hyracks.algebricks.core.algebra.operators.logical.IOperatorSchema;
import org.apache.hyracks.algebricks.core.algebra.operators.logical.IntersectOperator;
@@ -114,14 +115,15 @@
int nInput = logicalOp.getNumInput();
int[][] compareFields = new int[nInput][];
- IBinaryComparatorFactory[] comparatorFactories = JobGenHelper.variablesToAscBinaryComparatorFactories(
- logicalOp.getCompareVariables(0), context.getTypeEnvironment(op), context);
+ List<LogicalVariable> compareVars0 = logicalOp.getCompareVariables(0);
+ IVariableTypeEnvironment inputTypeEnv0 = context.getTypeEnvironment(logicalOp.getInputs().get(0).getValue());
+ IBinaryComparatorFactory[] comparatorFactories =
+ JobGenHelper.variablesToAscBinaryComparatorFactories(compareVars0, inputTypeEnv0, context);
INormalizedKeyComputerFactoryProvider nkcfProvider = context.getNormalizedKeyComputerFactoryProvider();
INormalizedKeyComputerFactory nkcf = null;
-
if (nkcfProvider != null) {
- Object type = context.getTypeEnvironment(op).getVarType(logicalOp.getCompareVariables(0).get(0));
+ Object type = inputTypeEnv0.getVarType(compareVars0.get(0));
if (type != null) {
nkcf = nkcfProvider.getNormalizedKeyComputerFactory(type, true);
}
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java
index 7b49117..2dd55c1 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java
@@ -271,6 +271,22 @@
}
buffer.append(str(op.getInputVariables(i).get(j)));
}
+ buffer.append("] cmp [");
+ for (int j = 0; j < op.getCompareVariables(i).size(); j++) {
+ if (j > 0) {
+ buffer.append(", ");
+ }
+ buffer.append(str(op.getCompareVariables(i).get(j)));
+ }
+ if (op.getExtraVariables() != null) {
+ buffer.append("] ext [");
+ for (int j = 0; j < op.getExtraVariables().get(i).size(); j++) {
+ if (j > 0) {
+ buffer.append(", ");
+ }
+ buffer.append(str(op.getExtraVariables().get(i).get(j)));
+ }
+ }
buffer.append(']');
}
buffer.append("])");
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/HeuristicOptimizer.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/HeuristicOptimizer.java
index 64b3f00..426e9fb 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/HeuristicOptimizer.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/HeuristicOptimizer.java
@@ -43,13 +43,6 @@
private final List<Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>> physicalRewrites;
private final ILogicalPlan plan;
- private static final PhysicalOperatorTag[] hyracksOperators =
- new PhysicalOperatorTag[] { PhysicalOperatorTag.DATASOURCE_SCAN, PhysicalOperatorTag.BTREE_SEARCH,
- PhysicalOperatorTag.EXTERNAL_GROUP_BY, PhysicalOperatorTag.HDFS_READER,
- PhysicalOperatorTag.HYBRID_HASH_JOIN, PhysicalOperatorTag.IN_MEMORY_HASH_JOIN,
- PhysicalOperatorTag.NESTED_LOOP, PhysicalOperatorTag.PRE_SORTED_DISTINCT_BY,
- PhysicalOperatorTag.PRE_CLUSTERED_GROUP_BY, PhysicalOperatorTag.REPLICATE,
- PhysicalOperatorTag.STABLE_SORT, PhysicalOperatorTag.UNION_ALL, PhysicalOperatorTag.FORWARD };
public static final PhysicalOperatorTag[] hyraxOperatorsBelowWhichJobGenIsDisabled = new PhysicalOperatorTag[] {};
public HeuristicOptimizer(ILogicalPlan plan,
@@ -62,15 +55,6 @@
this.physicalRewrites = physicalRewrites;
}
- public static boolean isHyracksOp(PhysicalOperatorTag opTag) {
- for (PhysicalOperatorTag t : hyracksOperators) {
- if (t == opTag) {
- return true;
- }
- }
- return false;
- }
-
public void optimize() throws AlgebricksException {
if (plan == null) {
return;
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java
index 166114a..176ab7a 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java
@@ -48,7 +48,6 @@
import org.apache.hyracks.algebricks.core.algebra.operators.physical.OneToOneExchangePOperator;
import org.apache.hyracks.algebricks.core.algebra.operators.physical.ReplicatePOperator;
import org.apache.hyracks.algebricks.core.algebra.operators.physical.StreamProjectPOperator;
-import org.apache.hyracks.algebricks.core.rewriter.base.HeuristicOptimizer;
import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
import org.apache.hyracks.api.exceptions.SourceLocation;
@@ -259,7 +258,8 @@
int index = parentOp.getInputs().indexOf(ref);
ILogicalOperator childOp =
parentOp.getOperatorTag() == LogicalOperatorTag.PROJECT ? assignOperator : projectOperator;
- if (!HeuristicOptimizer.isHyracksOp(parentOp.getPhysicalOperator().getOperatorTag())) {
+ if (parentOp.getPhysicalOperator().isMicroOperator()
+ || parentOp.getOperatorTag() == LogicalOperatorTag.EXCHANGE) {
parentOp.getInputs().set(index, new MutableObject<ILogicalOperator>(childOp));
} else {
// If the parent operator is a hyracks operator,