瀏覽代碼

HPCC-11392 Add keyed field indicator support to ECL generated xml schema

Signed-off-by: Anthony Fishbeck <anthony.fishbeck@lexisnexis.com>
Anthony Fishbeck 8 年之前
父節點
當前提交
5bf2ad91d2
共有 5 個文件被更改,包括 24 次插入25 次删除
  1. 10 10
      ecl/hql/hqlutil.cpp
  2. 1 1
      ecl/hql/hqlutil.hpp
  3. 1 1
      ecl/hqlcpp/hqlckey.cpp
  4. 2 2
      ecl/hqlcpp/hqlcpp.ipp
  5. 10 11
      ecl/hqlcpp/hqlhtcpp.cpp

+ 10 - 10
ecl/hql/hqlutil.cpp

@@ -8215,8 +8215,8 @@ public:
     {
     }
 
-    void build(IHqlExpression * record, bool &hasMixedContent) const;
-    void build(IHqlExpression * record) const {bool mixed; build(record, mixed);}
+    void build(IHqlExpression * record, bool &hasMixedContent, unsigned keyedCount) const;
+    void build(IHqlExpression * record, unsigned keyedCount) const {bool mixed; build(record, mixed, keyedCount);}
 
 
 protected:
@@ -8229,7 +8229,7 @@ protected:
 
 
 
-void EclXmlSchemaBuilder::build(IHqlExpression * record, bool &hasMixedContent) const
+void EclXmlSchemaBuilder::build(IHqlExpression * record, bool &hasMixedContent, unsigned keyedCount) const
 {
     StringBuffer name, childName;
     ForEachChild(i, record)
@@ -8249,7 +8249,7 @@ void EclXmlSchemaBuilder::build(IHqlExpression * record, bool &hasMixedContent)
                         unsigned updateMixed=0;
                         builder.beginRecord(name, false, &updateMixed);
                         bool mixed = false;
-                        build(cur->queryRecord(), (name.length()) ? mixed : hasMixedContent);
+                        build(cur->queryRecord(), (name.length()) ? mixed : hasMixedContent, 0);
                         if (mixed)
                             builder.updateMixedRecord(updateMixed, true);
                         builder.endRecord(name);
@@ -8276,7 +8276,7 @@ void EclXmlSchemaBuilder::build(IHqlExpression * record, bool &hasMixedContent)
                             bool mixed = false;
                             if (builder.beginDataset(name, childName, false, &updateMixed))
                             {
-                                build(cur->queryRecord(), (name.length()) ? mixed : hasMixedContent);
+                                build(cur->queryRecord(), (name.length()) ? mixed : hasMixedContent, 0);
                                 if (mixed)
                                     builder.updateMixedRecord(updateMixed, true);
                             }
@@ -8290,7 +8290,7 @@ void EclXmlSchemaBuilder::build(IHqlExpression * record, bool &hasMixedContent)
                 default:
                     extractName(name.clear(), NULL, NULL, cur, NULL);
                     if (name.length())
-                        builder.addField(name, *type, false);
+                        builder.addField(name, *type, i < keyedCount);
                     else
                         hasMixedContent = true;
                     break;
@@ -8299,11 +8299,11 @@ void EclXmlSchemaBuilder::build(IHqlExpression * record, bool &hasMixedContent)
             }
         case no_ifblock:
             builder.beginIfBlock();
-            build(cur->queryChild(1), hasMixedContent);
+            build(cur->queryChild(1), hasMixedContent, 0);
             builder.endIfBlock();
             break;
         case no_record:
-            build(cur, hasMixedContent);
+            build(cur, hasMixedContent, 0);
             break;
         }
     }
@@ -8324,11 +8324,11 @@ void EclXmlSchemaBuilder::extractName(StringBuffer & name, StringBuffer * itemNa
 }
 
 
-void getRecordXmlSchema(StringBuffer & result, IHqlExpression * record, bool useXPath)
+void getRecordXmlSchema(StringBuffer & result, IHqlExpression * record, bool useXPath, unsigned keyedCount)
 {
     XmlSchemaBuilder xmlbuilder(false);
     EclXmlSchemaBuilder builder(xmlbuilder, useXPath);
-    builder.build(record);
+    builder.build(record, keyedCount);
     xmlbuilder.getXml(result);
 }
 

+ 1 - 1
ecl/hql/hqlutil.hpp

@@ -699,7 +699,7 @@ extern HQL_API bool createMangledFunctionName(StringBuffer & mangled, IHqlExpres
 
 extern HQL_API void extractXmlName(StringBuffer & name, StringBuffer * itemName, StringBuffer * valueName, IHqlExpression * field, const char * defaultItemName, bool reading);
 extern HQL_API void extractXmlName(SharedHqlExpr & name, OwnedHqlExpr * itemName, OwnedHqlExpr * valueName, IHqlExpression * field, const char * defaultItemName, bool reading);
-extern HQL_API void getRecordXmlSchema(StringBuffer & result, IHqlExpression * record, bool useXPath);
+extern HQL_API void getRecordXmlSchema(StringBuffer & result, IHqlExpression * record, bool useXPath, unsigned keyedCount);
 
 extern HQL_API IHqlExpression * querySimplifyInExpr(IHqlExpression * expr);
 extern HQL_API IHqlExpression * createSizeof(IHqlExpression * expr);

+ 1 - 1
ecl/hqlcpp/hqlckey.cpp

@@ -1678,7 +1678,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityKeyPatch(BuildCtx & ctx, IHqlE
     //virtual int getSequence() = 0;
     doBuildSequenceFunc(instance->classctx, querySequence(expr), false);
     HqlExprArray xmlnsAttrs;
-    Owned<IWUResult> result = createDatasetResultSchema(querySequence(expr), NULL, original->queryRecord(), xmlnsAttrs, false, true);
+    Owned<IWUResult> result = createDatasetResultSchema(querySequence(expr), NULL, original->queryRecord(), xmlnsAttrs, false, true, 0);
 
     buildExpiryHelper(instance->createctx, expr->queryAttribute(expireAtom));
 

+ 2 - 2
ecl/hqlcpp/hqlcpp.ipp

@@ -1854,10 +1854,10 @@ protected:
     void generateSortCompare(BuildCtx & nestedctx, BuildCtx & ctx, node_operator index, const DatasetReference & dataset, const HqlExprArray & sorts, IHqlExpression * noSortAttr, bool canReuseLeft, bool isLightweight, bool isLocal);
     void addSchemaField(IHqlExpression *field, MemoryBuffer &schema, IHqlExpression *selector);
     void addSchemaFields(IHqlExpression * record, MemoryBuffer &schema, IHqlExpression *selector);
-    void addSchemaResource(int seq, const char * name, IHqlExpression * record);
+    void addSchemaResource(int seq, const char * name, IHqlExpression * record, unsigned keyedCount);
     void addSchemaResource(int seq, const char * name, unsigned len, const char * schemaXml);
     void doAddSchemaFields(IHqlExpression * record, MemoryBuffer &schema, IHqlExpression *selector);
-    IWUResult * createDatasetResultSchema(IHqlExpression * sequenceExpr, IHqlExpression * name, IHqlExpression * record, HqlExprArray &xmlnsAttrs, bool createTransformer, bool isFile);
+    IWUResult * createDatasetResultSchema(IHqlExpression * sequenceExpr, IHqlExpression * name, IHqlExpression * record, HqlExprArray &xmlnsAttrs, bool createTransformer, bool isFile, unsigned keyedCount);
 
     void buildReturnCsvValue(BuildCtx & ctx, IHqlExpression * _expr);
     void buildCsvListFunc(BuildCtx & classctx, const char * func, IHqlExpression * value, const char * defaultValue);

+ 10 - 11
ecl/hqlcpp/hqlhtcpp.cpp

@@ -5330,7 +5330,7 @@ void HqlCppTranslator::buildSetResultInfo(BuildCtx & ctx, IHqlExpression * origi
             OwnedHqlExpr record = LINK(::queryRecord(schemaType));
             if (originalExpr->hasAttribute(noXpathAtom))
                 record.setown(removeAttributeFromFields(record, xpathAtom));
-            result.setown(createDatasetResultSchema(seq, name, record, xmlnsAttrs, false, false));
+            result.setown(createDatasetResultSchema(seq, name, record, xmlnsAttrs, false, false, 0));
             if (result)
                 result->setResultTotalRowCount(1);
         }
@@ -7769,7 +7769,7 @@ void HqlCppTranslator::doBuildStmtSetResult(BuildCtx & ctx, IHqlExpression * exp
                 buildFunctionCall(subctx, setResultSetId, args);
                 HqlExprArray xmlnsAttrs;
                 gatherAttributes(xmlnsAttrs, xmlnsAtom, expr);
-                Owned<IWUResult> result = createDatasetResultSchema(seq, name, value->queryRecord(), xmlnsAttrs, true, false);
+                Owned<IWUResult> result = createDatasetResultSchema(seq, name, value->queryRecord(), xmlnsAttrs, true, false, 0);
                 break;
             }
         default:
@@ -10360,7 +10360,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityOutputIndex(BuildCtx & ctx, IH
     doBuildSequenceFunc(instance->classctx, querySequence(expr), false);
     HqlExprArray xmlnsAttrs;
     gatherAttributes(xmlnsAttrs, xmlnsAtom, expr);
-    Owned<IWUResult> result = createDatasetResultSchema(querySequence(expr), queryResultName(expr), dataset->queryRecord(), xmlnsAttrs, false, true);
+    Owned<IWUResult> result = createDatasetResultSchema(querySequence(expr), queryResultName(expr), dataset->queryRecord(), xmlnsAttrs, false, true, fields.ordinality());
 
     if (expr->hasAttribute(setAtom))
     {
@@ -10688,7 +10688,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityOutput(BuildCtx & ctx, IHqlExp
         HqlExprArray xmlnsAttrs;
         gatherAttributes(xmlnsAttrs, xmlnsAtom, expr);
         bool createTransformer = (kind != TAKcsvwrite) && (kind != TAKxmlwrite) && (kind != TAKjsonwrite);
-        Owned<IWUResult> result = createDatasetResultSchema(seq, queryResultName(expr), outputRecord, xmlnsAttrs, createTransformer, true);
+        Owned<IWUResult> result = createDatasetResultSchema(seq, queryResultName(expr), outputRecord, xmlnsAttrs, createTransformer, true, 0);
         if (expr->hasAttribute(resultAtom))
             result->setResultRowLimit(-1);
 
@@ -10838,14 +10838,13 @@ void HqlCppTranslator::addSchemaFields(IHqlExpression * record, MemoryBuffer &sc
 }
 
 
-void HqlCppTranslator::addSchemaResource(int seq, const char * name, IHqlExpression * record)
+void HqlCppTranslator::addSchemaResource(int seq, const char * name, IHqlExpression * record, unsigned keyedCount)
 {
     StringBuffer xml;
-    getRecordXmlSchema(xml, record, true);
+    getRecordXmlSchema(xml, record, true, keyedCount);
     addSchemaResource(seq, name, xml.length()+1, xml.str());
 }
 
-
 void HqlCppTranslator::addSchemaResource(int seq, const char * name, unsigned len, const char * schemaXml)
 {
     Owned<IPropertyTree> manifestEntry = createPTree("Resource");
@@ -10859,7 +10858,7 @@ void HqlCppTranslator::finalizeResources()
 {
 }
 
-IWUResult * HqlCppTranslator::createDatasetResultSchema(IHqlExpression * sequenceExpr, IHqlExpression * name, IHqlExpression * record, HqlExprArray &xmlnsAttrs, bool createTransformer, bool isFile)
+IWUResult * HqlCppTranslator::createDatasetResultSchema(IHqlExpression * sequenceExpr, IHqlExpression * name, IHqlExpression * record, HqlExprArray &xmlnsAttrs, bool createTransformer, bool isFile, unsigned keyedCount)
 {
     //Some spills have no sequence attached
     if (!sequenceExpr)
@@ -10878,7 +10877,7 @@ IWUResult * HqlCppTranslator::createDatasetResultSchema(IHqlExpression * sequenc
 
     SCMStringBuffer resultName;
     result->getResultName(resultName);
-    addSchemaResource(sequence, resultName.str(), record);
+    addSchemaResource(sequence, resultName.str(), record, keyedCount);
 
     result->setResultSchemaRaw(schema.length(), schema.toByteArray());
     result->setResultScalar(false);
@@ -11307,7 +11306,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityOutputWorkunit(BuildCtx & ctx,
         HqlExprArray xmlnsAttrs;
         gatherAttributes(xmlnsAttrs, xmlnsAtom, expr);
         IHqlExpression * outputRecord = instance->meta.queryRecord();
-        Owned<IWUResult> result = createDatasetResultSchema(seq, name, outputRecord, xmlnsAttrs, true, false);
+        Owned<IWUResult> result = createDatasetResultSchema(seq, name, outputRecord, xmlnsAttrs, true, false, 0);
         if (result)
         {
             result->setResultRowLimit(-1);
@@ -11364,7 +11363,7 @@ void HqlCppTranslator::doBuildStmtOutput(BuildCtx & ctx, IHqlExpression * expr)
 
     HqlExprArray xmlnsAttrs;
     gatherAttributes(xmlnsAttrs, xmlnsAtom, expr);
-    Owned<IWUResult> result = createDatasetResultSchema(seq, name, dataset->queryRecord(), xmlnsAttrs, true, false);
+    Owned<IWUResult> result = createDatasetResultSchema(seq, name, dataset->queryRecord(), xmlnsAttrs, true, false, 0);
 
     CHqlBoundExpr bound;
     buildDataset(ctx, dataset, bound, FormatNatural);