KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > mvnforum > search > member > MemberSearchQuery


1 /*
2  * $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/search/member/MemberSearchQuery.java,v 1.6 2006/04/14 17:05:27 minhnn Exp $
3  * $Author: minhnn $
4  * $Revision: 1.6 $
5  * $Date: 2006/04/14 17:05:27 $
6  *
7  * ====================================================================
8  *
9  * Copyright (C) 2002-2006 by MyVietnam.net
10  *
11  * All copyright notices regarding mvnForum MUST remain
12  * intact in the scripts and in the outputted HTML.
13  * The "powered by" text/logo with a link back to
14  * http://www.mvnForum.com and http://www.MyVietnam.net in
15  * the footer of the pages MUST remain visible when the pages
16  * are viewed on the internet or intranet.
17  *
18  * This program is free software; you can redistribute it and/or modify
19  * it under the terms of the GNU General Public License as published by
20  * the Free Software Foundation; either version 2 of the License, or
21  * any later version.
22  *
23  * This program is distributed in the hope that it will be useful,
24  * but WITHOUT ANY WARRANTY; without even the implied warranty of
25  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26  * GNU General Public License for more details.
27  *
28  * You should have received a copy of the GNU General Public License
29  * along with this program; if not, write to the Free Software
30  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31  *
32  * Support can be obtained from support forums at:
33  * http://www.mvnForum.com/mvnforum/index
34  *
35  * Correspondence and Marketing Questions can be sent to:
36  * info at MyVietnam net
37  *
38  * @author: Minh Nguyen
39  * @author: Dejan Krsmanovic dejan_krsmanovic@yahoo.com
40  */

41 package com.mvnforum.search.member;
42
43 import java.io.IOException JavaDoc;
44 import java.sql.Timestamp JavaDoc;
45 import java.util.ArrayList JavaDoc;
46 import java.util.Collection JavaDoc;
47
48 import com.mvnforum.MVNForumConfig;
49 import com.mvnforum.db.DAOFactory;
50 import com.mvnforum.db.MemberBean;
51 import net.myvietnam.mvncore.exception.DatabaseException;
52 import net.myvietnam.mvncore.exception.ObjectNotFoundException;
53 import org.apache.commons.logging.Log;
54 import org.apache.commons.logging.LogFactory;
55 import org.apache.lucene.analysis.Analyzer;
56 import org.apache.lucene.document.Document;
57 import org.apache.lucene.queryParser.ParseException;
58 import org.apache.lucene.queryParser.QueryParser;
59 import org.apache.lucene.search.*;
60
61 /**
62  * This class is used for specifying query that should be searched for. Query
63  * can contain keywords and further it can be filtered by specifying member
64  * name of the Member, address as well as date interval for searching.
65  *
66  * searchString contains one or more keywords. Each keyword can use wildcards.
67  * ? for single character and * for multiple characters.
68  * For specifying boolean operators AND and OR operators can be used.....
69  *
70  * For all available options consult Lucene documentation http://jakarta.apache.org/lucene
71  *
72  * @author Dejan Krsmanovic dejan_krsmanovic@yahoo.com
73  */

74 public class MemberSearchQuery
75 {
76     // search object constants
77
public static final int SEARCH_ANY_DATE = 0;
78
79     public static final int SEARCH_NEWER = 1;
80     public static final int SEARCH_OLDER = 2;
81
82     // search object properties
83
private String JavaDoc memberEmailKey = null;
84     private String JavaDoc memberNameKey = null;
85
86     private String JavaDoc memberLastNameKey = null;
87     private String JavaDoc memberFirstNameKey = null;
88     //private String memberGender = null;
89
private String JavaDoc memberCountry = null;
90
91     private Timestamp JavaDoc from = null;
92     private Timestamp JavaDoc to = null;
93
94     // search engine properties
95
private static Log log = LogFactory.getLog(MemberSearchQuery.class);
96
97     private int hitCount = 0;
98     private Collection JavaDoc searchResult = null;
99
100     public MemberSearchQuery() {
101     }
102     /**
103      * Set string that should be searched for.
104      * @param memberNameKey
105      */

106     public void setMemberNameKey(String JavaDoc memberNameKey) {
107         this.memberNameKey = memberNameKey;
108     }
109
110     public void setMemberEmailKey(String JavaDoc memberEmailKey) {
111         this.memberEmailKey = memberEmailKey;
112     }
113
114     public void setFromDate(Timestamp JavaDoc from) {
115         this.from = from;
116     }
117
118     public void setToDate(Timestamp JavaDoc to) {
119         this.to = to;
120     }
121
122     public void setMemberLastNameKey(String JavaDoc lastNameKey) {
123         this.memberLastNameKey = lastNameKey;
124     }
125
126     public void setMemberFirstNameKey(String JavaDoc firstNameKey) {
127         this.memberFirstNameKey = firstNameKey;
128     }
129
130     public void setCountry(String JavaDoc country) {
131         this.memberCountry = country;
132     }
133
134     protected IndexSearcher getSearcher() throws IOException JavaDoc {
135         try {
136             IndexSearcher searcher = new IndexSearcher(MVNForumConfig.getSearchMemberIndexDir());
137             return searcher;
138         } catch (IOException JavaDoc ex) {
139             // we throw new IOException because the original exception
140
// contain sensitive directory information
141
log.error("Cannot access the lucene search index for query. Please check if you have configed mvnForumHome properly. You can also go to Admin Zone to rebuild the Lucene index files.", ex);
142             throw new IOException JavaDoc("Cannot access the lucene search index. Please report this error to web site Administrator (check mvnForumHome or rebuild Lucene index).");
143         }
144     }
145
146     public void searchDocuments(int offset, int rowsToReturn)
147         throws IOException JavaDoc, DatabaseException, ObjectNotFoundException {
148         //Build the query
149
//Analyzer analyzer = MemberIndexer.getAnalyzer();
150
BooleanQuery query = new BooleanQuery();//query.
151
try {
152             Query memberNameQuery = getMemberNameQuery();
153             if (memberNameQuery != null) {
154                 query.add(memberNameQuery, true, false);
155                 log.debug("MemberNameQuery = " + memberNameQuery);
156             }
157             Query memberEmailQuery = getMemberEmailQuery();
158             if (memberEmailQuery != null) {
159                 query.add(memberEmailQuery, true, false);
160             }
161             Query memberLastNameQuery = getMemberLastNameQuery();
162             if (memberLastNameQuery != null) {
163                 query.add(memberLastNameQuery, true, false);
164             }
165             Query memberFirstNameQuery = getMemberFirstNameQuery();
166             if (memberFirstNameQuery != null) {
167                 query.add(memberFirstNameQuery, true, false);
168             }
169             Query memberCountryQuery = getMemberCountryQuery();
170             if (memberCountryQuery != null) {
171                 query.add(memberCountryQuery, true, false);
172             }
173         } catch (ParseException pe) {
174             log.error("Cannot parse the search query", pe);
175         }
176         log.debug("[OK ] booleanQuery = " + query);
177
178         DateFilter dateFilter = null;
179
180         if (from != null && to != null) {
181             dateFilter = new DateFilter(MemberIndexer.FIELD_CREATION_DATE, from, to);
182         } else if (from != null) {
183             dateFilter = DateFilter.After(MemberIndexer.FIELD_CREATION_DATE, from);
184         } else if (to != null) {
185             dateFilter = DateFilter.Before(MemberIndexer.FIELD_CREATION_DATE, to);
186         }
187
188         //Now search the documents
189
IndexSearcher searcher = null;
190         try {
191             searcher = getSearcher();
192
193             //If dateFilter set then use it
194
Hits memberHits = null;
195             //dateFilter = null;
196
if (dateFilter != null) {
197                 memberHits = searcher.search(query, dateFilter);
198             } else {
199                 memberHits = searcher.search(query);
200             }
201             hitCount = memberHits.length();
202             log.debug("[ HIT COUNT ]" + hitCount);
203             searchResult = getMembers(memberHits, offset, rowsToReturn);
204         } catch (IOException JavaDoc ex) {
205             throw ex;
206         } finally {
207             try {
208                 if (searcher != null) {
209                     searcher.close();
210                 }
211             } catch (Exception JavaDoc ex) {}
212         }
213     }
214
215     public int getHitCount() {
216         return hitCount;
217     }
218
219     public Collection JavaDoc getMemberResult() {
220         return searchResult;
221     }
222
223     private Collection JavaDoc getMembers(Hits MemberHits, int offset, int rowsToReturn)
224         throws IOException JavaDoc, ObjectNotFoundException, DatabaseException {
225
226         if (offset < 0) throw new IllegalArgumentException JavaDoc("The offset < 0 is not allowed.");
227         if (rowsToReturn <= 0) throw new IllegalArgumentException JavaDoc("The rowsToReturn <= 0 is not allowed.");
228
229         //int hitCount = getHitCount();
230
ArrayList JavaDoc retValue = new ArrayList JavaDoc(hitCount);
231
232         for (int i = offset; (i < offset + rowsToReturn) && (i < hitCount); i++) {
233             Document memberDocument = MemberHits.doc(i);
234             int memberID = Integer.parseInt(memberDocument.get(MemberIndexer.FIELD_MEMBER_ID));
235             MemberBean MemberBean = DAOFactory.getMemberDAO().getMember_forPublic(memberID);
236             retValue.add(MemberBean);
237         }
238         return retValue;
239     }
240
241     private Query getMemberNameQuery() throws ParseException {
242         if (memberNameKey == null) {
243             return null;
244         }
245         Analyzer analyzer = MemberIndexer.getAnalyzer();
246         Query memberNameQuery = QueryParser.parse(memberNameKey,
247                                                    MemberIndexer.FIELD_MEMBER_NAME,
248                                                    analyzer);
249         return memberNameQuery;
250     }
251
252     private Query getMemberEmailQuery() throws ParseException {
253         if (memberEmailKey == null) {
254             return null;
255         }
256         Analyzer analyzer = MemberIndexer.getAnalyzer();
257         Query memberEmailQuery = QueryParser.parse(memberEmailKey,
258                                                    MemberIndexer.FIELD_MEMBER_EMAIL,
259                                                    analyzer);
260         return memberEmailQuery;
261     }
262
263     private Query getMemberQuery(String JavaDoc fieldName, String JavaDoc keyQuery) throws ParseException {
264         if (keyQuery == null ) {
265             return null;
266         }
267         Analyzer analyzer = MemberIndexer.getAnalyzer();
268         Query memberQuery = QueryParser.parse(keyQuery, fieldName, analyzer);
269         return memberQuery;
270     }
271
272     private Query getMemberLastNameQuery() throws ParseException {
273         return getMemberQuery (MemberIndexer.FIELD_MEMBER_LASTNAME,
274                                memberLastNameKey);
275     }
276     private Query getMemberFirstNameQuery() throws ParseException {
277         return getMemberQuery (MemberIndexer.FIELD_MEMBER_FIRSTNAME,
278                                memberFirstNameKey);
279     }
280
281     private Query getMemberCountryQuery() throws ParseException {
282         return getMemberQuery (MemberIndexer.FIELD_MEMBER_COUNTRY,
283                                memberCountry);
284     }
285 }
286
Popular Tags