Просмотр исходного кода

HPCC-11666 Make Queries list filterable by referenced library

Signed-off-by: Anthony Fishbeck <anthony.fishbeck@lexisnexis.com>
Anthony Fishbeck 11 лет назад
Родитель
Сommit
b6db284c54

+ 57 - 3
common/workunit/workunit.cpp

@@ -1894,6 +1894,7 @@ mapEnums querySortFields[] =
    { WUQSFpriority, "@priority" },
    { WUQSFpriorityHi, "@priority" },
    { WUQSFQuerySet, "../@id" },
+   { WUQSFLibrary, "Library"},
    { WUQSFterm, NULL }
 };
 
@@ -2388,6 +2389,28 @@ public:
         return getWorkUnitsSorted(sortorder,filters,filterbuf,startoffset,maxnum,queryowner,cachehint, NULL, NULL, total);
     }
 
+    static void checkUpdateQuerysetLibraries(IPropertyTree *querySet)
+    {
+        if (querySet->hasProp("@updatedLibraries")) //only need to do this once, then publish and copy will keep up to date
+            return;
+        Owned<IWorkUnitFactory> factory = getWorkUnitFactory();
+        Owned<IPropertyTreeIterator> queries = querySet->getElements("Query");
+        ForEach(*queries)
+        {
+            IPropertyTree &query = queries->query();
+            if (query.hasProp("@libCount"))
+                continue;
+            const char *wuid = query.queryProp("@wuid");
+            if (!wuid || !*wuid)
+                continue;
+            Owned<IConstWorkUnit> cw = factory->openWorkUnit(wuid, false);
+            if (!cw)
+                continue;
+            addLibrariesToQueryEntry(&query, cw);
+        }
+        querySet->setPropBool("@updatedLibraries", true);
+    }
+
     IConstQuerySetQueryIterator* getQuerySetQueriesSorted( WUQuerySortField *sortorder, // list of fields to sort by (terminated by WUSFterm)
                                                 WUQuerySortField *filters,   // NULL or list of fields to folteron (terminated by WUSFterm)
                                                 const void *filterbuf,  // (appended) string values for filters
@@ -2401,6 +2424,7 @@ public:
             StringAttr querySet;
             StringAttr xPath;
             StringAttr sortOrder;
+            bool checkLibraries;
 
             void populateQueryTree(IPropertyTree* queryRegistry, const char* querySetId, IPropertyTree* querySetTree, const char *xPath, IPropertyTree* queryTree)
             {
@@ -2431,6 +2455,8 @@ public:
                 if (querySet && *querySet)
                 {
                     Owned<IPropertyTree> queryRegistry = getQueryRegistry(querySet, false);
+                    if (checkLibraries)
+                        checkUpdateQuerysetLibraries(queryRegistry); //only actually happens once per queryset
                     VStringBuffer path("QuerySet[@id='%s']/Query%s", querySet, xPath);
                     populateQueryTree(queryRegistry, querySet, root, path.str(), queryTree);
                 }
@@ -2444,6 +2470,8 @@ public:
                         if (id && *id)
                         {
                             Owned<IPropertyTree> queryRegistry = getQueryRegistry(id, false);
+                            if (checkLibraries)
+                                checkUpdateQuerysetLibraries(queryRegistry); //only actually happens once per queryset
                             VStringBuffer path("Query%s", xPath);
                             populateQueryTree(queryRegistry, id, &querySetTree, path.str(), queryTree);
                         }
@@ -2455,8 +2483,8 @@ public:
         public:
             IMPLEMENT_IINTERFACE_USING(CSimpleInterface);
 
-            CQuerySetQueriesPager(const char* _querySet, const char* _xPath, const char *_sortOrder)
-                : querySet(_querySet), xPath(_xPath), sortOrder(_sortOrder)
+            CQuerySetQueriesPager(const char* _querySet, const char* _xPath, const char *_sortOrder, bool _checkLibraries)
+                : querySet(_querySet), xPath(_xPath), sortOrder(_sortOrder), checkLibraries(_checkLibraries)
             {
             }
             virtual IRemoteConnection* getElements(IArrayOf<IPropertyTree> &elements)
@@ -2477,6 +2505,7 @@ public:
         StringAttr querySet;
         StringBuffer xPath;
         StringBuffer so;
+        bool checkLibraries = false;
         if (filters)
         {
             const char *fv = (const char *)filterbuf;
@@ -2499,6 +2528,8 @@ public:
                         xPath.append('~');
                     xPath.append('"').append(fv).append("\"]");
                 }
+                if (subfmt==WUQSFLibrary)
+                    checkLibraries = true;
                 fv = fv + strlen(fv)+1;
             }
         }
@@ -2519,7 +2550,7 @@ public:
             }
         }
         IArrayOf<IPropertyTree> results;
-        Owned<IElementsPager> elementsPager = new CQuerySetQueriesPager(querySet.get(), xPath.str(), so.length()?so.str():NULL);
+        Owned<IElementsPager> elementsPager = new CQuerySetQueriesPager(querySet.get(), xPath.str(), so.length()?so.str():NULL, checkLibraries);
         Owned<IRemoteConnection> conn=getElementsPaged(elementsPager,startoffset,maxnum,NULL,"",cachehint,results,total);
         return new CConstQuerySetQueryIterator(results);
     }
@@ -9703,7 +9734,30 @@ extern WORKUNIT_API IPropertyTree * getQueryRegistryRoot()
             return NULL;
 }
 
+extern WORKUNIT_API void addLibrariesToQueryEntry(IPropertyTree *queryTree, IConstWULibraryIterator *libraries)
+{
+    if (!queryTree || !libraries)
+        return;
+    if (queryTree->hasProp("@libCount")) //already added
+        return;
+    unsigned libCount=0;
+    ForEach(*libraries)
+    {
+        IConstWULibrary &library = libraries->query();
+        SCMStringBuffer libname;
+        if (!library.getName(libname).length())
+            continue;
+        queryTree->addProp("Library", libname.str());
+        libCount++;
+    }
+    queryTree->setPropInt("@libCount", libCount);
+}
 
+extern WORKUNIT_API void addLibrariesToQueryEntry(IPropertyTree *queryTree, IConstWorkUnit *cw)
+{
+    Owned<IConstWULibraryIterator> libraries = &cw->getLibraries();
+    addLibrariesToQueryEntry(queryTree, libraries);
+}
 
 extern WORKUNIT_API IPropertyTree * getQueryRegistry(const char * wsEclId, bool readonly)
 {

+ 4 - 0
common/workunit/workunit.hpp

@@ -1104,6 +1104,7 @@ enum WUQuerySortField
     WUQSFpriority = 11,
     WUQSFpriorityHi = 12,
     WUQSFQuerySet = 13,
+    WUQSFLibrary = 14,
     WUQSFterm = 0,
     WUQSFreverse = 256,
     WUQSFnocase = 512,
@@ -1255,6 +1256,9 @@ extern WORKUNIT_API IPropertyTree * resolveQueryAlias(const char *queryset, cons
 extern WORKUNIT_API IPropertyTree * getQueryRegistry(const char * wsEclId, bool readonly);
 extern WORKUNIT_API IPropertyTree * getQueryRegistryRoot();
 
+extern WORKUNIT_API void addLibrariesToQueryEntry(IPropertyTree *queryTree, IConstWULibraryIterator *libraries);
+extern WORKUNIT_API void addLibrariesToQueryEntry(IPropertyTree *queryTree, IConstWorkUnit *cw);
+
 extern WORKUNIT_API void setQueryCommentForNamedQuery(IPropertyTree * queryRegistry, const char *id, const char *queryComment);
 
 extern WORKUNIT_API void setQuerySuspendedState(IPropertyTree * queryRegistry, const char * name, bool suspend, const char *userid);

+ 1 - 0
esp/scm/ws_workunits.ecm

@@ -1230,6 +1230,7 @@ ESPrequest [nil_remove] WUListQueriesRequest
 {
     string  QuerySetName;
     string  ClusterName;
+    string  LibraryName;
     int64 MemoryLimitLow;
     int64 MemoryLimitHigh;
     nonNegativeInteger TimeLimitLow;

+ 12 - 3
esp/services/ws_workunits/ws_workunitsQuerySets.cpp

@@ -704,7 +704,6 @@ bool CWsWorkunitsEx::isQuerySuspended(const char* query, IConstWUClusterInfo *cl
     }
 }
 
-
 bool CWsWorkunitsEx::onWUPublishWorkunit(IEspContext &context, IEspWUPublishWorkunitRequest & req, IEspWUPublishWorkunitResponse & resp)
 {
     StringBuffer wuid = req.getWuid();
@@ -755,7 +754,8 @@ bool CWsWorkunitsEx::onWUPublishWorkunit(IEspContext &context, IEspWUPublishWork
     StringBuffer queryId;
     WUQueryActivationOptions activate = (WUQueryActivationOptions)req.getActivate();
     addQueryToQuerySet(wu, target.str(), queryName.str(), activate, queryId, context.queryUserId());
-    if (req.getMemoryLimit() || !req.getTimeLimit_isNull() || !req.getWarnTimeLimit_isNull() || req.getPriority() || req.getComment())
+    Owned<IConstWULibraryIterator> libraries = &wu->getLibraries();
+    if (libraries->first() || req.getMemoryLimit() || !req.getTimeLimit_isNull() || !req.getWarnTimeLimit_isNull() || req.getPriority() || req.getComment())
     {
         Owned<IPropertyTree> queryTree = getQueryById(target.str(), queryId, false);
         updateMemoryLimitSetting(queryTree, req.getMemoryLimit());
@@ -764,6 +764,7 @@ bool CWsWorkunitsEx::onWUPublishWorkunit(IEspContext &context, IEspWUPublishWork
         updateQueryPriority(queryTree, req.getPriority());
         if (req.getComment())
             queryTree->setProp("@comment", req.getComment());
+        addLibrariesToQueryEntry(queryTree, libraries);
     }
     wu->commit();
     wu.clear();
@@ -1226,6 +1227,7 @@ bool CWsWorkunitsEx::onWUListQueries(IEspContext &context, IEspWUListQueriesRequ
     MemoryBuffer filterBuf;
     const char* clusterReq = req.getClusterName();
     addWUQSQueryFilter(filters, filterCount, filterBuf, req.getQuerySetName(), WUQSFQuerySet);
+    addWUQSQueryFilter(filters, filterCount, filterBuf, req.getLibraryName(), WUQSFLibrary);
     if (!req.getMemoryLimitLow_isNull())
         addWUQSQueryFilterInt64(filters, filterCount, filterBuf, req.getMemoryLimitLow(), (WUQuerySortField) (WUQSFmemoryLimit | WUQSFnumeric));
     if (!req.getMemoryLimitHigh_isNull())
@@ -1870,6 +1872,13 @@ public:
                 if (!destQuery->hasProp(atname))
                     destQuery->setProp(atname, aiter->queryValue());
             }
+            Owned<IPropertyTreeIterator> children = query->getElements("*");
+            ForEach(*children)
+            {
+                IPropertyTree &child = children->query();
+                destQuery->addPropTree(child.queryName(), createPTreeFromIPT(&child));
+            }
+            addLibrariesToQueryEntry(destQuery, workunit);
             if (cloneFilesEnabled && wufiles)
                 wufiles->addFilesFromQuery(workunit, pm, newQueryId);
         }
@@ -1944,7 +1953,6 @@ public:
     StringArray copiedQueryIds;
 };
 
-
 bool CWsWorkunitsEx::onWUCopyQuerySet(IEspContext &context, IEspWUCopyQuerySetRequest &req, IEspWUCopyQuerySetResponse &resp)
 {
     const char *source = req.getSource();
@@ -2058,6 +2066,7 @@ bool CWsWorkunitsEx::onWUQuerysetCopyQuery(IEspContext &context, IEspWUQuerySetC
     addQueryToQuerySet(wu, target, queryName.str(), activate, targetQueryId, context.queryUserId());
 
     Owned<IPropertyTree> queryTree = getQueryById(target, targetQueryId, false);
+    addLibrariesToQueryEntry(queryTree, wu);
     if (queryTree)
     {
         IConstQuerySetQuery *srcInfo=NULL;