--- /dev/null
+/*******************************************************************************\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