searchengine/cpix/cpix/src/cpixhits.cpp
changeset 15 cf5c74390b98
parent 0 671dee74050a
child 23 d4d56f5e7c55
--- a/searchengine/cpix/cpix/src/cpixhits.cpp	Tue Jul 06 15:30:04 2010 +0300
+++ b/searchengine/cpix/cpix/src/cpixhits.cpp	Wed Aug 18 10:53:26 2010 +0300
@@ -36,18 +36,27 @@
     }
 
 
-    void HitsBase::destroyWrappers()
+    void HitsBase::destroyWrappers(int32_t index)
     {
         WrapperMap::iterator
-            i = wrappers_.begin(),
-            end = wrappers_.end();
+            i = wrappers_.begin();
 
-        for (; i != end; ++i)
+        if  (index == -1) {
+            for (; i != wrappers_.end(); ++i)
             {
                 delete i->second;
+                wrappers_.clear();
             }
+        } else {
+            for (; i != wrappers_.find(index); ++i)
+            {
+                delete i->second;
+                
+            }
+            wrappers_.erase(wrappers_.begin(),wrappers_.find(index));
+        }
 
-        wrappers_.clear();
+        
     }
 
 
@@ -61,16 +70,26 @@
     void HitsBase::wrapDocument(int32_t                      index,
                                 lucene::document::Document * doc)
     {
-        if (wrappers_.find(index) != wrappers_.end())
+//        if (wrappers_.find(index) != wrappers_.end())
+//            {
+//                delete wrappers_[index];
+//                wrappers_[index] = NULL;
+//            }
+//
+//        Cpix::Document
+//            * cpixDoc = new Cpix::Document(doc,
+//                                           docsOwnedByClucene_);
+//        wrappers_[index] = cpixDoc;
+        
+        if (wrappers_.find(index) == wrappers_.end())
             {
-                delete wrappers_[index];
-                wrappers_[index] = NULL;
+                Cpix::Document
+                    * cpixDoc = new Cpix::Document(doc,
+                                                   docsOwnedByClucene_);
+                wrappers_[index] = cpixDoc;
             }
 
-        Cpix::Document
-            * cpixDoc = new Cpix::Document(doc,
-                                           docsOwnedByClucene_);
-        wrappers_[index] = cpixDoc;
+
     }
 
 
@@ -89,7 +108,19 @@
         return rv;
     }
 
-
+    int HitsBase::resetDocumentCache(int32_t index, int32_t count)
+    {
+        int32_t reqCount = index + count;
+        int rv = 0;
+        int i = (wrappers_.begin()->first)+ (int32_t) wrappers_.size();
+        if ((i < reqCount) || (index < wrappers_.begin()->first))
+            {
+                getDocument_(index);
+               
+            }
+        rv = (int32_t) wrappers_.size();
+        return rv;
+    }
 
     /**
      * Class ClhDocumentConsumer
@@ -144,7 +175,8 @@
                               clHits_.length());
             }
 
-        beginIndex_ = index - (index % pageSize_);
+        //beginIndex_ = index - (index % pageSize_);
+        beginIndex_ = index;
         endIndex_ = beginIndex_ + pageSize_;
 
         endIndex_ = std::min(clHits_.length(),
@@ -234,7 +266,7 @@
         delete hits_; 
         hits_ = 0; 
         
-        destroyWrappers();
+        destroyWrappers(0);
 
         delete docConsumer_;
 
@@ -245,7 +277,7 @@
     void LuceneHits::getDocument_(int32_t index) 
     {
         // check if we have tried to fetch it before and failed
-        docConsumer_->throwIfFailedDocIndex(index);
+        //docConsumer_->throwIfFailedDocIndex(index);
 
         // common usage pattern is to enumerate hits, never to access
         // them at true random manner. That means that we never need
@@ -253,7 +285,7 @@
         // fetch the next page we can discard all other wrapped
         // documents. Merely an memory consumption optimization
         // measure, can be commented out.
-        destroyWrappers();
+        destroyWrappers(index);
 
         // if we get here, then it means we don't have the page of hit
         // docs we need, but it may still throw if the hits is an
@@ -304,12 +336,12 @@
 	
     HitDocumentList::~HitDocumentList()
     {
-        destroyWrappers();
+        destroyWrappers(0);
         for (std::vector<lucene::document::Document*>::iterator i = documents_.begin(); 
              i != documents_.end(); 
              i++) 
             {
-                _CLDELETE(*i); 
+                _CLDELETE(*i);
             }
     }