浏览代码

HPCC-20090 Return partition/bloom information in WsDfu.DFUInfo

Signed-off-by: wangkx <kevin.wang@lexisnexis.com>
wangkx 7 年之前
父节点
当前提交
9b8c1e188b
共有 3 个文件被更改,包括 93 次插入1 次删除
  1. 17 1
      esp/scm/ws_dfu.ecm
  2. 73 0
      esp/services/ws_dfu/ws_dfuService.cpp
  3. 3 0
      esp/services/ws_dfu/ws_dfuService.hpp

+ 17 - 1
esp/scm/ws_dfu.ecm

@@ -42,6 +42,20 @@ ESPStruct SpaceItem
     int64 SmallestSizeInt;
 };
 
+ESPStruct DFUFilePartition
+{
+    int64 FieldMask;
+    ESParray<string> FieldNames;
+};
+
+ESPStruct DFUFileBloom
+{
+    int64 FieldMask;
+    ESParray<string> FieldNames;
+    int64 Limit;
+    string Probability;
+};
+
 ESPStruct DFULogicalFile
 {
     string Prefix;
@@ -160,6 +174,8 @@ ESPStruct [nil_remove] DFUFileDetail
     [min_ver("1.37"), json_inline(1)] string jsonInfo;
     [min_ver("1.37")] binary binInfo;
     [min_ver("1.38")] string PackageID;
+    [min_ver("1.39")] ESPstruct DFUFilePartition Partitions;
+    [min_ver("1.39")] ESPstruct DFUFileBloom Blooms;
 };
 
 ESPStruct DFUSpaceItem
@@ -793,7 +809,7 @@ ESPresponse [exceptions_inline, nil_remove] EraseHistoryResponse
 //  ===========================================================================
 ESPservice [
     auth_feature("DEFERRED"),
-    version("1.38"),
+    version("1.39"),
     noforms,
     exceptions_inline("./smc_xslt/exceptions.xslt")] WsDfu
 {

+ 73 - 0
esp/services/ws_dfu/ws_dfuService.cpp

@@ -1977,6 +1977,51 @@ void CWsDfuEx::getFilePartsOnClusters(IEspContext &context, const char* clusterR
     }
 }
 
+void CWsDfuEx::parseFieldMask(unsigned __int64 fieldMask, unsigned &fieldCount, IntArray &fieldIndexArray)
+{
+    if (fieldMask == 0)
+        return;
+
+    fieldCount++;
+    if (fieldMask % 2)
+        fieldIndexArray.append(fieldCount);
+    parseFieldMask(fieldMask/2, fieldCount, fieldIndexArray);
+}
+
+void CWsDfuEx::queryFieldNames(IEspContext &context, const char *fileName, const char *cluster,
+    unsigned __int64 fieldMask, StringArray &fieldNames)
+{
+    if (!fileName || !*fileName)
+        throw MakeStringException(ECLWATCH_MISSING_PARAMS, "File name required");
+
+    Owned<IResultSetFactory> resultSetFactory = getSecResultSetFactory(context.querySecManager(), context.queryUser(), context.queryUserId(), context.queryPassword());
+    Owned<INewResultSet> result = resultSetFactory->createNewFileResultSet(fileName, cluster);
+    if (!result)
+        throw MakeStringException(ECLWATCH_INVALID_INPUT, "Failed to access FileResultSet for %s.", fileName);
+
+    unsigned fieldCount = 0;
+    IntArray fieldIndexArray;
+    parseFieldMask(fieldMask, fieldCount, fieldIndexArray);
+
+    const IResultSetMetaData& metaData = result->getMetaData();
+    unsigned totalColumns = (unsigned) metaData.getColumnCount();
+    if (fieldCount > totalColumns)
+        throw MakeStringException(ECLWATCH_INVALID_INPUT, "Invalid FieldMask %" I64F "u: total fields %u, ask for %u.",
+            fieldMask, totalColumns, fieldCount);
+
+    ForEachItemIn(i, fieldIndexArray)
+    {
+        int fieldIndex = fieldIndexArray.item(i);
+
+        SCMStringBuffer columnLabel;
+        if (metaData.hasSetTranslation(fieldIndex))
+            metaData.getNaturalColumnLabel(columnLabel, fieldIndex);
+        if (columnLabel.length() < 1)
+            metaData.getColumnLabel(columnLabel, fieldIndex);
+        fieldNames.append(columnLabel.str());
+    }
+}
+
 void CWsDfuEx::doGetFileDetails(IEspContext &context, IUserDescriptor *udesc, const char *name, const char *cluster,
     const char *querySet, const char *query, const char *description, bool includeJsonTypeInfo, bool includeBinTypeInfo, IEspDFUFileDetail &FileDetails)
 {
@@ -2107,6 +2152,34 @@ void CWsDfuEx::doGetFileDetails(IEspContext &context, IUserDescriptor *udesc, co
     FileDetails.setOwner(df->queryAttributes().queryProp("@owner"));
     FileDetails.setJobName(df->queryAttributes().queryProp("@job"));
 
+    if (version >= 1.39)
+    {
+        if (df->queryAttributes().hasProp("@partitionFieldMask"))
+        {
+            StringArray partitionFieldNames;
+            unsigned __int64 partitionFieldMask = df->queryAttributes().getPropInt64("@partitionFieldMask");
+            queryFieldNames(context, name, cluster, partitionFieldMask, partitionFieldNames);
+
+            IEspDFUFilePartition &partition = FileDetails.updatePartitions();
+            partition.setFieldMask(partitionFieldMask);
+            partition.setFieldNames(partitionFieldNames);
+        }
+
+        IPropertyTree *bloom = df->queryAttributes().queryPropTree("Bloom");
+        if (bloom)
+        {
+            StringArray bloomFieldNames;
+            unsigned __int64 bloomFieldMask = bloom->getPropInt64("@bloomFieldMask");
+            queryFieldNames(context, name, cluster, bloomFieldMask, bloomFieldNames);
+
+            IEspDFUFileBloom &blooms = FileDetails.updateBlooms();
+            blooms.setFieldMask(bloomFieldMask);
+            blooms.setFieldNames(bloomFieldNames);
+            blooms.setLimit(bloom->getPropInt64("@bloomLimit"));
+            blooms.setProbability(bloom->queryProp("@bloomProbability"));
+        }
+    }
+
     //#14280
     IDistributedSuperFile *sf = df->querySuperFile();
     if(sf)

+ 3 - 0
esp/services/ws_dfu/ws_dfuService.hpp

@@ -227,6 +227,9 @@ private:
     void getFilePartsOnClusters(IEspContext &context, const char* clusterReq, StringArray& clusters, IDistributedFile* df, IEspDFUFileDetail& FileDetails,
         offset_t& mn, offset_t& mx, offset_t& sum, offset_t& count);
     bool getQueryFile(const char *logicalName, const char *querySet, const char *queryID, IEspDFUFileDetail &fileDetails);
+    void queryFieldNames(IEspContext &context, const char *fileName, const char *cluster,
+        unsigned __int64 fieldMask, StringArray &fieldNames);
+    void parseFieldMask(unsigned __int64 fieldMask, unsigned &fieldCount, IntArray &fieldIndexArray);
     bool attachServiceToDali() override
     {
         SpinBlock b(m_daliDetachedStateLock);