|
@@ -1260,12 +1260,14 @@ unsigned ChildGraphExprBuilder::addInput()
|
|
|
return id;
|
|
|
}
|
|
|
|
|
|
-IHqlExpression * ChildGraphExprBuilder::getGraph()
|
|
|
+IHqlExpression * ChildGraphExprBuilder::getGraph(_ATOM extraAttrName)
|
|
|
{
|
|
|
HqlExprArray args;
|
|
|
args.append(*LINK(represents));
|
|
|
args.append(*getSizetConstant(numResults()));
|
|
|
args.append(*createActionList(results));
|
|
|
+ if (extraAttrName)
|
|
|
+ args.append(*createAttribute(extraAttrName));
|
|
|
return createValue(no_childquery, makeVoidType(), args);
|
|
|
}
|
|
|
|
|
@@ -1273,7 +1275,7 @@ IHqlExpression * ChildGraphExprBuilder::getGraph()
|
|
|
// Child dataset processing
|
|
|
|
|
|
ChildGraphBuilder::ChildGraphBuilder(HqlCppTranslator & _translator, IHqlExpression * subgraph)
|
|
|
-: translator(_translator)
|
|
|
+: translator(_translator), childQuery(subgraph)
|
|
|
{
|
|
|
represents.set(subgraph->queryChild(0));
|
|
|
id = translator.nextActivityId();
|
|
@@ -1285,9 +1287,6 @@ ChildGraphBuilder::ChildGraphBuilder(HqlCppTranslator & _translator, IHqlExpress
|
|
|
StringBuffer s;
|
|
|
resultInstanceExpr.setown(createQuoted(appendUniqueId(s.append("res"), id), makeBoolType()));
|
|
|
numResults = (unsigned)getIntValue(subgraph->queryChild(1));
|
|
|
-
|
|
|
- IHqlExpression * actions = subgraph->queryChild(2);
|
|
|
- actions->unwindList(results, no_actionlist);
|
|
|
}
|
|
|
|
|
|
void ChildGraphBuilder::generateGraph(BuildCtx & ctx)
|
|
@@ -1298,8 +1297,8 @@ void ChildGraphBuilder::generateGraph(BuildCtx & ctx)
|
|
|
//Remove this line once all engines use the new child queries exclusively
|
|
|
if (numResults == 0) numResults++;
|
|
|
|
|
|
- OwnedHqlExpr query = createActionList(results);
|
|
|
- OwnedHqlExpr resourced = translator.getResourcedChildGraph(graphctx, query, represents, numResults, no_none);
|
|
|
+ IHqlExpression * query = childQuery->queryChild(2);
|
|
|
+ OwnedHqlExpr resourced = translator.getResourcedChildGraph(graphctx, childQuery, numResults, no_none);
|
|
|
|
|
|
Owned<ParentExtract> extractBuilder = translator.createExtractBuilder(graphctx, PETchild, represents, resourced, true);
|
|
|
if (!translator.queryOptions().serializeRowsetInExtract)
|
|
@@ -1347,8 +1346,8 @@ void ChildGraphBuilder::generatePrefetchGraph(BuildCtx & _ctx, OwnedHqlExpr * re
|
|
|
BuildCtx aliasctx(ctx);
|
|
|
aliasctx.addGroup();
|
|
|
|
|
|
- OwnedHqlExpr query = createActionList(results);
|
|
|
- OwnedHqlExpr resourced = translator.getResourcedChildGraph(ctx, query, represents, numResults, no_none);
|
|
|
+ IHqlExpression * query = childQuery->queryChild(2);
|
|
|
+ OwnedHqlExpr resourced = translator.getResourcedChildGraph(ctx, childQuery, numResults, no_none);
|
|
|
|
|
|
Owned<ParentExtract> extractBuilder = translator.createExtractBuilder(ctx, PETchild, represents, resourced, false);
|
|
|
createBuilderAlias(aliasctx, extractBuilder);
|
|
@@ -1379,8 +1378,8 @@ unique_id_t ChildGraphBuilder::buildLoopBody(BuildCtx & ctx, bool multiInstance)
|
|
|
BuildCtx subctx(ctx);
|
|
|
subctx.addGroup();
|
|
|
|
|
|
- OwnedHqlExpr query = createActionList(results);
|
|
|
- OwnedHqlExpr resourced = translator.getResourcedChildGraph(ctx, query, represents, numResults, no_loop);
|
|
|
+ IHqlExpression * query = childQuery->queryChild(2);
|
|
|
+ OwnedHqlExpr resourced = translator.getResourcedChildGraph(ctx, childQuery, numResults, no_loop);
|
|
|
//Add a flag to indicate multi instance
|
|
|
if (multiInstance)
|
|
|
resourced.setown(appendOwnedOperand(resourced, createAttribute(multiInstanceAtom)));
|
|
@@ -1481,9 +1480,9 @@ unique_id_t ChildGraphBuilder::buildGraphLoopBody(BuildCtx & ctx, bool isParalle
|
|
|
BuildCtx subctx(ctx);
|
|
|
subctx.addGroup();
|
|
|
|
|
|
- OwnedHqlExpr query = createActionList(results);
|
|
|
+ IHqlExpression * query = childQuery->queryChild(2);
|
|
|
translator.traceExpression("Before Loop resource", query);
|
|
|
- OwnedHqlExpr resourced = translator.getResourcedChildGraph(ctx, query, represents, numResults, no_loop);
|
|
|
+ OwnedHqlExpr resourced = translator.getResourcedChildGraph(ctx, childQuery, numResults, no_loop);
|
|
|
translator.traceExpression("After Loop resource", resourced);
|
|
|
|
|
|
//Add a flag to indicate multi instance
|
|
@@ -1514,8 +1513,8 @@ unique_id_t ChildGraphBuilder::buildRemoteGraph(BuildCtx & ctx)
|
|
|
BuildCtx subctx(ctx);
|
|
|
subctx.addGroup();
|
|
|
|
|
|
- OwnedHqlExpr query = createActionList(results);
|
|
|
- OwnedHqlExpr resourced = translator.getResourcedChildGraph(ctx, query, represents, numResults, no_allnodes);
|
|
|
+ IHqlExpression * query = childQuery->queryChild(2);
|
|
|
+ OwnedHqlExpr resourced = translator.getResourcedChildGraph(ctx, childQuery, numResults, no_allnodes);
|
|
|
|
|
|
Owned<ParentExtract> extractBuilder = translator.createExtractBuilder(ctx, PETremote, represents, GraphRemote, false);
|
|
|
|
|
@@ -1576,12 +1575,13 @@ void HqlCppTranslator::buildAssignChildDataset(BuildCtx & ctx, const CHqlBoundTa
|
|
|
}
|
|
|
|
|
|
|
|
|
-IHqlExpression * HqlCppTranslator::getResourcedChildGraph(BuildCtx & ctx, IHqlExpression * expr, IHqlExpression * graphIdExpr, unsigned numResults, node_operator graphKind)
|
|
|
+IHqlExpression * HqlCppTranslator::getResourcedChildGraph(BuildCtx & ctx, IHqlExpression * childQuery, unsigned numResults, node_operator graphKind)
|
|
|
{
|
|
|
if (options.paranoidCheckNormalized || options.paranoidCheckDependencies)
|
|
|
DBGLOG("Before resourcing a child graph");
|
|
|
|
|
|
- LinkedHqlExpr resourced = expr;
|
|
|
+ IHqlExpression * graphIdExpr = childQuery->queryChild(0);
|
|
|
+ LinkedHqlExpr resourced = childQuery->queryChild(2);
|
|
|
checkNormalized(ctx, resourced);
|
|
|
|
|
|
unsigned csfFlags = CSFindex|options.optimizeDiskFlag;
|
|
@@ -1626,7 +1626,7 @@ IHqlExpression * HqlCppTranslator::getResourcedChildGraph(BuildCtx & ctx, IHqlEx
|
|
|
resourced.setown(resourceLoopGraph(*this, activeRows, resourced, targetClusterType, graphIdExpr, &numResults, insideChild));
|
|
|
}
|
|
|
else
|
|
|
- resourced.setown(resourceNewChildGraph(*this, activeRows, resourced, targetClusterType, graphIdExpr, &numResults));
|
|
|
+ resourced.setown(resourceNewChildGraph(*this, activeRows, resourced, targetClusterType, graphIdExpr, &numResults, childQuery->hasProperty(sequentialAtom)));
|
|
|
|
|
|
DEBUG_TIMER("EclServer: resource graph", msTick()-time);
|
|
|
checkNormalized(ctx, resourced);
|
|
@@ -1664,6 +1664,7 @@ IHqlExpression * HqlCppTranslator::getResourcedChildGraph(BuildCtx & ctx, IHqlEx
|
|
|
if (options.paranoidCheckNormalized || options.paranoidCheckDependencies)
|
|
|
DBGLOG("After resourcing a child graph");
|
|
|
|
|
|
+ resourced.setown(inheritAttribute(resourced, childQuery, sequentialAtom));
|
|
|
return resourced.getClear();
|
|
|
}
|
|
|
|