>From <[email protected]>:

[email protected] has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18290 )


Change subject: [ASTERIXDB-3399][COMP] Adding support for Primary index nested 
loop joins
......................................................................

[ASTERIXDB-3399][COMP] Adding support for Primary index nested loop joins

Change-Id: I832db938f9bb704b13a0dd76d71d2c3edb12adf1
---
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/PlanNode.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinNode.java
2 files changed, 34 insertions(+), 3 deletions(-)



  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/90/18290/1

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 0ff630d..d5743e4 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
@@ -87,6 +87,7 @@
     protected List<String> datasetNames;
     protected List<String> aliases;
     protected int cheapestPlanIndex;
+    protected PlanNode cheapestPlanNode;
     private ICost cheapestPlanCost;
     protected double origCardinality; // without any selections
     protected double cardinality;
@@ -119,6 +120,7 @@
         this.jnArrayIndex = i;
         planIndexesArray = new ArrayList<>();
         cheapestPlanIndex = PlanNode.NO_PLAN;
+        cheapestPlanNode = null;
         size = 1; // for now, will be the size of the doc for this joinNode
     }

@@ -149,6 +151,10 @@
         return origCardinality;
     }

+    public PlanNode getCheapestPlanNode() {
+        return cheapestPlanNode;
+    }
+
     protected void setOrigCardinality(double card, boolean setMinCard) {
         // Minimum cardinality for operators is MIN_CARD to prevent bad plans 
due to cardinality under estimation errors.
         origCardinality = setMinCard ? Math.max(card, Cost.MIN_CARD) : card;
@@ -707,7 +713,7 @@
         boolean forceEnum = mandatoryIndexesInfo.size() > 0 || level <= 
joinEnum.cboFullEnumLevel;
         if (opCost.costLT(this.cheapestPlanCost) || forceEnum) {
             pn = new PlanNode(allPlans.size(), joinEnum, this, 
datasetNames.get(0), leafInput);
-            pn.setScanAndHintInfo(PlanNode.ScanMethod.INDEX_SCAN, 
mandatoryIndexesInfo);
+            pn.setScanAndHintInfo(PlanNode.ScanMethod.INDEX_SCAN, 
mandatoryIndexesInfo, optionalIndexesInfo);
             pn.setScanCosts(totalCost);
             planIndexesArray.add(pn.allPlansIndex);
             allPlans.add(pn);
@@ -1443,6 +1449,7 @@
         PlanNode cheapestPlan = forceEnum ? findCheapestPlan() : pn;
         cheapestPlanCost = cheapestPlan.totalCost;
         cheapestPlanIndex = cheapestPlan.allPlansIndex;
+        cheapestPlanNode = cheapestPlan;
     }

     @Override
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/PlanNode.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/PlanNode.java
index e51990e..e2f7faf 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/PlanNode.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/PlanNode.java
@@ -49,6 +49,7 @@

     protected ScanMethod scanOp;
     protected boolean indexHint;
+    Index indexUsed = null;

     protected JoinMethod joinOp;

@@ -81,6 +82,10 @@
         return allPlansIndex;
     }

+    public Index getSoleAccessIndex() {
+        return indexUsed;
+    }
+
     private int[] getPlanIndexes() {
         return planIndexes;
     }
@@ -143,7 +148,7 @@
         return getLeftPlanIndex() == NO_PLAN && getRightPlanIndex() == NO_PLAN;
     }
 
-    protected boolean IsJoinNode() {
+    public boolean IsJoinNode() {
         return getLeftPlanIndex() != NO_PLAN && getRightPlanIndex() != NO_PLAN;
     }

@@ -279,12 +284,22 @@
     }

     protected void setScanAndHintInfo(ScanMethod scanMethod,
-            List<Triple<Index, Double, AbstractFunctionCallExpression>> 
mandatoryIndexesInfo) {
+            List<Triple<Index, Double, AbstractFunctionCallExpression>> 
mandatoryIndexesInfo,
+            List<Triple<Index, Double, AbstractFunctionCallExpression>> 
optionalIndexesInfo) {
         setScanMethod(scanMethod);
         if (mandatoryIndexesInfo.size() > 0) {
             indexHint = true;
             numHintsUsed = 1;
         }
+        // keeping things simple. When multiple indexes are used, we cannot be 
sure of the order.
+        // So seeing if only index is used.
+        if (optionalIndexesInfo.size() + mandatoryIndexesInfo.size() == 1) {
+            if (optionalIndexesInfo.size() == 1) {
+                indexUsed = optionalIndexesInfo.get(0).first;
+            } else {
+                indexUsed = mandatoryIndexesInfo.get(0).first;
+            }
+        }
     }

     protected void setScanCosts(ICost opCost) {

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18290
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings

Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Change-Id: I832db938f9bb704b13a0dd76d71d2c3edb12adf1
Gerrit-Change-Number: 18290
Gerrit-PatchSet: 1
Gerrit-Owner: [email protected]
Gerrit-MessageType: newchange

Reply via email to