Explorar el Código

HPCC-9764 Generate JFreordered for standard joins

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday hace 12 años
padre
commit
782cd506b4
Se han modificado 3 ficheros con 79 adiciones y 0 borrados
  1. 2 0
      ecl/hql/hqlexpr.cpp
  2. 2 0
      ecl/hqlcpp/hqlhtcpp.cpp
  3. 75 0
      ecl/regress/issue9764.ecl

+ 2 - 0
ecl/hql/hqlexpr.cpp

@@ -11564,6 +11564,8 @@ IHqlExpression *createDataset(node_operator op, HqlExprArray & parms)
                     TableProjectMapper mapper;
                     mapper.setMapping(transform, leftSelect);
 
+                    if (hasProperty(unorderedAtom, parms))
+                        type.setown(getTypeRemoveAllSortOrders(type));
                     type.setown(getTypeUngroup(datasetType));
                     type.setown(getTypeProject(type, transform->queryRecord(), mapper));
                 }

+ 2 - 0
ecl/hqlcpp/hqlhtcpp.cpp

@@ -11768,6 +11768,8 @@ ABoundActivity * HqlCppTranslator::doBuildActivityJoinOrDenormalize(BuildCtx & c
     if (isLookupJoin && isManyLookup) flags.append("|JFmanylookup");
     if (expr->hasProperty(onFailAtom))
         flags.append("|JFonfail");
+    if (expr->hasProperty(unorderedAtom))
+        flags.append("|JFreorderable");
     if (transformReturnsSide(expr, no_left, 0))
         flags.append("|JFtransformmatchesleft");
     if (isLimitedSubstringJoin)

+ 75 - 0
ecl/regress/issue9764.ecl

@@ -0,0 +1,75 @@
+/*##############################################################################
+
+    HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems.
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+############################################################################## */
+
+
+namesRecord :=
+            RECORD
+string20        surname := '?????????????';
+string10        forename := '?????????????';
+integer2        age := 25;
+            END;
+
+addressRecord :=
+            RECORD
+string20        surname;
+string30        addr := 'Unknown';
+            END;
+
+namesTable := dataset([
+        {'Smithe','Pru',10},
+        {'Hawthorn','Gavin',31},
+        {'Hawthorn','Mia',30},
+        {'Smith','Jo'},
+        {'Smith','Matthew'},
+        {'X','Z'}], namesRecord);
+
+addressTable := dataset([
+        {'Hawthorn','10 Slapdash Lane'},
+        {'Smith','Leicester'},
+        {'Smith','China'},
+        {'Smith','St Barnabas House'},
+        {'X','12 The burrows'},
+        {'X','14 The crescent'},
+        {'Z','The end of the world'}
+        ], addressRecord);
+
+sortedNamesTable := SORT(namesTable, surname, forename, age);
+
+JoinRecord :=
+            RECORD
+string20        surname;
+string10        forename;
+integer2        age := 25;
+string30        addr;
+            END;
+
+JoinRecord JoinTransform (namesRecord l, addressRecord r) :=
+                TRANSFORM
+                    SELF.addr := r.addr;
+                    SELF := l;
+                END;
+SEQUENTIAL(
+    @{
+        JoinedF := join (sortedNamesTable, addressTable, LEFT.surname = RIGHT.surname, JoinTransform(LEFT, RIGHT), LOOKUP);
+        RETURN output(SORT(JoinedF, surname, forename, LOCAL));
+     }
+     ,
+    @{
+        JoinedF := join (sortedNamesTable, addressTable, LEFT.surname = RIGHT.surname, JoinTransform(LEFT, RIGHT), LOOKUP, UNORDERED);
+        RETURN output(SORT(JoinedF, surname, forename, LOCAL));
+     }
+);