You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by dl...@apache.org on 2019/06/21 18:04:36 UTC

[asterixdb] branch master updated: [NO ISSUE][COMP] Stop reusing variables of Intersect operator

This is an automated email from the ASF dual-hosted git repository.

dlych pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new f86ab94  [NO ISSUE][COMP] Stop reusing variables of Intersect operator
f86ab94 is described below

commit f86ab9414d05ac4d53f2fec1e8e7a0cb461e1ca4
Author: Dmitry Lychagin <dm...@couchbase.com>
AuthorDate: Wed Jun 19 15:12:24 2019 -0700

    [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 <je...@fulliautomatix.ics.uci.edu>
    Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Reviewed-by: Dmitry Lychagin <dm...@couchbase.com>
    Reviewed-by: Ali Alsuliman <al...@gmail.com>
---
 .../rules/am/IntroduceLSMComponentFilterRule.java  |   7 +-
 .../rules/am/IntroduceSelectAccessMethodRule.java  |  13 ++-
 .../rules/am/OptimizableOperatorSubTree.java       |   2 +
 .../intersection-misc/intersection-misc-01.sqlpp   |  56 +++++++++
 .../intersection-misc/intersection-misc-02.sqlpp   |  56 +++++++++
 .../intersection-misc/intersection-misc-03.sqlpp   |  56 +++++++++
 .../intersection-misc/intersection-misc-04.sqlpp   |  56 +++++++++
 .../intersection-misc/intersection-misc-01.plan    | 128 +++++++++++++++++++++
 .../intersection-misc/intersection-misc-02.plan    | 116 +++++++++++++++++++
 .../intersection-misc/intersection-misc-03.plan    | 110 ++++++++++++++++++
 .../intersection-misc/intersection-misc-04.plan    | 106 +++++++++++++++++
 .../results/multi-indexes/two-rtree-intersect.plan |  15 +--
 .../intersection-misc-01.1.ddl.sqlpp               |  38 ++++++
 .../intersection-misc-01.2.update.sqlpp            |  42 +++++++
 .../intersection-misc-01.3.query.sqlpp             |  42 +++++++
 .../intersection-misc-01.4.query.sqlpp             |  42 +++++++
 .../intersection-misc-01.5.query.sqlpp             |  42 +++++++
 .../intersection-misc-01.6.query.sqlpp             |  42 +++++++
 .../intersection-misc-01.3.adm                     |  28 +++++
 .../intersection-misc-01.4.adm                     |  28 +++++
 .../intersection-misc-01.5.adm                     |  28 +++++
 .../intersection-misc-01.6.adm                     |  28 +++++
 .../test/resources/runtimets/testsuite_sqlpp.xml   |   5 +
 .../operators/logical/IntersectOperator.java       |  14 ++-
 .../logical/visitors/OperatorDeepCopyVisitor.java  |  16 ++-
 .../operators/physical/IntersectPOperator.java     |  10 +-
 .../LogicalOperatorPrettyPrintVisitor.java         |  16 +++
 .../core/rewriter/base/HeuristicOptimizer.java     |  16 ---
 .../rewriter/rules/ExtractCommonOperatorsRule.java |   4 +-
 29 files changed, 1118 insertions(+), 44 deletions(-)

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 @@ public class IntroduceLSMComponentFilterRule implements IAlgebraicRewriteRule {
                         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.DelegateOper
 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 @@ public class IntroduceSelectAccessMethodRule extends AbstractIntroduceAccessMeth
             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 @@ public class IntroduceSelectAccessMethodRule extends AbstractIntroduceAccessMeth
         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 @@ public class OptimizableOperatorSubTree {
         setRootRef(null);
         getAssignsAndUnnestsRefs().clear();
         getAssignsAndUnnests().clear();
+        getVarsToFieldNameMap().clear();
         setDataSourceRef(null);
         setDataSourceType(DataSourceType.NO_DATASOURCE);
         setIxJoinOuterAdditionalDataSourceRefs(null);
@@ -384,6 +385,7 @@ public class OptimizableOperatorSubTree {
         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 class IntersectOperator extends AbstractLogicalOperator {
     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 @@ public class OperatorDeepCopyVisitor implements ILogicalOperatorVisitor<ILogical
 
     @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.ILogicalOperator;
 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 @@ public class IntersectPOperator extends AbstractPhysicalOperator {
         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 @@ public class LogicalOperatorPrettyPrintVisitor extends AbstractLogicalOperatorPr
                 }
                 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 @@ public class HeuristicOptimizer {
     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 @@ public class HeuristicOptimizer {
         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.AssignPOper
 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 @@ public class ExtractCommonOperatorsRule implements IAlgebraicRewriteRule {
                     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,