Quellcode durchsuchen

Clean up the code and start use more specific flags

Instead of the more generic isPure() start checking for more specific
attributes - e.g. whether a transform skips.

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday vor 13 Jahren
Ursprung
Commit
208bcb5ccb
6 geänderte Dateien mit 17 neuen und 9 gelöschten Zeilen
  1. 8 2
      ecl/hql/hqlexpr.cpp
  2. 1 1
      ecl/hql/hqlfold.cpp
  3. 3 3
      ecl/hql/hqlopt.cpp
  4. 1 1
      ecl/hql/hqlpmap.cpp
  5. 2 1
      ecl/hqlcpp/hqlcppds.cpp
  6. 2 1
      ecl/hqlcpp/hqlttcpp.cpp

+ 8 - 2
ecl/hql/hqlexpr.cpp

@@ -14229,8 +14229,11 @@ bool isPureActivity(IHqlExpression * expr)
 {
     unsigned max = expr->numChildren();
     for (unsigned i = getNumChildTables(expr); i < max; i++)
-        if (!expr->queryChild(i)->isPure())
+    {
+        IHqlExpression * cur = expr->queryChild(i);
+        if (!cur->isPure() || containsSkip(cur))
             return false;
+    }
     return true;
 }
 
@@ -14335,8 +14338,11 @@ bool isPureInlineDataset(IHqlExpression * expr)
     assertex(expr->getOperator() == no_inlinetable);
     IHqlExpression * values = expr->queryChild(0);
     ForEachChild(i, values)
-        if (!values->queryChild(i)->isPure())
+    {
+        IHqlExpression * transform = values->queryChild(i);
+        if (!transform->isPure() || containsSkip(transform))
             return false;
+    }
     return true;
 }
 

+ 1 - 1
ecl/hql/hqlfold.cpp

@@ -4538,7 +4538,7 @@ IHqlExpression * CExprFolderTransformer::doFoldTransformed(IHqlExpression * unfo
                         ForEachChild(i, transforms)
                         {
                             IHqlExpression * cur = transforms->queryChild(i);
-                            if (!cur->isPure())
+                            if (!cur->isPure() || containsSkip(cur))
                             {
                                 ok = false;
                                 break;

+ 3 - 3
ecl/hql/hqlopt.cpp

@@ -612,7 +612,7 @@ IHqlExpression * CTreeOptimizer::optimizeAggregateDataset(IHqlExpression * trans
             }
             break;
         case no_fetch:
-            if (isSimpleCount && ds->queryChild(3)->isPure())
+            if (isSimpleCount && !containsSkip(ds->queryChild(3)))
                 next = ds->queryChild(1);
             break;
         case no_group:
@@ -2600,7 +2600,7 @@ IHqlExpression * CTreeOptimizer::doCreateTransformed(IHqlExpression * transforme
                 }
             case no_fetch:              //NB: Not filtered fetch
                 {
-                    if (isPureActivity(child))
+                    if (!containsSkip(child->queryChild(3)))
                         return swapNodeWithChild(transformed, 1);
                     break;
                 }
@@ -2759,7 +2759,7 @@ IHqlExpression * CTreeOptimizer::doCreateTransformed(IHqlExpression * transforme
             case no_compound_childnormalize:
             case no_compound_selectnew:
             case no_compound_inline:
-                if (!isLimitedDataset(child))// && child->isPure())
+                if (!isLimitedDataset(child))
                     return swapNodeWithChild(transformed);
                 break;
             case no_sorted:

+ 1 - 1
ecl/hql/hqlpmap.cpp

@@ -1043,7 +1043,7 @@ IHqlExpression * transformTrivialSelectProject(IHqlExpression * select)
 
     IHqlExpression * expr = row->queryChild(0);
     IHqlExpression * transform = queryNewColumnProvider(expr);
-    if (!transform) // || !transform->isPure())
+    if (!transform)
         return NULL;
     if (!transform->isPure() && transformHasSkipAttr(transform))
         return NULL;

+ 2 - 1
ecl/hqlcpp/hqlcppds.cpp

@@ -4043,7 +4043,8 @@ IReferenceSelector * HqlCppTranslator::buildDatasetIndexViaIterator(BuildCtx & c
     {
     case no_hqlproject:
         //optimize selectnth(project(rows, t), n) to projectrow(selectnth(rows, n), t)
-        if (dataset->queryChild(1)->isPure() && !expr->hasProperty(_countProject_Atom))
+        IHqlExpression * transform = dataset->queryChild(1);
+        if (!containsSkip(transform) && !expr->hasProperty(_countProject_Atom))
             childDataset = dataset->queryChild(0);
         break;
     }

+ 2 - 1
ecl/hqlcpp/hqlttcpp.cpp

@@ -10479,8 +10479,9 @@ IHqlExpression * HqlTreeNormalizer::transformTable(IHqlExpression * untransforme
 
 IHqlExpression * HqlTreeNormalizer::optimizeAssignSkip(HqlExprArray & children, IHqlExpression * expr, IHqlExpression * cond, unsigned depth)
 {
-    if (!(expr->getInfoFlags() & HEFcontainsSkip))
+    if (!containsSkip(expr))
         return LINK(expr);
+
     switch (expr->getOperator())
     {
     case no_skip: