|
@@ -1389,6 +1389,12 @@ unsigned HqlCppTranslator::getConsistentUID(IHqlExpression * ptr)
|
|
|
}
|
|
|
|
|
|
|
|
|
+unsigned HqlCppTranslator::getNextGlobalCompareId()
|
|
|
+{
|
|
|
+ return nextGlobalCompareId++;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
unsigned HqlCppTranslator::beginFunctionGetCppIndex(unsigned activityId, bool isChildActivity)
|
|
|
{
|
|
|
activitiesThisCpp++;
|
|
@@ -5644,22 +5650,57 @@ void HqlCppTranslator::buildHashClass(BuildCtx & ctx, const char * name, IHqlExp
|
|
|
endNestedClass(classStmt);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-void HqlCppTranslator::buildCompareClass(BuildCtx & ctx, const char * name, IHqlExpression * sortList, const DatasetReference & dataset)
|
|
|
+void HqlCppTranslator::buildCompareClass(BuildCtx & ctx, const char * name, IHqlExpression * sortList, const DatasetReference & dataset, StringBuffer & compareFuncName)
|
|
|
{
|
|
|
- BuildCtx comparectx(ctx);
|
|
|
- IHqlStmt * classStmt = beginNestedClass(comparectx, name, "ICompare");
|
|
|
-
|
|
|
+ if (options.useGlobalCompareClass)
|
|
|
{
|
|
|
- MemberFunction func(*this, comparectx, "virtual int docompare(const void * _left, const void * _right) const" OPTIMIZE_FUNCTION_ATTRIBUTE);
|
|
|
+ BuildCtx buildctx(*code, declareAtom);
|
|
|
+ GlobalCompareClass gcc(*this, sortList, dataset);
|
|
|
+
|
|
|
+ // stop duplicate classes being generated.
|
|
|
+ OwnedHqlExpr search = gcc.getUniqueKey();
|
|
|
+ HqlExprAssociation * match = buildctx.queryMatchExpr(search);
|
|
|
+ if (match)
|
|
|
+ {
|
|
|
+ match->queryExpr()->toString(compareFuncName);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ gcc.createGlobalCompareInstance(buildctx, name);
|
|
|
+ if (options.spanMultipleCpp)
|
|
|
+ {
|
|
|
+ BuildCtx declarectx(*code, declareAtom);
|
|
|
+ compareFuncName.set(gcc.createAccessFunction(declarectx));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ compareFuncName.set(gcc.queryInstanceName());
|
|
|
+ MemberFunction func(*this, buildctx, "virtual int docompare(const void * _left, const void * _right) const" OPTIMIZE_FUNCTION_ATTRIBUTE);
|
|
|
func.ctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
|
|
|
func.ctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
|
|
|
func.ctx.associateExpr(constantMemberMarkerExpr, constantMemberMarkerExpr);
|
|
|
|
|
|
buildReturnOrder(func.ctx, sortList, dataset);
|
|
|
+
|
|
|
+ OwnedHqlExpr temp = createVariable(compareFuncName, makeVoidType());
|
|
|
+ buildctx.associateExpr(search, temp);
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ BuildCtx comparectx(ctx);
|
|
|
+ IHqlStmt * classStmt = beginNestedClass(comparectx, name, "ICompare");
|
|
|
|
|
|
- endNestedClass(classStmt);
|
|
|
+ {
|
|
|
+ MemberFunction func(*this, comparectx, "virtual int docompare(const void * _left, const void * _right) const" OPTIMIZE_FUNCTION_ATTRIBUTE);
|
|
|
+ func.ctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
|
|
|
+ func.ctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
|
|
|
+ func.ctx.associateExpr(constantMemberMarkerExpr, constantMemberMarkerExpr);
|
|
|
+
|
|
|
+ buildReturnOrder(func.ctx, sortList, dataset);
|
|
|
+ }
|
|
|
+
|
|
|
+ endNestedClass(classStmt);
|
|
|
+ compareFuncName.set(name);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
@@ -8448,10 +8489,14 @@ ABoundActivity * HqlCppTranslator::doBuildActivityMerge(BuildCtx & ctx, IHqlExpr
|
|
|
if (sorts.ordinality() != 0)
|
|
|
{
|
|
|
OwnedHqlExpr sortOrder = createValueSafe(no_sortlist, makeSortListType(NULL), sorts);
|
|
|
- instance->startctx.addQuotedLiteral("virtual ICompare * queryCompare() { return &compare; }");
|
|
|
|
|
|
DatasetReference dsRef(dataset, no_activetable, NULL);
|
|
|
- buildCompareClass(instance->nestedctx, "compare", sortOrder, dsRef);
|
|
|
+
|
|
|
+ StringBuffer compareClassInstance;
|
|
|
+ buildCompareClass(instance->nestedctx, "compare", sortOrder, dsRef, compareClassInstance);
|
|
|
+ MemberFunction func(*this, instance->startctx, "virtual ICompare * queryCompare()");
|
|
|
+ func.ctx.addReturnAddressOf(compareClassInstance);
|
|
|
+
|
|
|
if (!instance->isLocal)
|
|
|
generateSerializeKey(instance->nestedctx, no_none, dsRef, sorts, !instance->isChildActivity(), true);
|
|
|
}
|
|
@@ -10484,10 +10529,12 @@ ABoundActivity * HqlCppTranslator::doBuildActivityOutputIndex(BuildCtx & ctx, IH
|
|
|
HqlExprArray sorts;
|
|
|
gatherIndexBuildSortOrder(sorts, expr, options.sortIndexPayload);
|
|
|
OwnedHqlExpr sortOrder = createValueSafe(no_sortlist, makeSortListType(NULL), sorts);
|
|
|
- instance->startctx.addQuotedLiteral("virtual ICompare * queryCompare() { return &compare; }");
|
|
|
|
|
|
DatasetReference dsRef(dataset);
|
|
|
- buildCompareClass(instance->nestedctx, "compare", sortOrder, dsRef);
|
|
|
+ StringBuffer compareClassInstance;
|
|
|
+ buildCompareClass(instance->nestedctx, "compare", sortOrder, dsRef, compareClassInstance);
|
|
|
+ MemberFunction func(*this, instance->startctx, "virtual ICompare * queryCompare()");
|
|
|
+ func.ctx.addReturnAddressOf(compareClassInstance);
|
|
|
}
|
|
|
}
|
|
|
buildInstanceSuffix(instance);
|
|
@@ -14307,8 +14354,10 @@ ABoundActivity * HqlCppTranslator::doBuildActivityDedup(BuildCtx & ctx, IHqlExpr
|
|
|
if (info.keepBest)
|
|
|
{
|
|
|
IHqlExpression * sortOrder = expr->queryAttribute(bestAtom)->queryChild(0);
|
|
|
- buildCompareClass(instance->startctx, "bestCompare", sortOrder, DatasetReference(dataset));
|
|
|
- instance->startctx.addQuotedLiteral("virtual ICompare * queryCompareBest() { return &bestCompare; }");
|
|
|
+ StringBuffer compareClassInstance;
|
|
|
+ buildCompareClass(instance->startctx, "bestCompare", sortOrder, DatasetReference(dataset), compareClassInstance);
|
|
|
+ MemberFunction func(*this, instance->startctx, "virtual ICompare * queryCompareBest()");
|
|
|
+ func.ctx.addReturnAddressOf(compareClassInstance);
|
|
|
}
|
|
|
|
|
|
buildInstanceSuffix(instance);
|
|
@@ -14353,10 +14402,13 @@ ABoundActivity * HqlCppTranslator::doBuildActivityDistribute(BuildCtx & ctx, IHq
|
|
|
unwindChildren(sorts, cond);
|
|
|
|
|
|
OwnedHqlExpr sortOrder = createValueSafe(no_sortlist, makeSortListType(NULL), sorts);
|
|
|
- instance->startctx.addQuotedLiteral("virtual ICompare * queryCompare() { return &compare; }");
|
|
|
|
|
|
DatasetReference dsRef(dataset);
|
|
|
- buildCompareClass(instance->nestedctx, "compare", sortOrder, dsRef);
|
|
|
+ StringBuffer compareClassInstance;
|
|
|
+ buildCompareClass(instance->nestedctx, "compare", sortOrder, dsRef, compareClassInstance);
|
|
|
+ MemberFunction func(*this, instance->startctx, "virtual ICompare * queryCompare()");
|
|
|
+ func.ctx.addReturnAddressOf(compareClassInstance);
|
|
|
+
|
|
|
if (!instance->isLocal)
|
|
|
generateSerializeKey(instance->nestedctx, no_none, dsRef, sorts, true, true);
|
|
|
|
|
@@ -16630,10 +16682,11 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySort(BuildCtx & ctx, IHqlExpre
|
|
|
StringBuffer s;
|
|
|
buildInstancePrefix(instance);
|
|
|
|
|
|
- instance->classctx.addQuotedLiteral("virtual ICompare * queryCompare() { return &compare; }");
|
|
|
-
|
|
|
// sortlist.setown(spotScalarCSE(sortlist));
|
|
|
- buildCompareClass(instance->nestedctx, "compare", sortlist, DatasetReference(dataset));
|
|
|
+ StringBuffer compareClassInstance;
|
|
|
+ buildCompareClass(instance->nestedctx, "compare", sortlist, DatasetReference(dataset), compareClassInstance);
|
|
|
+ MemberFunction func(*this, instance->classctx, "virtual ICompare * queryCompare()");
|
|
|
+ func.ctx.addReturnAddressOf(compareClassInstance);
|
|
|
|
|
|
IHqlExpression * record = dataset->queryRecord();
|
|
|
IAtom * serializeType = diskAtom; //MORE: Does this place a dependency on the implementation?
|
|
@@ -16642,8 +16695,6 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySort(BuildCtx & ctx, IHqlExpre
|
|
|
{
|
|
|
if (record != serializedRecord)
|
|
|
{
|
|
|
- instance->classctx.addQuotedLiteral("virtual ICompare * queryCompareSerializedRow() { return &compareSR; }");
|
|
|
-
|
|
|
OwnedHqlExpr selSeq = createSelectorSequence();
|
|
|
OwnedHqlExpr leftSelector = createSelector(no_left, dataset, selSeq);
|
|
|
OwnedHqlExpr mappedSortlist = replaceSelector(sortlist, dataset, leftSelector);
|
|
@@ -16652,7 +16703,11 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySort(BuildCtx & ctx, IHqlExpre
|
|
|
DatasetReference serializedRef(serializedDataset, no_left, selSeq);
|
|
|
try
|
|
|
{
|
|
|
- buildCompareClass(instance->nestedctx, "compareSR", serializedSortlist, serializedRef);
|
|
|
+ StringBuffer compareClassInstance2;
|
|
|
+ buildCompareClass(instance->nestedctx, "compareSR", serializedSortlist, serializedRef, compareClassInstance);
|
|
|
+ MemberFunction func(*this, instance->classctx, "virtual ICompare * queryCompareSerializedRow()");
|
|
|
+ func.ctx.addReturnAddressOf(compareClassInstance);
|
|
|
+
|
|
|
}
|
|
|
catch (IException * e)
|
|
|
{
|
|
@@ -16812,9 +16867,10 @@ ABoundActivity * HqlCppTranslator::doBuildActivityQuantile(BuildCtx & ctx, IHqlE
|
|
|
IHqlExpression * dedupAttr = expr->queryAttribute(dedupAtom);
|
|
|
IHqlExpression * range = queryAttributeChild(expr, rangeAtom, 0);
|
|
|
|
|
|
- instance->classctx.addQuotedLiteral("virtual ICompare * queryCompare() { return &compare; }");
|
|
|
-
|
|
|
- buildCompareClass(instance->nestedctx, "compare", sortlist, DatasetReference(dataset));
|
|
|
+ StringBuffer compareClassInstance;
|
|
|
+ buildCompareClass(instance->nestedctx, "compare", sortlist, DatasetReference(dataset), compareClassInstance);
|
|
|
+ MemberFunction func(*this, instance->classctx, "virtual ICompare * queryCompare()");
|
|
|
+ func.ctx.addReturnAddressOf(compareClassInstance);
|
|
|
|
|
|
doBuildUnsigned64Function(instance->startctx, "getNumDivisions", number);
|
|
|
|