1 package org.marketchangers.prayer.lucene;
2
3 import java.io.IOException;
4 import java.util.Collection;
5 import java.util.Collections;
6 import java.util.Iterator;
7 import java.util.LinkedList;
8 import java.util.List;
9
10 import org.apache.lucene.document.Document;
11 import org.apache.lucene.index.IndexReader;
12 import org.apache.lucene.index.IndexWriter;
13 import org.apache.lucene.search.Hits;
14 import org.apache.lucene.search.Query;
15 import org.marketchangers.prayer.PrayerRequest;
16 import org.marketchangers.prayer.PrayerRequestQuery;
17 import org.marketchangers.prayer.PrayerRequestSearcher;
18
19 /***
20 * @author <a href="mailto:jniu@wc-group.com">Jianshuo Niu</a>
21 * @author <a href="mailto:mtodd@wc-group.com">Matthew Todd</a>
22 */
23 public class LucenePrayerRequestSearcher implements PrayerRequestSearcher {
24 private IndexProvider provider;
25
26 public LucenePrayerRequestSearcher(IndexProvider provider) {
27 this.provider = provider;
28 }
29
30 public synchronized void index(PrayerRequest request) {
31 Document document = provider.translateToDocument(request);
32
33 try {
34 IndexWriter writer = provider.getWriter();
35 writer.addDocument(document);
36 writer.close();
37 } catch (IOException e) {
38
39 e.printStackTrace();
40 }
41 }
42
43 public synchronized void index(Collection prayerRequests) {
44 Iterator requests = prayerRequests.iterator();
45
46 try {
47 IndexWriter writer = provider.getWriter();
48
49 while (requests.hasNext()) {
50 PrayerRequest request = (PrayerRequest) requests.next();
51 writer.addDocument(provider.translateToDocument(request));
52 }
53
54 writer.close();
55 } catch (IOException e) {
56
57 e.printStackTrace();
58 }
59 }
60
61 public List search(PrayerRequestQuery q) {
62 if (q.getRequestorUserIds().isEmpty()) {
63 return Collections.EMPTY_LIST;
64 }
65
66 Hits hits;
67
68 try {
69 hits = provider.getSearcher().search(provider.translateToQuery(q));
70 } catch (IOException ioe) {
71 return Collections.EMPTY_LIST;
72 }
73
74 List prayerRequestIds = new LinkedList();
75
76 for (int i = 0; i < hits.length(); i++) {
77 try {
78 prayerRequestIds.add(id(hits, i));
79 } catch (IOException ioe) {
80
81 }
82 }
83
84 return prayerRequestIds;
85 }
86
87 public void updateStatus(PrayerRequest request) {
88 Query query = provider.translateToQuery(request);
89 List prayerRequestIds = new LinkedList();
90
91
92
93 try {
94 Hits hits = provider.getSearcher().search(query);
95 for (int i = 0; i < hits.length(); i++) {
96 delete(hits.id(i));
97 }
98 } catch (IOException ioe) {
99
100 }
101 index(request);
102 }
103
104 private Integer id(Hits hits, int i) throws IOException {
105 return Integer.valueOf(hits.doc(i).get("id"));
106 }
107
108 public synchronized void delete(int docId) throws IOException {
109
110 IndexReader reader = provider.getReader();
111 if (reader != null) {
112 reader.delete(docId);
113 }
114 reader.close();
115 }
116 }