Selaa lähdekoodia

HPCC-9598 Generate <dataset>.row as a PROJECT instead of a 1 row NORMALIZE

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 12 vuotta sitten
vanhempi
commit
ce3582b7b1
1 muutettua tiedostoa jossa 36 lisäystä ja 1 poistoa
  1. 36 1
      ecl/hqlcpp/hqlhtcpp.cpp

+ 36 - 1
ecl/hqlcpp/hqlhtcpp.cpp

@@ -14318,7 +14318,42 @@ ABoundActivity * HqlCppTranslator::doBuildActivityNormalizeLinkedChild(BuildCtx
 
 ABoundActivity * HqlCppTranslator::doBuildActivitySelectNew(BuildCtx & ctx, IHqlExpression * expr)
 {
-    return doBuildActivityNormalizeLinkedChild(ctx, expr);
+    if (!expr->isDatarow())
+        return doBuildActivityNormalizeLinkedChild(ctx, expr);
+
+    bool isNew = false;
+    IHqlExpression * dataset = querySelectorDataset(expr, isNew);
+    assertex(isNew);
+
+    Owned<ABoundActivity> boundDataset = buildCachedActivity(ctx, dataset);
+    Owned<ActivityInstance> instance = new ActivityInstance(*this, ctx, TAKproject, expr, "Project");
+
+    buildActivityFramework(instance);
+
+    buildInstancePrefix(instance);
+
+    {
+        //Need to create a dataset to replace the parent selector - since it might be a row
+        OwnedHqlExpr anon = createDataset(no_anon, LINK(dataset->queryRecord()));
+
+        BuildCtx funcctx(instance->startctx);
+        funcctx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, const void * _left)");
+        funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
+        ensureRowAllocated(funcctx, "crSelf");
+        BoundRow * selfCursor = bindSelf(funcctx, expr, "crSelf");
+        bindTableCursor(funcctx, anon->queryNormalizedSelector(), "left");
+
+        OwnedHqlExpr activeAnon = ensureActiveRow(anon);
+        OwnedHqlExpr value = replaceSelectorDataset(expr, activeAnon);
+        buildAssign(funcctx, selfCursor->querySelector(), value);
+
+        buildReturnRecordSize(funcctx, selfCursor);
+    }
+
+    buildInstanceSuffix(instance);
+    buildConnectInputOutput(ctx, instance, boundDataset, 0, 0);
+
+    return instance->getBoundActivity();
 }