Author: j16sdiz
Date: 2008-12-17 07:28:18 +0000 (Wed, 17 Dec 2008)
New Revision: 24421

Modified:
   trunk/plugins/XMLSpider/XMLSpider.java
Log:
cache some TermPosition in memory

Modified: trunk/plugins/XMLSpider/XMLSpider.java
===================================================================
--- trunk/plugins/XMLSpider/XMLSpider.java      2008-12-17 07:17:31 UTC (rev 
24420)
+++ trunk/plugins/XMLSpider/XMLSpider.java      2008-12-17 07:28:18 UTC (rev 
24421)
@@ -1288,7 +1288,7 @@
                        if (word.length() < 3)
                                return;
                        Term term = getTermByWord(word, true);
-                       TermPosition termPos = getTermPosition(term, page, 
true);
+                       TermPosition termPos = getTermPosition(term, true);
 
                        synchronized (termPos) {
                                int[] newPositions = new 
int[termPos.positions.length + 1];
@@ -1301,6 +1301,46 @@
 
                        mustWriteIndex = true;
                }
+
+               protected Map<Term, TermPosition> termPosCache = new 
LinkedHashMap<Term, TermPosition>() {
+                       protected boolean removeEldestEntry(Map.Entry<Term, 
TermPosition> eldest) {
+                               return size() > 128;
+                       }
+               };
+
+               protected TermPosition getTermPosition(Term term, boolean 
create) {
+                       synchronized (term) {
+                               TermPosition cachedTermPos = 
termPosCache.get(term);
+                               if (cachedTermPos != null)
+                                       return cachedTermPos;
+
+                               synchronized (page) {
+                                       Query query = db.query();
+                                       query.constrain(TermPosition.class);
+
+                                       
query.descend("word").constrain(term.word);
+                                       
query.descend("pageId").constrain(page.id);
+                                       ObjectSet<TermPosition> set = 
query.execute();
+
+                                       if (set.hasNext()) {
+                                               cachedTermPos = set.next();
+                                               termPosCache.put(term, 
cachedTermPos);
+                                               return cachedTermPos;
+                                       } else if (create) {
+                                               cachedTermPos = new 
TermPosition();
+                                               cachedTermPos.word = term.word;
+                                               cachedTermPos.pageId = page.id;
+                                               cachedTermPos.positions = new 
int[0];
+
+                                               termPosCache.put(term, 
cachedTermPos);
+                                               db.store(cachedTermPos);
+                                               return cachedTermPos;
+                                       } else {
+                                               return null;
+                                       }
+                               }
+                       }
+               }
        }
 
        private boolean mustWriteIndex = false;
@@ -1495,31 +1535,4 @@
                                return null;
                }
        }
-
-       protected TermPosition getTermPosition(Term term, Page page, boolean 
create) {
-               synchronized (term) {
-                       synchronized (page) {
-                               Query query = db.query();
-                               query.constrain(TermPosition.class);
-
-                               query.descend("word").constrain(term.word);
-                               query.descend("pageId").constrain(page.id);
-                               ObjectSet<TermPosition> set = query.execute();
-
-                               if (set.hasNext()) {
-                                       return set.next();
-                               } else if (create) {
-                                       TermPosition termPos = new 
TermPosition();
-                                       termPos.word = term.word;
-                                       termPos.pageId = page.id;
-                                       termPos.positions = new int[0];
-
-                                       db.store(termPos);
-                                       return termPos;
-                               } else {
-                                       return null;
-                               }
-                       }
-               }
-       }
 }

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to