|
@@ -3236,6 +3236,42 @@ public:
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+void HqlCppTranslator::buildDatasetAssignCombine(BuildCtx & ctx, IHqlCppDatasetBuilder * target, IHqlExpression * expr)
|
|
|
+{
|
|
|
+ BuildCtx iterctx(ctx);
|
|
|
+ IHqlExpression *left = expr->queryChild(0);
|
|
|
+ IHqlExpression *right = expr->queryChild(1);
|
|
|
+
|
|
|
+ iterctx.addGroup(); // stop bound cursors leaking outside the block.
|
|
|
+
|
|
|
+ // i1 iter1; i1.first();
|
|
|
+ HqlExprAttr rightIter, rightRow;
|
|
|
+ Owned<IHqlCppDatasetCursor> cursor = createDatasetSelector(iterctx, right);
|
|
|
+ cursor->buildIterateClass(iterctx, rightIter, rightRow);
|
|
|
+ buildIteratorFirst(iterctx, rightIter, rightRow);
|
|
|
+
|
|
|
+ BoundRow * sourceCursor = buildDatasetIterate(iterctx, left, false);
|
|
|
+ if (!sourceCursor)
|
|
|
+ return;
|
|
|
+
|
|
|
+ bindTableCursor(iterctx, right, rightRow, no_right, querySelSeq(expr));
|
|
|
+
|
|
|
+ BoundRow * targetRow = target->buildCreateRow(iterctx);
|
|
|
+
|
|
|
+ Owned<IReferenceSelector> targetRef = buildActiveRow(iterctx, targetRow->querySelector());
|
|
|
+ doBuildRowAssignProject(iterctx, targetRef, expr);
|
|
|
+
|
|
|
+ target->finishRow(iterctx, targetRow);
|
|
|
+
|
|
|
+ // i1.next();
|
|
|
+ buildIteratorNext(iterctx, rightIter, rightRow);
|
|
|
+
|
|
|
+ /* TODO: Need to check -
|
|
|
+ * a) Whether excess rhs rows and fail with error
|
|
|
+ * b) Whether hit end of stream on RHS..
|
|
|
+ */
|
|
|
+}
|
|
|
+
|
|
|
void HqlCppTranslator::buildDatasetAssignProject(BuildCtx & ctx, IHqlCppDatasetBuilder * target, IHqlExpression * expr)
|
|
|
{
|
|
|
BuildCtx iterctx(ctx);
|
|
@@ -3287,7 +3323,6 @@ void HqlCppTranslator::buildDatasetAssignProject(BuildCtx & ctx, IHqlCppDatasetB
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
void HqlCppTranslator::buildDatasetAssignJoin(BuildCtx & ctx, IHqlCppDatasetBuilder * target, IHqlExpression * expr)
|
|
|
{
|
|
|
IHqlExpression * left = expr->queryChild(0);
|
|
@@ -3480,6 +3515,9 @@ void HqlCppTranslator::buildDatasetAssign(BuildCtx & ctx, IHqlCppDatasetBuilder
|
|
|
case no_newusertable:
|
|
|
buildDatasetAssignProject(subctx, target, expr);
|
|
|
return;
|
|
|
+ case no_combine:
|
|
|
+ buildDatasetAssignCombine(subctx, target, expr);
|
|
|
+ return;
|
|
|
case no_compound_childread:
|
|
|
case no_compound_childnormalize:
|
|
|
case no_compound_childaggregate:
|
|
@@ -4312,7 +4350,9 @@ void HqlCppTranslator::doBuildRowAssignProject(BuildCtx & ctx, IReferenceSelecto
|
|
|
IHqlExpression * selSeq = querySelSeq(expr);
|
|
|
OwnedHqlExpr leftSelect = createSelector(no_left, dataset, selSeq);
|
|
|
OwnedHqlExpr activeDataset = ensureActiveRow(dataset->queryNormalizedSelector());
|
|
|
- OwnedHqlExpr transform = queryNewReplaceSelector(expr->queryChild(1), leftSelect, activeDataset);
|
|
|
+
|
|
|
+ // queryChild(1) should be changed to queryTransformExpr()...
|
|
|
+ OwnedHqlExpr transform = queryNewReplaceSelector(queryNewColumnProvider(expr), leftSelect, activeDataset);
|
|
|
Owned<BoundRow> selfCursor;
|
|
|
if (!transform)
|
|
|
{
|