1 41 package com.mvnforum.search.member; 42 43 import java.io.IOException ; 44 import java.sql.Timestamp ; 45 import java.util.ArrayList ; 46 import java.util.Collection ; 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 74 public class MemberSearchQuery 75 { 76 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 private String memberEmailKey = null; 84 private String memberNameKey = null; 85 86 private String memberLastNameKey = null; 87 private String memberFirstNameKey = null; 88 private String memberCountry = null; 90 91 private Timestamp from = null; 92 private Timestamp to = null; 93 94 private static Log log = LogFactory.getLog(MemberSearchQuery.class); 96 97 private int hitCount = 0; 98 private Collection searchResult = null; 99 100 public MemberSearchQuery() { 101 } 102 106 public void setMemberNameKey(String memberNameKey) { 107 this.memberNameKey = memberNameKey; 108 } 109 110 public void setMemberEmailKey(String memberEmailKey) { 111 this.memberEmailKey = memberEmailKey; 112 } 113 114 public void setFromDate(Timestamp from) { 115 this.from = from; 116 } 117 118 public void setToDate(Timestamp to) { 119 this.to = to; 120 } 121 122 public void setMemberLastNameKey(String lastNameKey) { 123 this.memberLastNameKey = lastNameKey; 124 } 125 126 public void setMemberFirstNameKey(String firstNameKey) { 127 this.memberFirstNameKey = firstNameKey; 128 } 129 130 public void setCountry(String country) { 131 this.memberCountry = country; 132 } 133 134 protected IndexSearcher getSearcher() throws IOException { 135 try { 136 IndexSearcher searcher = new IndexSearcher(MVNForumConfig.getSearchMemberIndexDir()); 137 return searcher; 138 } catch (IOException ex) { 139 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 ("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 , DatabaseException, ObjectNotFoundException { 148 BooleanQuery query = new BooleanQuery(); 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 IndexSearcher searcher = null; 190 try { 191 searcher = getSearcher(); 192 193 Hits memberHits = null; 195 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 ex) { 205 throw ex; 206 } finally { 207 try { 208 if (searcher != null) { 209 searcher.close(); 210 } 211 } catch (Exception ex) {} 212 } 213 } 214 215 public int getHitCount() { 216 return hitCount; 217 } 218 219 public Collection getMemberResult() { 220 return searchResult; 221 } 222 223 private Collection getMembers(Hits MemberHits, int offset, int rowsToReturn) 224 throws IOException , ObjectNotFoundException, DatabaseException { 225 226 if (offset < 0) throw new IllegalArgumentException ("The offset < 0 is not allowed."); 227 if (rowsToReturn <= 0) throw new IllegalArgumentException ("The rowsToReturn <= 0 is not allowed."); 228 229 ArrayList retValue = new ArrayList (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 fieldName, String 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
|