Bläddra i källkod

HPCC-12170 Fix noxpath ignored when outputting files or a single row

Signed-off-by: Anthony Fishbeck <anthony.fishbeck@lexisnexis.com>
Anthony Fishbeck 10 år sedan
förälder
incheckning
301041a894
3 ändrade filer med 13 tillägg och 5 borttagningar
  1. 1 1
      ecl/hqlcpp/hqlcpp.ipp
  2. 9 4
      ecl/hqlcpp/hqlhtcpp.cpp
  3. 3 0
      ecl/hqlcpp/hqlttcpp.cpp

+ 1 - 1
ecl/hqlcpp/hqlcpp.ipp

@@ -1643,7 +1643,7 @@ public:
     void buildHTTPtoXml(BuildCtx & ctx);
     void buildSOAPtoXml(BuildCtx & ctx, IHqlExpression * dataset, IHqlExpression * transform, IHqlExpression * selSeq);
 
-    void buildRecordEcl(BuildCtx & subctx, IHqlExpression * dataset, const char * methodName);
+    void buildRecordEcl(BuildCtx & subctx, IHqlExpression * dataset, const char * methodName, bool removeXpath);
     void doTransform(BuildCtx & ctx, IHqlExpression * transform, BoundRow * self);
     void doUpdateTransform(BuildCtx & ctx, IHqlExpression * transform, BoundRow * self, BoundRow * previous, bool alwaysNextRow);
     void doInlineTransform(BuildCtx & ctx, IHqlExpression * transform, BoundRow * targetRow);

+ 9 - 4
ecl/hqlcpp/hqlhtcpp.cpp

@@ -5293,7 +5293,10 @@ void HqlCppTranslator::buildSetResultInfo(BuildCtx & ctx, IHqlExpression * origi
         gatherAttributes(xmlnsAttrs, xmlnsAtom, originalExpr);
         if (retType == type_row)
         {
-            Owned<IWUResult> result = createDatasetResultSchema(seq, name, ::queryRecord(schemaType), xmlnsAttrs, false, false);
+            OwnedHqlExpr record = LINK(::queryRecord(schemaType));
+            if (originalExpr->hasAttribute(noXpathAtom))
+                record.setown(removeAttributeFromFields(record, xpathAtom));
+            Owned<IWUResult> result = createDatasetResultSchema(seq, name, record, xmlnsAttrs, false, false);
             if (result)
                 result->setResultTotalRowCount(1);
         }
@@ -9785,13 +9788,15 @@ void HqlCppTranslator::buildClusterHelper(BuildCtx & ctx, IHqlExpression * expr)
 }
 
 
-void HqlCppTranslator::buildRecordEcl(BuildCtx & subctx, IHqlExpression * dataset, const char * methodName)
+void HqlCppTranslator::buildRecordEcl(BuildCtx & subctx, IHqlExpression * dataset, const char * methodName, bool removeXpath)
 {
     StringBuffer eclFuncName;
     StringBuffer s;
 
     //Ensure the ECL for the record reflects its serialized form, not the internal form
     OwnedHqlExpr record = getSerializedForm(dataset->queryRecord(), diskAtom);
+    if (removeXpath)
+        record.setown(removeAttributeFromFields(record, xpathAtom));
     appendUniqueId(eclFuncName.append("ecl"), getConsistentUID(record));
 
     BuildCtx declarectx(*code, declareAtom);
@@ -10213,7 +10218,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityOutputIndex(BuildCtx & ctx, IH
         instance->classctx.addQuoted(s.clear().append("virtual unsigned getKeyedSize() { return (unsigned) -1; }"));
 
     //virtual const char * queryRecordECL() = 0;
-    buildRecordEcl(instance->createctx, dataset, "queryRecordECL");
+    buildRecordEcl(instance->createctx, dataset, "queryRecordECL", false);
 
     doBuildSequenceFunc(instance->classctx, querySequence(expr), false);
     HqlExprArray xmlnsAttrs;
@@ -10514,7 +10519,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityOutput(BuildCtx & ctx, IHqlExp
                 doBuildUnsignedFunction(instance->classctx, "getFlags", flags.str()+1);
 
             //virtual const char * queryRecordECL() = 0;
-            buildRecordEcl(instance->createctx, dataset, "queryRecordECL");
+            buildRecordEcl(instance->createctx, dataset, "queryRecordECL", expr->hasAttribute(noXpathAtom));
 
             buildExpiryHelper(instance->createctx, expireAttr);
             buildUpdateHelper(instance->createctx, *instance, dataset, updateAttr);

+ 3 - 0
ecl/hqlcpp/hqlttcpp.cpp

@@ -1444,6 +1444,9 @@ IHqlExpression * SequenceNumberAllocator::attachSequenceNumber(IHqlExpression *
                 args.append(*createAttribute(namedAtom, LINK(name)));
             args.append(*createAttribute(outputAtom));
             args.append(*createUniqueId());
+            IHqlExpression *noXpath = expr->queryAttribute(noXpathAtom);
+            if (noXpath)
+                args.append(*LINK(noXpath));
             gatherAttributes(args, xmlnsAtom, expr);
             return createSetResult(args);
         }