瀏覽代碼

Merge pull request #9399 from ghalliday/issue16704b

HPCC-16704 Improvements to CHOOSEN() short circuiting for python datasets

Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 8 年之前
父節點
當前提交
fc6b707cfe
共有 3 個文件被更改,包括 12 次插入2 次删除
  1. 1 0
      ecl/hqlcpp/hqlcpp.ipp
  2. 9 2
      ecl/hqlcpp/hqlcppds.cpp
  3. 2 0
      ecl/hqlcpp/hqlinline.cpp

+ 1 - 0
ecl/hqlcpp/hqlcpp.ipp

@@ -933,6 +933,7 @@ public:
     bool canIterateInline(BuildCtx * ctx, IHqlExpression * expr);
     bool canAssignInline(BuildCtx * ctx, IHqlExpression * expr);
     bool canEvaluateInline(BuildCtx * ctx, IHqlExpression * expr);
+    bool canEvaluateInlineNoSpill(BuildCtx * ctx, IHqlExpression * expr);
 
     void buildAssignChildDataset(BuildCtx & ctx, const CHqlBoundTarget & target, IHqlExpression * expr);
     void buildChildDataset(BuildCtx & ctx, IHqlExpression * expr, CHqlBoundExpr & tgt);

+ 9 - 2
ecl/hqlcpp/hqlcppds.cpp

@@ -1942,6 +1942,13 @@ bool HqlCppTranslator::canEvaluateInline(BuildCtx * ctx, IHqlExpression * expr)
     return options.allowInlineSpill ? ::canProcessInline(ctx, expr) : ::canEvaluateInline(ctx, expr);
 }
 
+bool HqlCppTranslator::canEvaluateInlineNoSpill(BuildCtx * ctx, IHqlExpression * expr)
+{
+    if (!isInlineOk())
+        return false;
+    return ::canEvaluateInline(ctx, expr);
+}
+
 bool HqlCppTranslator::canProcessInline(BuildCtx * ctx, IHqlExpression * expr)
 {
     if (!isInlineOk())
@@ -2431,7 +2438,7 @@ void HqlCppTranslator::doBuildDataset(BuildCtx & ctx, IHqlExpression * expr, CHq
             if (format == FormatLinkedDataset || format == FormatArrayDataset)
             {
                 IHqlExpression * choosenLimit = NULL;
-                if ((op == no_choosen) && !isChooseNAllLimit(expr->queryChild(1)) && !queryRealChild(expr, 2) && (canEvaluateInline(&ctx, expr->queryChild(0)) || !canIterateInline(&ctx, expr->queryChild(0))))
+                if ((op == no_choosen) && !isChooseNAllLimit(expr->queryChild(1)) && !queryRealChild(expr, 2) && (canEvaluateInlineNoSpill(&ctx, expr->queryChild(0)) || !canIterateInline(&ctx, expr->queryChild(0))))
                 {
                     choosenLimit = expr->queryChild(1);
                     expr = expr->queryChild(0);
@@ -2807,7 +2814,7 @@ void HqlCppTranslator::buildDatasetAssign(BuildCtx & ctx, const CHqlBoundTarget
         else
         {
             IHqlExpression * choosenLimit = NULL;
-            if ((op == no_choosen) && !isChooseNAllLimit(expr->queryChild(1)) && !queryRealChild(expr, 2) && (canEvaluateInline(&ctx, expr->queryChild(0)) || !canIterateInline(&ctx, expr->queryChild(0))))
+            if ((op == no_choosen) && !isChooseNAllLimit(expr->queryChild(1)) && !queryRealChild(expr, 2) && (canEvaluateInlineNoSpill(&ctx, expr->queryChild(0)) || !canIterateInline(&ctx, expr->queryChild(0))))
             {
                 choosenLimit = expr->queryChild(1);
                 expr = expr->queryChild(0);

+ 2 - 0
ecl/hqlcpp/hqlinline.cpp

@@ -113,6 +113,8 @@ static unsigned calcInlineFlags(BuildCtx * ctx, IHqlExpression * expr)
     case no_call:
     case no_externalcall:               // no so sure about this - should possibly be assignable only. (also no_call above)
     case no_getresult:
+        if (isStreamed(expr))
+            return RETiterate;
         return RETassign;
     }