1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.modeshape.search.lucene;
25
26 import net.jcip.annotations.NotThreadSafe;
27 import org.apache.lucene.queryParser.ParseException;
28 import org.apache.lucene.search.Query;
29 import org.modeshape.common.util.Logger;
30 import org.modeshape.graph.ExecutionContext;
31 import org.modeshape.graph.Location;
32 import org.modeshape.graph.observe.Observer;
33 import org.modeshape.graph.property.DateTime;
34 import org.modeshape.graph.property.Path;
35 import org.modeshape.graph.query.QueryResults.Columns;
36 import org.modeshape.graph.query.QueryResults.Statistics;
37 import org.modeshape.graph.query.process.FullTextSearchResultColumns;
38 import org.modeshape.graph.request.CloneBranchRequest;
39 import org.modeshape.graph.request.CloneWorkspaceRequest;
40 import org.modeshape.graph.request.CopyBranchRequest;
41 import org.modeshape.graph.request.CreateNodeRequest;
42 import org.modeshape.graph.request.CreateWorkspaceRequest;
43 import org.modeshape.graph.request.DeleteBranchRequest;
44 import org.modeshape.graph.request.DestroyWorkspaceRequest;
45 import org.modeshape.graph.request.FullTextSearchRequest;
46 import org.modeshape.graph.request.GetWorkspacesRequest;
47 import org.modeshape.graph.request.LockBranchRequest;
48 import org.modeshape.graph.request.MoveBranchRequest;
49 import org.modeshape.graph.request.ReadAllChildrenRequest;
50 import org.modeshape.graph.request.ReadAllPropertiesRequest;
51 import org.modeshape.graph.request.UnlockBranchRequest;
52 import org.modeshape.graph.request.UpdatePropertiesRequest;
53 import org.modeshape.graph.request.VerifyWorkspaceRequest;
54 import org.modeshape.graph.search.AbstractSearchEngine.Workspaces;
55 import org.modeshape.graph.search.SearchEngineProcessor;
56 import org.modeshape.search.lucene.AbstractLuceneSearchEngine.AbstractLuceneProcessor;
57
58 import java.io.FileNotFoundException;
59 import java.io.IOException;
60 import java.util.ArrayList;
61 import java.util.HashSet;
62 import java.util.List;
63 import java.util.Set;
64
65
66
67
68 @NotThreadSafe
69 public class LuceneSearchProcessor extends AbstractLuceneProcessor<LuceneSearchWorkspace, LuceneSearchSession> {
70
71 protected static final Columns FULL_TEXT_RESULT_COLUMNS = new FullTextSearchResultColumns();
72 private static final Logger logger = Logger.getLogger(LuceneSearchProcessor.class);
73
74 protected LuceneSearchProcessor( String sourceName,
75 ExecutionContext context,
76 Workspaces<LuceneSearchWorkspace> workspaces,
77 Observer observer,
78 DateTime now,
79 boolean readOnly ) {
80 super(sourceName, context, workspaces, observer, now, readOnly);
81 }
82
83
84
85
86
87
88 @Override
89 protected LuceneSearchSession createSessionFor( LuceneSearchWorkspace workspace ) {
90 return new LuceneSearchSession(workspace, this);
91 }
92
93
94
95
96
97
98 @Override
99 protected String fullTextFieldName( String propertyName ) {
100 return propertyName == null ? LuceneSearchWorkspace.ContentIndex.FULL_TEXT : LuceneSearchWorkspace.FULL_TEXT_PREFIX
101 + propertyName;
102 }
103
104
105
106
107
108
109 @Override
110 public void process( FullTextSearchRequest request ) {
111 LuceneSearchSession session = getSessionFor(request, request.workspace(), false);
112 if (session == null) return;
113 try {
114 List<Object[]> results = new ArrayList<Object[]>();
115 Statistics statistics = session.search(request.expression(), results, request.maxResults(), request.offset());
116 request.setResults(FULL_TEXT_RESULT_COLUMNS, results, statistics);
117 } catch (ParseException e) {
118 request.setError(e);
119 } catch (IOException e) {
120 request.setError(e);
121 }
122 }
123
124
125
126
127
128
129 @Override
130 public void process( VerifyWorkspaceRequest request ) {
131 LuceneSearchSession session = getSessionFor(request, request.workspaceName(), true);
132 if (session == null) return;
133 request.setActualWorkspaceName(session.getWorkspaceName());
134 try {
135 request.setActualRootLocation(session.getLocationForRoot());
136 } catch (IOException e) {
137 request.setError(e);
138 }
139 }
140
141
142
143
144
145
146 @Override
147 public void process( GetWorkspacesRequest request ) {
148 Set<String> names = new HashSet<String>();
149 for (LuceneSearchWorkspace workspace : workspaces.getWorkspaces()) {
150 names.add(workspace.getWorkspaceName());
151 }
152 request.setAvailableWorkspaceNames(names);
153 }
154
155
156
157
158
159
160 @Override
161 public void process( CreateNodeRequest request ) {
162
163 LuceneSearchSession session = getSessionFor(request, request.inWorkspace(), true);
164 if (session == null) return;
165
166
167
168 Location location = request.getActualLocationOfNode();
169 assert location != null;
170
171 try {
172 session.setOrReplaceProperties(location, request.properties());
173 session.recordChange();
174 } catch (IOException e) {
175 request.setError(e);
176 }
177 }
178
179
180
181
182
183
184 @Override
185 public void process( UpdatePropertiesRequest request ) {
186
187 LuceneSearchSession session = getSessionFor(request, request.inWorkspace(), true);
188 if (session == null) return;
189
190 Location location = request.getActualLocationOfNode();
191 assert location != null;
192
193 try {
194
195
196 session.setOrReplaceProperties(location, request.properties().values());
197 session.recordChange();
198 } catch (IOException e) {
199 request.setError(e);
200 }
201 }
202
203
204
205
206
207
208 @Override
209 public void process( DeleteBranchRequest request ) {
210 LuceneSearchSession session = getSessionFor(request, request.inWorkspace());
211 if (session == null) return;
212
213 Path path = request.at().getPath();
214 assert !readOnly;
215 try {
216
217 if (logger.isTraceEnabled()) {
218 logger.trace("index for \"{0}\" workspace: DEL '{1}' branch", request.inWorkspace(), stringFactory.create(path));
219 }
220 Query query = session.findAllNodesAtOrBelow(path);
221
222 session.getContentWriter().deleteDocuments(query);
223 session.recordChanges(100);
224 } catch (FileNotFoundException e) {
225
226 } catch (IOException e) {
227 request.setError(e);
228 }
229 }
230
231
232
233
234
235
236 @Override
237 public void process( DestroyWorkspaceRequest request ) {
238 LuceneSearchWorkspace workspace = getWorkspace(request, request.workspaceName(), false);
239 if (workspace == null) return;
240 try {
241 LuceneSearchSession session = getSessionFor(request, workspace.getWorkspaceName());
242 request.setActualRootLocation(session.getLocationForRoot());
243 workspace.destroy(getExecutionContext());
244 session.recordChanges(LuceneSearchWorkspace.CHANGES_BEFORE_OPTIMIZATION + 100);
245 } catch (IOException e) {
246 request.setError(e);
247 }
248 }
249
250
251
252
253
254
255 @Override
256 public void process( LockBranchRequest request ) {
257 request.setActualLocation(request.at());
258 }
259
260
261
262
263
264
265 @Override
266 public void process( UnlockBranchRequest request ) {
267 request.setActualLocation(request.at());
268 }
269
270
271
272
273
274
275 @Override
276 public void process( CloneBranchRequest request ) {
277 super.processUnknownRequest(request);
278 }
279
280
281
282
283
284
285 @Override
286 public void process( CloneWorkspaceRequest request ) {
287 super.processUnknownRequest(request);
288 }
289
290
291
292
293
294
295 @Override
296 public void process( CopyBranchRequest request ) {
297 super.processUnknownRequest(request);
298 }
299
300
301
302
303
304
305 @Override
306 public void process( CreateWorkspaceRequest request ) {
307 super.processUnknownRequest(request);
308 }
309
310
311
312
313
314
315 @Override
316 public void process( MoveBranchRequest request ) {
317 super.processUnknownRequest(request);
318 }
319
320
321
322
323
324
325 @Override
326 public void process( ReadAllChildrenRequest request ) {
327 super.processUnknownRequest(request);
328 }
329
330
331
332
333
334
335 @Override
336 public void process( ReadAllPropertiesRequest request ) {
337 super.processUnknownRequest(request);
338 }
339 }