瀏覽代碼

HPCC-9065 Restructure code while investigating optimization

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 11 年之前
父節點
當前提交
30c6ce7fa0
共有 4 個文件被更改,包括 39 次插入35 次删除
  1. 5 4
      ecl/hqlcpp/hqlcpp.cpp
  2. 4 4
      ecl/hqlcpp/hqlcpp.ipp
  3. 29 26
      ecl/hqlcpp/hqlhtcpp.cpp
  4. 1 1
      ecl/hqlcpp/hqlsource.cpp

+ 5 - 4
ecl/hqlcpp/hqlcpp.cpp

@@ -8523,7 +8523,7 @@ void HqlCppTranslator::doBuildAssignCompareElement(BuildCtx & ctx, EvaluateCompa
             subctx.addBreak();
             break;
         case return_stmt:
-            if (!isLast || info.hasDefault)
+            if (!isLast || info.neverReturnMatch)
                 subctx.addFilter(info.target.expr);
             else
                 info.alwaysReturns = true;
@@ -8580,7 +8580,7 @@ void HqlCppTranslator::doBuildAssignOrder(BuildCtx & ctx, const CHqlBoundTarget
         buildExprAssign(ctx, target, queryZero());
 }
 
-void HqlCppTranslator::doBuildReturnCompare(BuildCtx & ctx, IHqlExpression * expr, node_operator op, bool isBoolEquality)
+void HqlCppTranslator::doBuildReturnCompare(BuildCtx & ctx, IHqlExpression * expr, node_operator op, bool isBoolEquality, bool neverReturnTrue)
 {
     HqlExprArray leftValues, rightValues;
     OwnedHqlExpr defaultValue;
@@ -8590,13 +8590,14 @@ void HqlCppTranslator::doBuildReturnCompare(BuildCtx & ctx, IHqlExpression * exp
     EvaluateCompareInfo info(op);
     info.actionIfDiffer = return_stmt;
     info.isBoolEquality = isBoolEquality;
-    info.hasDefault = (defaultValue != NULL);
+    info.neverReturnMatch = (defaultValue != NULL) || neverReturnTrue;
 
     createTempFor(ctx, expr, info.target);
 
     doBuildAssignCompare(ctx, info, leftValues, rightValues, true, true);
 
-    if (!info.alwaysReturns)
+    assertex(!(neverReturnTrue && info.alwaysReturns));
+    if (!info.alwaysReturns && !neverReturnTrue)
     {
         if (info.isBoolEquality)
         {

+ 4 - 4
ecl/hqlcpp/hqlcpp.ipp

@@ -749,12 +749,12 @@ class NlpParseContext;
 struct EvaluateCompareInfo
 {
 public:
-    EvaluateCompareInfo(node_operator _op) { actionIfDiffer = null_stmt; op = _op; isBoolEquality = false; hasDefault = true; alwaysReturns = false; }
+    EvaluateCompareInfo(node_operator _op) { actionIfDiffer = null_stmt; op = _op; isBoolEquality = false; neverReturnMatch = true; alwaysReturns = false; }
     EvaluateCompareInfo(const EvaluateCompareInfo & info)
     {
         target.set(info.target); actionIfDiffer = info.actionIfDiffer; op = info.op; isBoolEquality = info.isBoolEquality;
         alwaysReturns = false;
-        hasDefault = true;
+        neverReturnMatch = true;
     }
 
     bool isEqualityCompare() const { return op == no_eq; }
@@ -764,7 +764,7 @@ public:
     node_operator op;
     StmtKind actionIfDiffer;
     bool isBoolEquality;
-    bool hasDefault;
+    bool neverReturnMatch;
     bool alwaysReturns;
 };
 
@@ -1263,7 +1263,7 @@ public:
 
     void doBuildRowIfBranch(BuildCtx & initctx, BuildCtx & ctx, BoundRow * targetRow, IHqlExpression * branchExpr);
 
-    void doBuildReturnCompare(BuildCtx & ctx, IHqlExpression * expr, node_operator op, bool isBoolEquality);
+    void doBuildReturnCompare(BuildCtx & ctx, IHqlExpression * expr, node_operator op, bool isBoolEquality, bool neverReturnTrue);
     void buildReturnOrder(BuildCtx & ctx, IHqlExpression *sortList, const DatasetReference & dataset);
 
     IHqlExpression * createLoopSubquery(IHqlExpression * dataset, IHqlExpression * selSeq, IHqlExpression * rowsid, IHqlExpression * body, IHqlExpression * filter, IHqlExpression * again, IHqlExpression * counter, bool multiInstance, unsigned & loopAgainResult);

+ 29 - 26
ecl/hqlcpp/hqlhtcpp.cpp

@@ -5237,7 +5237,7 @@ void HqlCppTranslator::buildCompareClass(BuildCtx & ctx, const char * name, IHql
     bindTableCursor(funcctx, datasetLeft, "left", no_left, selSeq);
     bindTableCursor(funcctx, datasetRight, "right", no_right, selSeq);
     if (orderExpr->getOperator() == no_order)
-        doBuildReturnCompare(funcctx, orderExpr, no_order, false);
+        doBuildReturnCompare(funcctx, orderExpr, no_order, false, false);
     else
         buildReturn(funcctx, orderExpr);
 
@@ -5284,7 +5284,7 @@ void HqlCppTranslator::buildCompareEqClass(BuildCtx & ctx, const char * name, IH
     bindTableCursor(funcctx, datasetLeft, "left", no_left, selSeq);
     bindTableCursor(funcctx, datasetRight, "right", no_right, selSeq);
     if (orderExpr->getOperator() == no_order)
-        doBuildReturnCompare(funcctx, orderExpr, no_eq, true);
+        doBuildReturnCompare(funcctx, orderExpr, no_eq, true, false);
     else
         buildReturn(funcctx, orderExpr);
 
@@ -13635,33 +13635,36 @@ void HqlCppTranslator::buildDedupFilterFunction(BuildCtx & ctx, HqlExprArray & e
             i1++;
     }
 
-    ForEachItemIn(i, comparisons)
+    if (comparisons.ordinality() || allEqualities.ordinality())
     {
-        IHqlExpression * cur = &comparisons.item(i);
-        //if no equalities to follow, generate a return for the last non-equality
-        if (allEqualities.empty() && (i+1 == numComparisons))
+        ForEachItemIn(i, comparisons)
         {
-            buildReturn(filterctx, cur);
-        }
-        else
-        {
-            OwnedHqlExpr inverse = getInverse(cur);
-            buildFilteredReturn(filterctx, inverse, queryBoolExpr(false));
+            IHqlExpression * cur = &comparisons.item(i);
+            //if no equalities to follow, generate a return for the last non-equality
+            if (allEqualities.empty() && (i+1 == numComparisons))
+            {
+                buildReturn(filterctx, cur);
+            }
+            else
+            {
+                OwnedHqlExpr inverse = getInverse(cur);
+                buildFilteredReturn(filterctx, inverse, queryBoolExpr(false));
+            }
         }
-    }
 
-    if (allEqualities.ordinality())
-    {
-        HqlExprArray optimized;
-        //Even better... sort the equality list by the field order...
-        if (options.optimizeGrouping && (allEqualities.ordinality() > 1))
-            optimizeGroupOrder(optimized, dataset, allEqualities);
-        appendArray(optimized, allEqualities);
+        if (allEqualities.ordinality())
+        {
+            HqlExprArray optimized;
+            //Even better... sort the equality list by the field order...
+            if (options.optimizeGrouping && (allEqualities.ordinality() > 1))
+                optimizeGroupOrder(optimized, dataset, allEqualities);
+            appendArray(optimized, allEqualities);
 
-        OwnedHqlExpr order = createOrderFromCompareArray(optimized, dataset, lRow->querySelector(), rRow->querySelector());
-        doBuildReturnCompare(filterctx, order, no_eq, true);
+            OwnedHqlExpr order = createOrderFromCompareArray(optimized, dataset, lRow->querySelector(), rRow->querySelector());
+            doBuildReturnCompare(filterctx, order, no_eq, true, false);
+        }
     }
-    else if (comparisons.ordinality() == 0)
+    else
         functionStmt->setIncluded(false);           // Use the implementation in the base class
 }
 
@@ -15589,7 +15592,7 @@ void HqlCppTranslator::buildReturnOrder(BuildCtx & ctx, IHqlExpression *sortList
     bindTableCursor(ctx, dataset.queryDataset(), "left", no_left, selSeq);
     bindTableCursor(ctx, dataset.queryDataset(), "right", no_right, selSeq);
 
-    doBuildReturnCompare(ctx, order, no_order, false);
+    doBuildReturnCompare(ctx, order, no_order, false, false);
 }
 
 void HqlCppTranslator::doBuildFuncIsSameGroup(BuildCtx & ctx, IHqlExpression * dataset, IHqlExpression * sortlist)
@@ -15666,7 +15669,7 @@ void HqlCppTranslator::doBuildFuncIsSameGroup(BuildCtx & ctx, IHqlExpression * d
             if (orderResult)
             {
                 buildFilteredReturn(funcctx, result, trueExpr);
-                doBuildReturnCompare(funcctx, orderResult, no_eq, true);
+                doBuildReturnCompare(funcctx, orderResult, no_eq, true, false);
             }
             else
             {
@@ -15676,7 +15679,7 @@ void HqlCppTranslator::doBuildFuncIsSameGroup(BuildCtx & ctx, IHqlExpression * d
         else
         {
             if (orderResult)
-                doBuildReturnCompare(funcctx, orderResult, no_eq, true);
+                doBuildReturnCompare(funcctx, orderResult, no_eq, true, false);
             else
                 buildReturn(funcctx, trueExpr);
         }

+ 1 - 1
ecl/hqlcpp/hqlsource.cpp

@@ -2162,7 +2162,7 @@ void SourceBuilder::buildGroupAggregateCompareHelper(ParentExtract * extractBuil
     funcctx.associateExpr(constantMemberMarkerExpr, constantMemberMarkerExpr);
 
     translator.bindTableCursor(funcctx, aggregate, "right", no_right, selSeq);
-    translator.doBuildReturnCompare(funcctx, order, no_eq, false);
+    translator.doBuildReturnCompare(funcctx, order, no_eq, false, false);
 
     translator.endNestedClass();
 }