浏览代码

HPCC-8833 Assume keyed join is sorted unless UNORDERED

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 10 年之前
父节点
当前提交
c5067daee8

+ 1 - 0
ecl/hqlcpp/hqlcpp.cpp

@@ -1729,6 +1729,7 @@ void HqlCppTranslator::cacheOptions()
         DebugOption(options.alwaysUseGraphResults,"alwaysUseGraphResults",false),
         DebugOption(options.reportAssertFilenameTail,"reportAssertFilenameTail",false),        
         DebugOption(options.newBalancedSpotter,"newBalancedSpotter",true),
+        DebugOption(options.keyedJoinPreservesOrder,"keyedJoinPreservesOrder",true),
     };
 
     //get options values from workunit

+ 1 - 0
ecl/hqlcpp/hqlcpp.ipp

@@ -735,6 +735,7 @@ struct HqlCppOptions
     bool                alwaysUseGraphResults;
     bool                reportAssertFilenameTail;
     bool                newBalancedSpotter;
+    bool                keyedJoinPreservesOrder;
 };
 
 //Any information gathered while processing the query should be moved into here, rather than cluttering up the translator class

+ 1 - 1
ecl/hqlcpp/hqlttcpp.cpp

@@ -2813,7 +2813,7 @@ IHqlExpression * ThorHqlTransformer::normalizeJoinOrDenormalize(IHqlExpression *
     //Tag a keyed join as ordered in the platforms that ensure it does remain ordered.  Extend if the others do.
     if (isKeyedJoin(expr))
     {
-        if (translator.targetRoxie() && !expr->hasAttribute(_ordered_Atom))
+        if ((translator.targetRoxie() || options.keyedJoinPreservesOrder) && !expr->hasAttribute(_ordered_Atom) && !expr->hasAttribute(unorderedAtom))
             return appendOwnedOperand(expr, createAttribute(_ordered_Atom));
         return NULL;
     }

+ 1 - 1
ecl/hthor/hthorkey.cpp

@@ -3398,7 +3398,7 @@ public:
     { 
         CHThorThreadedActivityBase::ready(); 
 
-        preserveOrder = ((helper.getJoinFlags() & JFkeepsorted) != 0) || agent.queryWorkUnit()->getDebugValueBool("__hthor_kj_always_preserve_order", DEFAULT_KJ_PRESERVES_ORDER);
+        preserveOrder = ((helper.getJoinFlags() & JFreorderable) == 0);
         preserveGroups = helper.queryOutputMeta()->isGrouped();
         needsDiskRead = helper.diskAccessRequired();
         extractJoinFields = ((helper.getJoinFlags() & JFextractjoinfields) != 0);

+ 15 - 0
ecl/regress/issue8833.ecl

@@ -0,0 +1,15 @@
+#option('showMetaInGraph', true);
+layout := {unsigned u1};
+ds := dataset([{3},{2},{1}], layout);
+key := index(ds, {u1},{}, '~dskaggs::delete::key');
+
+dsSort := sort(ds, u1);
+dsJoin := join(dsSort, key,
+               keyed(left.u1 = right.u1),
+               transform(left), keyed);
+dsSort2 := sort(dsJoin, u1);
+
+sequential(
+    build(key, overwrite),
+    output(dsSort2,, '~dskaggs::delete::dsSort2', overwrite),
+);

+ 15 - 0
ecl/regress/issue8833b.ecl

@@ -0,0 +1,15 @@
+#option('showMetaInGraph', true);
+layout := {unsigned u1};
+ds := dataset([{3},{2},{1}], layout);
+key := index(ds, {u1},{}, '~dskaggs::delete::key');
+
+dsSort := sort(ds, u1);
+dsJoin := join(dsSort, key,
+               keyed(left.u1 = right.u1),
+               transform(left), keyed, unordered);
+dsSort2 := sort(dsJoin, u1);
+
+sequential(
+    build(key, overwrite),
+    output(dsSort2,, '~dskaggs::delete::dsSort2', overwrite),
+);

+ 0 - 1
rtl/include/eclhelper.hpp

@@ -1642,7 +1642,6 @@ enum {
     JFmanylookup                 = 0x00008000,
     JFparallel                   = 0x00010000,
     JFsequential                 = 0x00020000,
-    JFkeepsorted                 = 0x00040000,
     JFcountmatchabortlimit       = 0x00080000,
     JFreorderable                = 0x00100000,
     JFtransformmatchesleft       = 0x00200000,

+ 1 - 1
thorlcr/activities/keyedjoin/thkeyedjoinslave.cpp

@@ -2039,7 +2039,7 @@ public:
         startInput(input);
         inputHelper = LINK(input->queryFromActivity()->queryContainer().queryHelper());
         inputStopped = false;
-        preserveOrder = ((joinFlags & JFkeepsorted) != 0) || (container.queryJob().getWorkUnitValueInt("kj_always_preserve_order", DEFAULT_KJ_PRESERVES_ORDER) != 0);
+        preserveOrder = ((joinFlags & JFreorderable) == 0);
         preserveGroups = input->isGrouped();
         ActPrintLog("KJ: parallelLookups=%d, freeQSize=%d, preserveGroups=%s, preserveOrder=%s", parallelLookups, freeQSize, preserveGroups?"true":"false", preserveOrder?"true":"false");