]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/IndexedRelationsMemorySearcher.java
Improve startup time for fresh or rollback'd session in index writing
[simantics/platform.git] / bundles / org.simantics.db.indexing / src / org / simantics / db / indexing / IndexedRelationsMemorySearcher.java
index dfebb39341de150dd7c9a5d65d682a856ce7f323..d1282c766f968db9cb6539071666659f8c877042 100644 (file)
-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *     VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.db.indexing;\r
-\r
-import gnu.trove.map.hash.THashMap;\r
-import gnu.trove.set.hash.TLongHashSet;\r
-\r
-import java.io.IOException;\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.apache.lucene.document.Document;\r
-import org.apache.lucene.index.CorruptIndexException;\r
-import org.apache.lucene.index.IndexableField;\r
-import org.apache.lucene.queryparser.classic.ParseException;\r
-import org.apache.lucene.search.MatchAllDocsQuery;\r
-import org.apache.lucene.search.Query;\r
-import org.apache.lucene.search.ScoreDoc;\r
-import org.apache.lucene.search.TopDocs;\r
-import org.apache.lucene.store.Directory;\r
-import org.eclipse.core.runtime.IProgressMonitor;\r
-import org.simantics.db.RequestProcessor;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.layer0.adapter.GenericRelation;\r
-import org.simantics.utils.datastructures.Pair;\r
-\r
-/**\r
- * @author Tuukka Lehtonen\r
- * @author Antti Villberg\r
- */\r
-public class IndexedRelationsMemorySearcher extends IndexedRelationsSearcherBase {\r
-\r
-    final IndexedRelationsSearcher backend;\r
-    final GenericRelation r;\r
-    \r
-    TLongHashSet changed = new TLongHashSet();\r
-    \r
-    IndexedRelationsMemorySearcher(RequestProcessor session, IndexedRelationsSearcher backend, Resource relation, Resource input, GenericRelation r) throws DatabaseException {\r
-        super(session, relation, input);\r
-        this.backend = backend;\r
-        this.r = r;\r
-        setReady();\r
-    }\r
-\r
-    @Override\r
-    String getDescriptor() {\r
-        return "MEM: ";\r
-    }\r
-    \r
-    @Override\r
-    void insertIndex(IProgressMonitor monitor, GenericRelation r, int boundLength, Collection<Object[]> documentsData) throws CorruptIndexException, IOException, DatabaseException {\r
-        for(Object[] o : documentsData) {\r
-            Long resource = (Long)o[1];\r
-            changed.add(resource);\r
-        }\r
-        super.insertIndex(monitor, r, boundLength, documentsData);\r
-    }\r
-    \r
-    @Override\r
-    boolean replaceIndex(IProgressMonitor monitor, String key, Collection<Object> keyValues, GenericRelation r,\r
-            int boundLength, Collection<Object[]> documentsData) throws CorruptIndexException, IOException,\r
-            DatabaseException {\r
-        for(Object[] o : documentsData) {\r
-            Long resource = (Long)o[1];\r
-            changed.add(resource);\r
-        }\r
-        return super.replaceIndex(monitor, key, keyValues, r, boundLength, documentsData);\r
-    }\r
-    \r
-    @Override\r
-    void removeIndex(IProgressMonitor monitor, GenericRelation r, RequestProcessor processor, String key,\r
-            Collection<Object> keyValues) throws DatabaseException, CorruptIndexException, IOException {\r
-        for(Object o : keyValues) {\r
-            Resource resource= (Resource)o;\r
-            changed.add(resource.getResourceId());\r
-        }\r
-        super.removeIndex(monitor, r, processor, key, keyValues);\r
-    }\r
-    \r
-    public List<Object[]> allDocs(IProgressMonitor monitor, Session session) throws ParseException, IOException,\r
-    DatabaseException {\r
-        \r
-        Query query = new MatchAllDocsQuery(); \r
-\r
-        startAccess(null, session, false);\r
-        \r
-        TopDocs td = searcher.search(query, Integer.MAX_VALUE);\r
-        \r
-        ScoreDoc[ ] scoreDocs = td.scoreDocs; \r
-        List<Object[]> result = new ArrayList<Object[]>(scoreDocs.length);\r
-\r
-        final Map<String, String> classMap = new THashMap<String, String>();\r
-        for (Pair<String, String> field : r.getFields()) {\r
-            classMap.put(field.first, field.second);\r
-        }\r
-\r
-        for(ScoreDoc scoreDoc:scoreDocs) {\r
-\r
-            try {\r
-\r
-                Document doc = reader.document(scoreDoc.doc);\r
-                List<IndexableField> fs = doc.getFields();\r
-                Object[] o = new Object[fs.size()];\r
-                int index = 0; \r
-                for (IndexableField f : fs) {\r
-                    String clazz = classMap.get(f.name());\r
-                    if ("Long".equals(clazz)) {\r
-                        o[index++] = Long.parseLong(f.stringValue());\r
-                    } else {\r
-                        o[index++] = f.stringValue();\r
-                    }\r
-                }\r
-                result.add(o);\r
-            } catch (CorruptIndexException e) {\r
-                throw new DatabaseException(e);\r
-            } catch (IOException e) {\r
-                throw new DatabaseException(e);\r
-            }\r
-\r
-        }\r
-\r
-        changeState(monitor, session, State.READY);\r
-        \r
-//        closeInternal();\r
-        \r
-        return result;\r
-\r
-    }\r
-    \r
-    public void commit() {\r
-        try {\r
-            if(writer != null)\r
-                writer.commit();\r
-        } catch (CorruptIndexException e) {\r
-            e.printStackTrace();\r
-        } catch (IOException e) {\r
-            e.printStackTrace();\r
-        }\r
-    }\r
-\r
-//    public static String cacheReport() {\r
-//        StringBuilder sb = new StringBuilder();\r
-//        sb.append("Directories: ").append(directories.size()).append("\n");\r
-//        for (String key : directories.keySet()) {\r
-//            RAMDirectory dir = directories.get(key);\r
-//            if (dir != null) {\r
-//                sb.append("\t").append(dir).append("\n");\r
-//            }\r
-//        }\r
-//        sb.append("Searchers: ").append(searchers.size()).append("\n");\r
-//        for (String key : searchers.keySet()) {\r
-//            IndexedRelationsMemorySearcher s = searchers.get(key);\r
-//            if (s != null) {\r
-//                sb.append("\t").append(s.getClass()).append(": ").append(s.getIndexPath()).append("\n");\r
-//            }\r
-//        }\r
-//        return sb.toString();\r
-//    }\r
-\r
-    @Override\r
-    Directory getDirectory(Session session) throws IOException {\r
-       MemoryIndexing mem = MemoryIndexing.getInstance(session);\r
-        String path = indexPath.getAbsolutePath();\r
-        return mem.getDirectory(path, Queries.getAnalyzer());\r
-    }\r
-    \r
-    @Override\r
-    Throwable bestEffortClear(IProgressMonitor monitor, Session session) {\r
-\r
-       setProblem(null);\r
-       \r
-       MemoryIndexing mem = MemoryIndexing.getInstance(session);\r
-        changed.clear();\r
-        \r
-        String path = indexPath.getAbsolutePath();\r
-        mem.remove(path);\r
-        \r
-        return null;\r
-        \r
-    }\r
-    \r
-    @Override\r
-    protected boolean requireChangeInfoOnReplace() {\r
-       return false;\r
-    }\r
-    \r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.db.indexing;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.index.CorruptIndexException;
+import org.apache.lucene.index.IndexableField;
+import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.ScoreDoc;
+import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.store.Directory;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.simantics.db.RequestProcessor;
+import org.simantics.db.Resource;
+import org.simantics.db.Session;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.adapter.GenericRelation;
+import org.simantics.utils.datastructures.Pair;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.TLongHashSet;
+
+/**
+ * @author Tuukka Lehtonen
+ * @author Antti Villberg
+ */
+public class IndexedRelationsMemorySearcher extends IndexedRelationsSearcherBase {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(IndexedRelationsMemorySearcher.class);
+    
+    final IndexedRelationsSearcher backend;
+    final GenericRelation r;
+    
+    TLongHashSet changed = new TLongHashSet();
+    
+    IndexedRelationsMemorySearcher(RequestProcessor session, IndexedRelationsSearcher backend, Resource relation, Resource input, GenericRelation r) throws DatabaseException {
+        super(session, relation, input);
+        this.backend = backend;
+        this.r = r;
+        setReady();
+    }
+
+    @Override
+    String getDescriptor() {
+        return "MEM: ";
+    }
+    
+    @Override
+    void insertIndex(IProgressMonitor monitor, GenericRelation r, int boundLength, Collection<Object[]> documentsData) throws CorruptIndexException, IOException, DatabaseException {
+        for(Object[] o : documentsData) {
+            Long resource = (Long)o[1];
+            changed.add(resource);
+        }
+        super.insertIndex(monitor, r, boundLength, documentsData);
+    }
+    
+    @Override
+    boolean replaceIndex(IProgressMonitor monitor, String key, Collection<Object> keyValues, GenericRelation r,
+            int boundLength, Collection<Object[]> documentsData) throws CorruptIndexException, IOException,
+            DatabaseException {
+        for(Object[] o : documentsData) {
+            Long resource = (Long)o[1];
+            changed.add(resource);
+        }
+        return super.replaceIndex(monitor, key, keyValues, r, boundLength, documentsData);
+    }
+    
+    @Override
+    void removeIndex(IProgressMonitor monitor, GenericRelation r, RequestProcessor processor, String key,
+            Collection<Object> keyValues) throws DatabaseException, CorruptIndexException, IOException {
+        for(Object o : keyValues) {
+            Resource resource= (Resource)o;
+            changed.add(resource.getResourceId());
+        }
+        super.removeIndex(monitor, r, processor, key, keyValues);
+    }
+    
+    public List<Object[]> allDocs(IProgressMonitor monitor, Session session) throws IOException {
+        
+        Query query = new MatchAllDocsQuery(); 
+
+        startAccess(null, session, false);
+        
+        TopDocs td = searcher.search(query, Integer.MAX_VALUE);
+        
+        ScoreDoc[ ] scoreDocs = td.scoreDocs; 
+        List<Object[]> result = new ArrayList<Object[]>(scoreDocs.length);
+
+        final Map<String, String> classMap = new THashMap<String, String>();
+        for (Pair<String, String> field : r.getFields()) {
+            classMap.put(field.first, field.second);
+        }
+
+        for(ScoreDoc scoreDoc:scoreDocs) {
+            Document doc = reader.document(scoreDoc.doc);
+            List<IndexableField> fs = doc.getFields();
+            Object[] o = new Object[fs.size()];
+            int index = 0; 
+            for (IndexableField f : fs) {
+                String clazz = classMap.get(f.name());
+                if ("Long".equals(clazz)) {
+                    o[index++] = Long.parseLong(f.stringValue());
+                } else {
+                    o[index++] = f.stringValue();
+                }
+            }
+            result.add(o);
+        }
+
+        changeState(monitor, session, State.READY);
+        
+//        closeInternal();
+        
+        return result;
+
+    }
+    
+    public void commit() {
+        try {
+            if(writer != null)
+                writer.commit();
+        } catch (CorruptIndexException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+//    public static String cacheReport() {
+//        StringBuilder sb = new StringBuilder();
+//        sb.append("Directories: ").append(directories.size()).append("\n");
+//        for (String key : directories.keySet()) {
+//            RAMDirectory dir = directories.get(key);
+//            if (dir != null) {
+//                sb.append("\t").append(dir).append("\n");
+//            }
+//        }
+//        sb.append("Searchers: ").append(searchers.size()).append("\n");
+//        for (String key : searchers.keySet()) {
+//            IndexedRelationsMemorySearcher s = searchers.get(key);
+//            if (s != null) {
+//                sb.append("\t").append(s.getClass()).append(": ").append(s.getIndexPath()).append("\n");
+//            }
+//        }
+//        return sb.toString();
+//    }
+
+    @Override
+    Directory getDirectory(Session session) throws IOException {
+       MemoryIndexing mem = MemoryIndexing.getInstance(session);
+        String path = indexPath.toAbsolutePath().toString();
+        return mem.getDirectory(path, Queries.getAnalyzer());
+    }
+    
+    @Override
+    Throwable bestEffortClear(IProgressMonitor monitor, Session session) {
+       MemoryIndexing mem = MemoryIndexing.getInstance(session);
+        changed.clear();
+        
+        String path = indexPath.toAbsolutePath().toString();
+        mem.remove(path);
+        
+        return null;
+        
+    }
+    
+    @Override
+    protected boolean requireChangeInfoOnReplace() {
+       return false;
+    }
+
+    @Override
+    protected Logger getLogger() {
+        return LOGGER;
+    }
+    
+}