Kaynağa Gözat

Add results of postfilter to cache.

Avoid re-performing postfilter when reusing cached result.

Signed-off-by: Jake Smith <jake.smith@lexisnexis.com>
Jake Smith 12 yıl önce
ebeveyn
işleme
4a8fa38cfd
1 değiştirilmiş dosya ile 16 ekleme ve 2 silme
  1. 16 2
      dali/base/dautils.cpp

+ 16 - 2
dali/base/dautils.cpp

@@ -25,6 +25,7 @@
 #include "jsort.hpp"
 #include "jprop.hpp"
 #include "jregexp.hpp"
+#include "jset.hpp"
 #include "rmtfile.hpp"
 
 #include "mpbase.hpp"
@@ -1809,14 +1810,17 @@ class CPECacheElem: public CTimedCacheItem
 public:
     IMPLEMENT_IINTERFACE;
     CPECacheElem(const char *owner)
-        : CTimedCacheItem(owner)
+        : CTimedCacheItem(owner), postFiltered(0)
     {
+        passesFilter.setown(createBitSet());
     }
     ~CPECacheElem()
     {
     }
     Owned<IRemoteConnection> conn;
     IArrayOf<IPropertyTree> totalres;
+    unsigned postFiltered;
+    Owned<IBitSet> passesFilter;
 };
 
 IRemoteConnection *getElementsPaged( const char *basexpath,
@@ -1858,7 +1862,17 @@ IRemoteConnection *getElementsPaged( const char *basexpath,
         n = 0;
         ForEachItemIn(i,elem->totalres) {
             IPropertyTree &item = elem->totalres.item(i);
-            if (postfilter->isOK(item)) {
+            bool passesFilter = false;
+            if (elem->postFiltered>i) // postFiltered is high water mark of items checked
+                passesFilter = elem->passesFilter->test(i);
+            else
+            {
+                passesFilter = postfilter->isOK(item);
+                elem->passesFilter->set(i, passesFilter);
+                elem->postFiltered = i+1;
+            }
+            if (passesFilter)
+            {
                 if (n>=startoffset) {
                     item.Link();
                     results.append(item);