View Javadoc

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  			// TODO How should we handle this?
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  			// TODO How should we handle this?
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  				// what can we do?
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  		//hits should contain only one documents id, otherwise,
92  		// it is a bug in the search.
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  			// can't think of much to do here
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 }