reusable index. first attempt at rich search query
authorMarcin Koziej <marcin.koziej@nowoczesnapolska.org.pl>
Thu, 27 Oct 2011 12:18:37 +0000 (14:18 +0200)
committerMarcin Koziej <marcin.koziej@nowoczesnapolska.org.pl>
Tue, 15 Nov 2011 13:24:21 +0000 (14:24 +0100)
apps/search/__init__.py
apps/search/index.py

index b34facb..44da555 100644 (file)
@@ -1,3 +1,3 @@
-from index import Index, Search, ReusableIndex
 import lucene
 lucene.initVM(lucene.CLASSPATH)
 import lucene
 lucene.initVM(lucene.CLASSPATH)
+from index import Index, Search, ReusableIndex
index 33f2aa1..d539257 100644 (file)
@@ -14,6 +14,7 @@ import errno
 from librarian import dcparser
 from librarian.parser import WLDocument
 import catalogue.models
 from librarian import dcparser
 from librarian.parser import WLDocument
 import catalogue.models
+from multiprocessing.pool import ThreadPool
 import atexit
 
 
 import atexit
 
 
@@ -247,24 +248,38 @@ class ReusableIndex(Index):
     if you cannot rely on atexit, use ReusableIndex.close_reusable() yourself.
     """
     index = None
     if you cannot rely on atexit, use ReusableIndex.close_reusable() yourself.
     """
     index = None
-    def open(self, analyzer=None):
+    pool = None
+    pool_jobs = None
+
+    def open(self, analyzer=None, threads=4):
         if ReusableIndex.index is not None:
             self.index = ReusableIndex.index
         else:
         if ReusableIndex.index is not None:
             self.index = ReusableIndex.index
         else:
-            Index.open(self,analyzer)
+            ReusableIndex.pool = ThreadPool(threads)
+            ReusableIndex.pool_jobs = []
+            Index.open(self, analyzer)
             ReusableIndex.index = self.index
             atexit.register(ReusableIndex.close_reusable)
 
             ReusableIndex.index = self.index
             atexit.register(ReusableIndex.close_reusable)
 
+    def index_book(self, *args, **kw):
+        job = ReusableIndex.pool.apply_async(Index.index_book, args, kw)
+        ReusableIndex.pool_jobs.append(job)
+
     @staticmethod
     def close_reusable():
         if ReusableIndex.index is not None:
     @staticmethod
     def close_reusable():
         if ReusableIndex.index is not None:
+            for job in ReusableIndex.pool_jobs:
+                job.wait()
+            ReusableIndex.pool.close()
+
             ReusableIndex.index.optimize()
             ReusableIndex.index.close()
             ReusableIndex.index = None
             ReusableIndex.index.optimize()
             ReusableIndex.index.close()
             ReusableIndex.index = None
-            
+
     def close(self):
         pass
 
     def close(self):
         pass
 
+
 class Search(IndexStore):
     def __init__(self, default_field="content"):
         IndexStore.__init__(self)
 class Search(IndexStore):
     def __init__(self, default_field="content"):
         IndexStore.__init__(self)