]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.db.indexing;\r
13 \r
14 import gnu.trove.map.hash.THashMap;\r
15 import gnu.trove.set.hash.TLongHashSet;\r
16 \r
17 import java.io.IOException;\r
18 import java.util.ArrayList;\r
19 import java.util.Collection;\r
20 import java.util.List;\r
21 import java.util.Map;\r
22 \r
23 import org.apache.lucene.document.Document;\r
24 import org.apache.lucene.index.CorruptIndexException;\r
25 import org.apache.lucene.index.IndexableField;\r
26 import org.apache.lucene.queryparser.classic.ParseException;\r
27 import org.apache.lucene.search.MatchAllDocsQuery;\r
28 import org.apache.lucene.search.Query;\r
29 import org.apache.lucene.search.ScoreDoc;\r
30 import org.apache.lucene.search.TopDocs;\r
31 import org.apache.lucene.store.Directory;\r
32 import org.eclipse.core.runtime.IProgressMonitor;\r
33 import org.simantics.db.RequestProcessor;\r
34 import org.simantics.db.Resource;\r
35 import org.simantics.db.Session;\r
36 import org.simantics.db.exception.DatabaseException;\r
37 import org.simantics.db.layer0.adapter.GenericRelation;\r
38 import org.simantics.utils.datastructures.Pair;\r
39 \r
40 /**\r
41  * @author Tuukka Lehtonen\r
42  * @author Antti Villberg\r
43  */\r
44 public class IndexedRelationsMemorySearcher extends IndexedRelationsSearcherBase {\r
45 \r
46     final IndexedRelationsSearcher backend;\r
47     final GenericRelation r;\r
48     \r
49     TLongHashSet changed = new TLongHashSet();\r
50     \r
51     IndexedRelationsMemorySearcher(RequestProcessor session, IndexedRelationsSearcher backend, Resource relation, Resource input, GenericRelation r) throws DatabaseException {\r
52         super(session, relation, input);\r
53         this.backend = backend;\r
54         this.r = r;\r
55         setReady();\r
56     }\r
57 \r
58     @Override\r
59     String getDescriptor() {\r
60         return "MEM: ";\r
61     }\r
62     \r
63     @Override\r
64     void insertIndex(IProgressMonitor monitor, GenericRelation r, int boundLength, Collection<Object[]> documentsData) throws CorruptIndexException, IOException, DatabaseException {\r
65         for(Object[] o : documentsData) {\r
66             Long resource = (Long)o[1];\r
67             changed.add(resource);\r
68         }\r
69         super.insertIndex(monitor, r, boundLength, documentsData);\r
70     }\r
71     \r
72     @Override\r
73     boolean replaceIndex(IProgressMonitor monitor, String key, Collection<Object> keyValues, GenericRelation r,\r
74             int boundLength, Collection<Object[]> documentsData) throws CorruptIndexException, IOException,\r
75             DatabaseException {\r
76         for(Object[] o : documentsData) {\r
77             Long resource = (Long)o[1];\r
78             changed.add(resource);\r
79         }\r
80         return super.replaceIndex(monitor, key, keyValues, r, boundLength, documentsData);\r
81     }\r
82     \r
83     @Override\r
84     void removeIndex(IProgressMonitor monitor, GenericRelation r, RequestProcessor processor, String key,\r
85             Collection<Object> keyValues) throws DatabaseException, CorruptIndexException, IOException {\r
86         for(Object o : keyValues) {\r
87             Resource resource= (Resource)o;\r
88             changed.add(resource.getResourceId());\r
89         }\r
90         super.removeIndex(monitor, r, processor, key, keyValues);\r
91     }\r
92     \r
93     public List<Object[]> allDocs(IProgressMonitor monitor, Session session) throws ParseException, IOException,\r
94     DatabaseException {\r
95         \r
96         Query query = new MatchAllDocsQuery(); \r
97 \r
98         startAccess(null, session, false);\r
99         \r
100         TopDocs td = searcher.search(query, Integer.MAX_VALUE);\r
101         \r
102         ScoreDoc[ ] scoreDocs = td.scoreDocs; \r
103         List<Object[]> result = new ArrayList<Object[]>(scoreDocs.length);\r
104 \r
105         final Map<String, String> classMap = new THashMap<String, String>();\r
106         for (Pair<String, String> field : r.getFields()) {\r
107             classMap.put(field.first, field.second);\r
108         }\r
109 \r
110         for(ScoreDoc scoreDoc:scoreDocs) {\r
111 \r
112             try {\r
113 \r
114                 Document doc = reader.document(scoreDoc.doc);\r
115                 List<IndexableField> fs = doc.getFields();\r
116                 Object[] o = new Object[fs.size()];\r
117                 int index = 0; \r
118                 for (IndexableField f : fs) {\r
119                     String clazz = classMap.get(f.name());\r
120                     if ("Long".equals(clazz)) {\r
121                         o[index++] = Long.parseLong(f.stringValue());\r
122                     } else {\r
123                         o[index++] = f.stringValue();\r
124                     }\r
125                 }\r
126                 result.add(o);\r
127             } catch (CorruptIndexException e) {\r
128                 throw new DatabaseException(e);\r
129             } catch (IOException e) {\r
130                 throw new DatabaseException(e);\r
131             }\r
132 \r
133         }\r
134 \r
135         changeState(monitor, session, State.READY);\r
136         \r
137 //        closeInternal();\r
138         \r
139         return result;\r
140 \r
141     }\r
142     \r
143     public void commit() {\r
144         try {\r
145             if(writer != null)\r
146                 writer.commit();\r
147         } catch (CorruptIndexException e) {\r
148             e.printStackTrace();\r
149         } catch (IOException e) {\r
150             e.printStackTrace();\r
151         }\r
152     }\r
153 \r
154 //    public static String cacheReport() {\r
155 //        StringBuilder sb = new StringBuilder();\r
156 //        sb.append("Directories: ").append(directories.size()).append("\n");\r
157 //        for (String key : directories.keySet()) {\r
158 //            RAMDirectory dir = directories.get(key);\r
159 //            if (dir != null) {\r
160 //                sb.append("\t").append(dir).append("\n");\r
161 //            }\r
162 //        }\r
163 //        sb.append("Searchers: ").append(searchers.size()).append("\n");\r
164 //        for (String key : searchers.keySet()) {\r
165 //            IndexedRelationsMemorySearcher s = searchers.get(key);\r
166 //            if (s != null) {\r
167 //                sb.append("\t").append(s.getClass()).append(": ").append(s.getIndexPath()).append("\n");\r
168 //            }\r
169 //        }\r
170 //        return sb.toString();\r
171 //    }\r
172 \r
173     @Override\r
174     Directory getDirectory(Session session) throws IOException {\r
175         MemoryIndexing mem = MemoryIndexing.getInstance(session);\r
176         String path = indexPath.getAbsolutePath();\r
177         return mem.getDirectory(path, Queries.getAnalyzer());\r
178     }\r
179     \r
180     @Override\r
181     Throwable bestEffortClear(IProgressMonitor monitor, Session session) {\r
182 \r
183         setProblem(null);\r
184         \r
185         MemoryIndexing mem = MemoryIndexing.getInstance(session);\r
186         changed.clear();\r
187         \r
188         String path = indexPath.getAbsolutePath();\r
189         mem.remove(path);\r
190         \r
191         return null;\r
192         \r
193     }\r
194     \r
195     @Override\r
196     protected boolean requireChangeInfoOnReplace() {\r
197         return false;\r
198     }\r
199     \r
200 }\r