[ASTERIXDB-3399][COMP] Nested Loops index joins costing

Change-Id: I44740b77b88bc4c8b440d02162318113642cb880
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18320
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Vijay Sarathy <vijay.sarathy@couchbase.com>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
index d5743e4..e868fa3 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
@@ -672,7 +672,11 @@
                 // dataCost (0) will contain the dataScan cost with the first index
                 //dataCost (1) will contain the dataScan cost with the first index and the 2nd index and so on.
                 sel *= optionalIndexesInfo.get(i).second; // assuming selectivities are independent for now
-                dataCosts.add(joinEnum.getCostMethodsHandle().costIndexDataScan(this, sel)); // D0; D01; D012; ...
+                if (optionalIndexesInfo.get(i).first.isPrimaryIndex()) {
+                    dataCosts.add(joinEnum.getCostHandle().zeroCost());
+                } else {
+                    dataCosts.add(joinEnum.getCostMethodsHandle().costIndexDataScan(this, sel)); // D0; D01; D012; ...
+                }
             }
 
             // At the of of the above loop, I0, I1, I2 ... have been computed
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.3.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.3.plan
index c86ab50..8a6990c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.3.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.3.plan
@@ -1,46 +1,46 @@
-distribute result [$$48] [cardinality: 100.0, op-cost: 0.0, total-cost: 4497.18]
+distribute result [$$48] [cardinality: 100.0, op-cost: 0.0, total-cost: 4495.77]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 4497.18]
+  exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 4495.77]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$48]) [cardinality: 100.0, op-cost: 0.0, total-cost: 4497.18]
+    project ([$$48]) [cardinality: 100.0, op-cost: 0.0, total-cost: 4495.77]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$48] <- [{"$1": $$51}] [cardinality: 100.0, op-cost: 0.0, total-cost: 4497.18]
+      assign [$$48] <- [{"$1": $$51}] [cardinality: 100.0, op-cost: 0.0, total-cost: 4495.77]
       -- ASSIGN  |PARTITIONED|
-        project ([$$51]) [cardinality: 100.0, op-cost: 0.0, total-cost: 4497.18]
+        project ([$$51]) [cardinality: 100.0, op-cost: 0.0, total-cost: 4495.77]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 4497.18]
+          exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 4495.77]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
             group by ([$$o_custkey := $$54]) decor ([]) {
                       aggregate [$$51] <- [sql-sum-serial($$53)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- AGGREGATE  |LOCAL|
                         nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   } [cardinality: 100.0, op-cost: 1498.59, total-cost: 4497.18]
+                   } [cardinality: 100.0, op-cost: 1498.59, total-cost: 4495.77]
             -- EXTERNAL_GROUP_BY[$$54]  |PARTITIONED|
-              exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 2998.59]
+              exchange [cardinality: 100.0, op-cost: 0.0, total-cost: 2997.18]
               -- HASH_PARTITION_EXCHANGE [$$54]  |PARTITIONED|
                 group by ([$$54 := $$49]) decor ([]) {
                           aggregate [$$53] <- [sql-count-serial(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- AGGREGATE  |LOCAL|
                             nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- NESTED_TUPLE_SOURCE  |LOCAL|
-                       } [cardinality: 100.0, op-cost: 1498.59, total-cost: 2998.59]
+                       } [cardinality: 100.0, op-cost: 1498.59, total-cost: 2997.18]
                 -- EXTERNAL_GROUP_BY[$$49]  |PARTITIONED|
-                  exchange [cardinality: 1498.59, op-cost: 0.0, total-cost: 1500.0]
+                  exchange [cardinality: 1498.59, op-cost: 0.0, total-cost: 1498.59]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    project ([$$49]) [cardinality: 1498.59, op-cost: 0.0, total-cost: 1500.0]
+                    project ([$$49]) [cardinality: 1498.59, op-cost: 0.0, total-cost: 1498.59]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$49] <- [$$o.getField(1)] [cardinality: 1498.59, op-cost: 0.0, total-cost: 1500.0]
+                      assign [$$49] <- [$$o.getField(1)] [cardinality: 1498.59, op-cost: 0.0, total-cost: 1498.59]
                       -- ASSIGN  |PARTITIONED|
-                        project ([$$o]) [cardinality: 1498.59, op-cost: 0.0, total-cost: 1500.0]
+                        project ([$$o]) [cardinality: 1498.59, op-cost: 0.0, total-cost: 1498.59]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          exchange [cardinality: 1498.59, op-cost: 0.0, total-cost: 1500.0]
+                          exchange [cardinality: 1498.59, op-cost: 0.0, total-cost: 1498.59]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            unnest-map [$$50, $$o] <- index-search("Orders", 0, "Default", "tpch", "Orders", false, false, 1, $$55, 0, false, true, false) [cardinality: 1498.59, op-cost: 1500.0, total-cost: 1500.0]
+                            unnest-map [$$50, $$o] <- index-search("Orders", 0, "Default", "tpch", "Orders", false, false, 1, $$55, 0, false, true, false) [cardinality: 1498.59, op-cost: 1498.59, total-cost: 1498.59]
                             -- BTREE_SEARCH  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 assign [$$55] <- [2] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ASSIGN  |PARTITIONED|
                                   empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.4.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.4.plan
index 46521c5..6ea6385 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.4.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.4.plan
@@ -1,42 +1,42 @@
-distribute result [$$48] [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
+distribute result [$$48] [cardinality: 1495.77, op-cost: 0.0, total-cost: 4487.31]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
+  exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 4487.31]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$48]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
+    project ([$$48]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 4487.31]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$48] <- [{"$1": $$51}] [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
+      assign [$$48] <- [{"$1": $$51}] [cardinality: 1495.77, op-cost: 0.0, total-cost: 4487.31]
       -- ASSIGN  |PARTITIONED|
-        project ([$$51]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
+        project ([$$51]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 4487.31]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 4491.54]
+          exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 4487.31]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
             group by ([$$o_orderdate := $$54]) decor ([]) {
                       aggregate [$$51] <- [sql-sum-serial($$53)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- AGGREGATE  |LOCAL|
                         nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   } [cardinality: 1495.77, op-cost: 1495.77, total-cost: 4491.54]
+                   } [cardinality: 1495.77, op-cost: 1495.77, total-cost: 4487.31]
             -- EXTERNAL_GROUP_BY[$$54]  |PARTITIONED|
-              exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 2995.77]
+              exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 2991.54]
               -- HASH_PARTITION_EXCHANGE [$$54]  |PARTITIONED|
                 group by ([$$54 := $$49]) decor ([]) {
                           aggregate [$$53] <- [sql-count-serial(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- AGGREGATE  |LOCAL|
                             nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- NESTED_TUPLE_SOURCE  |LOCAL|
-                       } [cardinality: 1495.77, op-cost: 1495.77, total-cost: 2995.77]
+                       } [cardinality: 1495.77, op-cost: 1495.77, total-cost: 2991.54]
                 -- EXTERNAL_GROUP_BY[$$49]  |PARTITIONED|
-                  exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 1500.0]
+                  exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 1495.77]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    project ([$$49]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 1500.0]
+                    project ([$$49]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 1495.77]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      assign [$$49] <- [$$o.getField(4)] [cardinality: 1495.77, op-cost: 0.0, total-cost: 1500.0]
+                      assign [$$49] <- [$$o.getField(4)] [cardinality: 1495.77, op-cost: 0.0, total-cost: 1495.77]
                       -- ASSIGN  |PARTITIONED|
-                        project ([$$o]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 1500.0]
+                        project ([$$o]) [cardinality: 1495.77, op-cost: 0.0, total-cost: 1495.77]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 1500.0]
+                          exchange [cardinality: 1495.77, op-cost: 0.0, total-cost: 1495.77]
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            unnest-map [$$50, $$o] <- index-search("Orders", 0, "Default", "tpch", "Orders", false, false, 1, $$55, 0, false, true, false) [cardinality: 1495.77, op-cost: 1500.0, total-cost: 1500.0]
+                            unnest-map [$$50, $$o] <- index-search("Orders", 0, "Default", "tpch", "Orders", false, false, 1, $$55, 0, false, true, false) [cardinality: 1495.77, op-cost: 1495.77, total-cost: 1495.77]
                             -- BTREE_SEARCH  |PARTITIONED|
                               exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.7.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.7.plan
index f192363..7eb0d3f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.7.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.7.plan
@@ -1,48 +1,48 @@
-distribute result [$$51] [cardinality: 191.0, op-cost: 0.0, total-cost: 8648.78]
+distribute result [$$51] [cardinality: 191.0, op-cost: 0.0, total-cost: 3965.67]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
-  exchange [cardinality: 191.0, op-cost: 0.0, total-cost: 8648.78]
+  exchange [cardinality: 191.0, op-cost: 0.0, total-cost: 3965.67]
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$51]) [cardinality: 191.0, op-cost: 0.0, total-cost: 8648.78]
+    project ([$$51]) [cardinality: 191.0, op-cost: 0.0, total-cost: 3965.67]
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$51] <- [{"$1": $$55}] [cardinality: 191.0, op-cost: 0.0, total-cost: 8648.78]
+      assign [$$51] <- [{"$1": $$55}] [cardinality: 191.0, op-cost: 0.0, total-cost: 3965.67]
       -- ASSIGN  |PARTITIONED|
-        project ([$$55]) [cardinality: 191.0, op-cost: 0.0, total-cost: 8648.78]
+        project ([$$55]) [cardinality: 191.0, op-cost: 0.0, total-cost: 3965.67]
         -- STREAM_PROJECT  |PARTITIONED|
-          exchange [cardinality: 191.0, op-cost: 0.0, total-cost: 8648.78]
+          exchange [cardinality: 191.0, op-cost: 0.0, total-cost: 3965.67]
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
             group by ([$$l_partkey := $$59]) decor ([]) {
                       aggregate [$$55] <- [sql-sum-serial($$58)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                       -- AGGREGATE  |LOCAL|
                         nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                         -- NESTED_TUPLE_SOURCE  |LOCAL|
-                   } [cardinality: 191.0, op-cost: 1321.89, total-cost: 8648.78]
+                   } [cardinality: 191.0, op-cost: 1321.89, total-cost: 3965.67]
             -- EXTERNAL_GROUP_BY[$$59]  |PARTITIONED|
-              exchange [cardinality: 191.0, op-cost: 0.0, total-cost: 7326.89]
+              exchange [cardinality: 191.0, op-cost: 0.0, total-cost: 2643.78]
               -- HASH_PARTITION_EXCHANGE [$$59]  |PARTITIONED|
                 group by ([$$59 := $$52]) decor ([]) {
                           aggregate [$$58] <- [sql-count-serial(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                           -- AGGREGATE  |LOCAL|
                             nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                             -- NESTED_TUPLE_SOURCE  |LOCAL|
-                       } [cardinality: 191.0, op-cost: 1321.89, total-cost: 7326.89]
+                       } [cardinality: 191.0, op-cost: 1321.89, total-cost: 2643.78]
                 -- EXTERNAL_GROUP_BY[$$52]  |PARTITIONED|
-                  exchange [cardinality: 1321.89, op-cost: 0.0, total-cost: 6005.0]
+                  exchange [cardinality: 1321.89, op-cost: 0.0, total-cost: 1321.89]
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    project ([$$52]) [cardinality: 1321.89, op-cost: 0.0, total-cost: 6005.0]
+                    project ([$$52]) [cardinality: 1321.89, op-cost: 0.0, total-cost: 1321.89]
                     -- STREAM_PROJECT  |PARTITIONED|
-                      select (and(gt($$53, 1), gt($$54, 4))) [cardinality: 1321.89, op-cost: 0.0, total-cost: 6005.0]
+                      select (and(gt($$53, 1), gt($$54, 4))) [cardinality: 1321.89, op-cost: 0.0, total-cost: 1321.89]
                       -- STREAM_SELECT  |PARTITIONED|
-                        project ([$$53, $$54, $$52]) [cardinality: 1321.89, op-cost: 0.0, total-cost: 6005.0]
+                        project ([$$53, $$54, $$52]) [cardinality: 1321.89, op-cost: 0.0, total-cost: 1321.89]
                         -- STREAM_PROJECT  |PARTITIONED|
-                          assign [$$52] <- [$$l.getField(1)] [cardinality: 1321.89, op-cost: 0.0, total-cost: 6005.0]
+                          assign [$$52] <- [$$l.getField(1)] [cardinality: 1321.89, op-cost: 0.0, total-cost: 1321.89]
                           -- ASSIGN  |PARTITIONED|
-                            exchange [cardinality: 1321.89, op-cost: 0.0, total-cost: 6005.0]
+                            exchange [cardinality: 1321.89, op-cost: 0.0, total-cost: 1321.89]
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              unnest-map [$$53, $$54, $$l] <- index-search("LineItem", 0, "Default", "tpch", "LineItem", false, false, 2, $$60, $$61, 0, true, true, false) [cardinality: 1321.89, op-cost: 6005.0, total-cost: 6005.0]
+                              unnest-map [$$53, $$54, $$l] <- index-search("LineItem", 0, "Default", "tpch", "LineItem", false, false, 2, $$60, $$61, 0, true, true, false) [cardinality: 1321.89, op-cost: 1321.89, total-cost: 1321.89]
                               -- BTREE_SEARCH  |PARTITIONED|
                                 exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   assign [$$60, $$61] <- [1, 4] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
                                   -- ASSIGN  |PARTITIONED|
                                     empty-tuple-source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|