Sfoglia il codice sorgente

HPCC-14810 Default append in a child query to ordered

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 9 anni fa
parent
commit
4154f24aa7
3 ha cambiato i file con 23 aggiunte e 18 eliminazioni
  1. 2 0
      ecl/hqlcpp/hqlhtcpp.cpp
  2. 19 16
      ecl/hqlcpp/hqlresource.cpp
  3. 2 2
      ecl/hqlcpp/hqlresource.ipp

+ 2 - 0
ecl/hqlcpp/hqlhtcpp.cpp

@@ -8271,6 +8271,8 @@ ABoundActivity * HqlCppTranslator::doBuildActivityConcat(BuildCtx & ctx, IHqlExp
 
     if (orderedPull || (allFromDisk && !targetRoxie()))
         ordered = true;
+    if (!expr->hasAttribute(orderedAtom) && insideChildQuery(ctx))
+        ordered = true;
 
     bool useImplementationClass = options.minimizeActivityClasses && targetRoxie();
     Owned<ActivityInstance> instance = new ActivityInstance(*this, ctx, TAKfunnel, expr, "Funnel");

+ 19 - 16
ecl/hqlcpp/hqlresource.cpp

@@ -5059,21 +5059,6 @@ void CSplitterLink::mergeSinkLink(CSplitterLink & sinkLink)
     sinkInfo->balancedLinks.replace(OLINK(*this), sinkPos);
 }
 
-bool CSplitterInfo::allInputsPulledIndependently(IHqlExpression * expr)
-{
-    switch (expr->getOperator())
-    {
-    case no_addfiles:
-        if (isOrdered(expr) || isGrouped(expr))
-            return false;
-        return true;
-    case no_parallel:
-        //MORE; This can probably return true - and generate fewer unbalanced splitters.
-        break;
-    }
-    return false;
-}
-
 bool CSplitterInfo::isSplitOrBranch(IHqlExpression * expr) const
 {
     unsigned num = getNumActivityArguments(expr);
@@ -5323,6 +5308,24 @@ bool EclResourcer::removePassThrough(CSplitterInfo & connections, ResourcerInfo
     return true;
 }
 
+bool EclResourcer::allInputsPulledIndependently(IHqlExpression * expr) const
+{
+    switch (expr->getOperator())
+    {
+    case no_addfiles:
+        if (isOrdered(expr) || isGrouped(expr))
+            return false;
+        if (!expr->hasAttribute(orderedAtom) && options.isChildQuery)
+            return false;
+        return true;
+    case no_parallel:
+        //MORE; This can probably return true - and generate fewer unbalanced splitters.
+        break;
+    }
+    return false;
+}
+
+
 void EclResourcer::removeDuplicateIndependentLinks(CSplitterInfo & connections, ResourcerInfo & info)
 {
     IHqlExpression * expr = info.original;
@@ -5337,7 +5340,7 @@ void EclResourcer::removeDuplicateIndependentLinks(CSplitterInfo & connections,
                 IHqlExpression * sink = cur.queryOther(expr);
                 assertex(sink);
                 ResourcerInfo & sinkInfo = *queryResourceInfo(sink);
-                if (CSplitterInfo::allInputsPulledIndependently(sink))
+                if (allInputsPulledIndependently(sink))
                 {
                     unsigned numRemoved = 0;
                     for (unsigned j=info.balancedLinks.ordinality()-1; j > i; j--)

+ 2 - 2
ecl/hqlcpp/hqlresource.ipp

@@ -67,7 +67,7 @@ public:
     bool     noConditionalLinks;
     bool     minimiseSpills;
     bool     hoistResourced;
-    bool     isChildQuery;
+    bool     isChildQuery; // Is a child query, or a loop inside a child query
     bool     groupedChildIterators;
     bool     allowSplitBetweenSubGraphs;
     bool     preventKeyedSplit;
@@ -294,7 +294,6 @@ public:
     ~CSplitterInfo();
 
     void addLink(IHqlExpression * source, IHqlExpression * sink, bool isExternal);
-    static bool allInputsPulledIndependently(IHqlExpression * expr);
     void gatherPotentialSplitters(IHqlExpression * expr, IHqlExpression * sink, ResourceGraphInfo * graph, bool isDependency);
     bool isSplitOrBranch(IHqlExpression * expr) const;
     bool isBalancedSplitter(IHqlExpression * expr) const;
@@ -526,6 +525,7 @@ protected:
     void spotSharedInputs(IHqlExpression * expr, ResourceGraphInfo * graph);
     void spotSharedInputs();
 
+    bool allInputsPulledIndependently(IHqlExpression * expr) const;
     bool removePassThrough(CSplitterInfo & connections, ResourcerInfo & info);
     void removeDuplicateIndependentLinks(CSplitterInfo & connections, ResourcerInfo & info);
     void optimizeIndependentLinks(CSplitterInfo & connections, ResourcerInfo & info);