-/*******************************************************************************\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 gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.TLongHashSet;
+
+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.queryparser.classic.ParseException;
+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;
+
+/**
+ * @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 ParseException, IOException,
+ DatabaseException {
+
+ 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) {
+
+ try {
+
+ 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);
+ } catch (CorruptIndexException e) {
+ throw new DatabaseException(e);
+ } catch (IOException e) {
+ throw new DatabaseException(e);
+ }
+
+ }
+
+ 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;
+ }
+
+}