Browse Source

HPCC-14861 Convert inline embeds to functional form

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 9 years ago
parent
commit
be7697579a

+ 1 - 0
ecl/hql/hqlattr.cpp

@@ -3004,6 +3004,7 @@ IHqlExpression * calcRowInformation(IHqlExpression * expr)
     case no_xmlproject:
     case no_call:
     case no_externalcall:
+    case no_embedbody:
         info.setUnknown(RCMfew);
         break;
     case no_colon:

+ 1 - 0
ecl/hqlcpp/hqlcpp.ipp

@@ -1963,6 +1963,7 @@ protected:
     unsigned            nextTypeId;
     unsigned            nextFieldId;
     unsigned            curWfid;
+    unsigned            implicitFunctionId = 0;
     HqlExprArray        internalFunctions;
     HqlExprArray        internalFunctionExternals;
     UniqueSequenceCounter spillSequence;

+ 22 - 3
ecl/hqlcpp/hqlttcpp.cpp

@@ -1995,8 +1995,8 @@ static IHqlExpression * normalizeIndexBuild(IHqlExpression * expr, bool sortInde
 
 
 static HqlTransformerInfo thorHqlTransformerInfo("ThorHqlTransformer");
-ThorHqlTransformer::ThorHqlTransformer(HqlCppTranslator & _translator, ClusterType _targetClusterType, IConstWorkUnit * wu)
-: NewHqlTransformer(thorHqlTransformerInfo), translator(_translator), options(_translator.queryOptions())
+ThorHqlTransformer::ThorHqlTransformer(HqlCppTranslator & _translator, ClusterType _targetClusterType, IConstWorkUnit * wu, unsigned & _implicitFunctionId)
+: NewHqlTransformer(thorHqlTransformerInfo), translator(_translator), options(_translator.queryOptions()), implicitFunctionId(_implicitFunctionId)
 {
     targetClusterType = _targetClusterType;
     topNlimit = options.topnLimit;
@@ -2089,6 +2089,25 @@ IHqlExpression * ThorHqlTransformer::createTransformed(IHqlExpression * expr)
     case no_debug_option_value:
         //pick best engine etc. definitely done by now, so substitute any options that haven't been processed already
         return getDebugValueExpr(translator.wu(), expr);
+    case no_embedbody:
+        {
+            //Convert all definitions of non functional embeds to implicit functions
+            StringBuffer funcname;
+            funcname.append("userx").append(++implicitFunctionId);
+            HqlExprArray args;
+            args.append(*LINK(expr));
+            if (expr->hasAttribute(languageAtom))
+            {
+                args.append(*createAttribute(contextAtom));
+                if (expr->isDatarow())
+                    args.append(*createAttribute(allocatorAtom));
+            }
+            OwnedHqlExpr body = createWrapper(no_outofline, expr->queryType(), args);
+            IHqlExpression * formals = createValue(no_sortlist, makeSortListType(NULL));
+            OwnedHqlExpr funcdef = createFunctionDefinition(createIdAtom(funcname), body.getClear(), formals, NULL, NULL);
+            HqlExprArray actuals;
+            return createBoundFunction(NULL, funcdef, actuals, nullptr, true);
+        }
     }
 
     if (normalized && (normalized != transformed))
@@ -3769,7 +3788,7 @@ void HqlCppTranslator::convertLogicalToActivities(WorkflowItem & curWorkflow)
 {
     {
         cycle_t startCycles = get_cycles_now();
-        ThorHqlTransformer transformer(*this, targetClusterType, wu());
+        ThorHqlTransformer transformer(*this, targetClusterType, wu(), implicitFunctionId);
 
         HqlExprArray & exprs = curWorkflow.queryExprs();
         HqlExprArray transformed;

+ 2 - 1
ecl/hqlcpp/hqlttcpp.ipp

@@ -183,7 +183,7 @@ protected:
 class ThorHqlTransformer : public NewHqlTransformer
 {
 public:
-    ThorHqlTransformer(HqlCppTranslator & _translator, ClusterType _targetClusterType, IConstWorkUnit * _wu);
+    ThorHqlTransformer(HqlCppTranslator & _translator, ClusterType _targetClusterType, IConstWorkUnit * _wu, unsigned & _implicitFunctionId);
 
 protected:
     virtual IHqlExpression * createTransformed(IHqlExpression * expr);
@@ -221,6 +221,7 @@ protected:
     const HqlCppOptions & options;
     ClusterType         targetClusterType;
     unsigned            topNlimit;
+    unsigned &          implicitFunctionId;
     bool                groupAllDistribute;
 };
 

+ 3 - 3
ecl/regress/cppbody3.ecl

@@ -20,21 +20,21 @@
 
 real8 s1 :=
 BEGINC++
-sqrt(2.0)
+return sqrt(2.0);
 ENDC++;
 s1p := s1 : persist('s1');
 output(s1p);
 
 real8 s2 :=
 BEGINC++
-sqrt(2.0)
+return sqrt(2.0);
 ENDC++;
 s2p := s2 : persist('s2');
 output(s2p);
 
 real8 s3 :=
 BEGINC++
-sqrt(3.0)
+return sqrt(3.0);
 ENDC++;
 s3p := s3 : persist('s3');
 output(s3p);

+ 3 - 3
ecl/regress/cppbody7.ecl

@@ -19,19 +19,19 @@
 
 integer4 mkRandom1 :=
 BEGINC++
-rtlRandom()
+return rtlRandom();
 ENDC++;
 
 integer4 mkRandom2 :=
 BEGINC++
 #option pure
-rtlRandom()
+return rtlRandom();
 ENDC++;
 
 integer4 mkRandom3 :=
 BEGINC++
 #option action
-rtlRandom()
+return rtlRandom();
 ENDC++;
 
 output(mkRandom1 * mkRandom1);

+ 1 - 1
ecl/regress/rkc42.ecl

@@ -21,7 +21,7 @@ return strdup(""); ENDC++;
 output(EmptyString1());
 
 VarString EmptyString2 := BEGINC++
-strdup("") ENDC++;
+return strdup(""); ENDC++;
 
 
 output(EmptyString2);

+ 1 - 1
rtl/eclrtl/eclrtl_imp.hpp

@@ -100,7 +100,7 @@ public:
 };
 
 template <unsigned maxsize>
-class ECLRTL_API rtlFixedRowBuilder
+class rtlFixedRowBuilder
 {
 public:
     inline void ensureAvailable(size32_t size) {}