]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/IndexedRelationsMemorySearcher.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.indexing / src / org / simantics / db / indexing / IndexedRelationsMemorySearcher.java
diff --git a/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/IndexedRelationsMemorySearcher.java b/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/IndexedRelationsMemorySearcher.java
new file mode 100644 (file)
index 0000000..dfebb39
--- /dev/null
@@ -0,0 +1,200 @@
+/*******************************************************************************\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