Java tutorial
/* * Copyright (C) 2006 Jordi Marqus Ferr * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this software; see the file DUROTY.txt. * * Author: Jordi Marqus Ferr * c/Mallorca 295 principal B 08037 Barcelona Spain * Phone: +34 625397324 */ package com.duroty.lucene.files.search; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Hashtable; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.WhitespaceAnalyzer; import org.apache.lucene.index.Term; import org.apache.lucene.queryParser.CharStream; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.queryParser.QueryParserTokenManager; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.RangeQuery; import com.duroty.application.mail.utils.AdvancedObj; import com.duroty.lucene.mail.LuceneMessageConstants; import com.duroty.utils.NumberUtils; /** * DOCUMENT ME! * * @author $author$ * @version $Revision$ */ public class AdvancedQueryParser extends QueryParser implements LuceneMessageConstants { /** * Creates a new AdvancedMultiQueryParser object. * * @param f DOCUMENT ME! * @param a DOCUMENT ME! */ public AdvancedQueryParser(String f, Analyzer a) { super(f, a); // TODO Auto-generated constructor stub } /** * Creates a new AdvancedMultiQueryParser object. * * @param stream DOCUMENT ME! */ public AdvancedQueryParser(CharStream stream) { super(stream); // TODO Auto-generated constructor stub } /** * Creates a new AdvancedMultiQueryParser object. * * @param tm DOCUMENT ME! */ public AdvancedQueryParser(QueryParserTokenManager tm) { super(tm); // TODO Auto-generated constructor stub } /** * String from = request.getParameter("from"); String to = request.getParameter("to"); String subject = request.getParameter("subject"); String label = request.getParameter("label"); String box = request.getParameter("box"); String hasWords = request.getParameter("hasWords"); String hasWordsInBody = request.getParameter("hasWordsInBody"); String hasWordsInAttachment = request.getParameter("hasWordsInAttachment"); String doesntHaveWords = request.getParameter("doesntHaveWords"); String doesntHaveWordsInBody = request.getParameter("doesntHaveWordsInBody"); String doesntHaveWordsInAttachment = request.getParameter("doesntHaveWordsInAttachment"); String hasAttachment = request.getParameter("hasAttachment"); String startDate = request.getParameter("startDate"); String endDate = request.getParameter("endDate"); * * @param queryFields DOCUMENT ME! * @param analyzer DOCUMENT ME! * * @return DOCUMENT ME! * * @throws ParseException DOCUMENT ME! */ public static Query parseMessages(AdvancedObj advancedObj, Analyzer analyzer) throws ParseException { if (advancedObj == null) { return null; } String petador = "AND"; if (!advancedObj.isOperator()) { petador = "OR"; } StringBuffer buffer = new StringBuffer(); String subject = advancedObj.getSubject(); if ((subject != null) && !subject.trim().equals("")) { QueryParser parser = new QueryParser(Field_subject, analyzer); parser.setDefaultOperator(Operator.AND); Query aux = parser.parse(subject); if (buffer.length() > 0) { buffer.append(" " + petador + " "); } buffer.append("(" + aux.toString() + ") "); } String hasWords = advancedObj.getHasWords(); if ((hasWords != null) && !hasWords.trim().equals("")) { QueryParser parser = new QueryParser(Field_attachments, analyzer); parser.setDefaultOperator(Operator.AND); Query aux = parser.parse(hasWords); if (buffer.length() > 0) { buffer.append(" " + petador + " "); } buffer.append("(" + aux.toString() + ") "); } String filetype = advancedObj.getContentType(); if ((filetype != null) && !filetype.trim().equals("")) { filetype = filetype.replaceAll("\\s+", " OR "); QueryParser parser = new QueryParser(Field_filetype, analyzer); parser.setDefaultOperator(Operator.AND); Query aux = parser.parse(filetype); if (buffer.length() > 0) { buffer.append(" " + petador + " "); } buffer.append("(" + aux.toString() + ") "); } Date startDate = null; Date endDate = null; int fixDateStr = 0; try { fixDateStr = Integer.parseInt(advancedObj.getFixDate()); } catch (NumberFormatException e1) { } if (fixDateStr > 0) { Calendar cal = new GregorianCalendar(); int year = cal.get(Calendar.YEAR); // 2002 int month = cal.get(Calendar.MONTH); // 0=Jan, 1=Feb, ... int day = cal.get(Calendar.DAY_OF_MONTH); // 1... //int hour = cal.get(Calendar.HOUR_OF_DAY); //int minute = cal.get(Calendar.MINUTE); //int second = cal.get(Calendar.SECOND); Calendar cal1 = null; switch (fixDateStr) { case 1: //AVUI cal1 = new GregorianCalendar(year, month, day, 0, 0, 0); startDate = new Date(cal1.getTimeInMillis()); endDate = new Date(); break; case 2: //des de ahir cal1 = new GregorianCalendar(year, month, day - 1, 0, 0, 0); startDate = new Date(cal1.getTimeInMillis()); endDate = new Date(); break; case 3: //la ltima setmana cal1 = new GregorianCalendar(year, month, day - 7, 0, 0, 0); startDate = new Date(cal1.getTimeInMillis()); endDate = new Date(); break; case 4: //l'ltim mes cal1 = new GregorianCalendar(year, month - 1, day, 0, 0, 0); startDate = new Date(cal1.getTimeInMillis()); endDate = new Date(); break; default: break; } } else { SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); String startDateStr = advancedObj.getStartDate(); if (startDateStr != null) { try { startDate = formatter.parse(startDateStr); } catch (Exception e) { startDate = null; } } String endDateStr = advancedObj.getEndDate(); if (endDateStr != null) { try { endDate = formatter.parse(endDateStr); } catch (Exception e) { endDate = null; } } } if ((startDate != null) && (endDate != null)) { Term tBeginDate = new Term(Field_lastDate, NumberUtils.pad(startDate.getTime())); Term tEndDate = new Term(Field_lastDate, NumberUtils.pad(endDate.getTime())); RangeQuery aux = new RangeQuery(tBeginDate, tEndDate, true); if (buffer.length() > 0) { buffer.append(" " + petador + " "); } buffer.append("(" + aux.toString() + ") "); } else if ((startDate != null) && (endDate == null)) { Term tBeginDate = new Term(Field_lastDate, NumberUtils.pad(startDate.getTime())); Date now = new Date(); Term tEndDate = new Term(Field_lastDate, NumberUtils.pad(now.getTime())); RangeQuery aux = new RangeQuery(tBeginDate, tEndDate, true); if (buffer.length() > 0) { buffer.append(" " + petador + " "); } buffer.append("(" + aux.toString() + ") "); } else if ((startDate == null) && (endDate != null)) { Term tBeginDate = new Term(Field_lastDate, "0"); Term tEndDate = new Term(Field_lastDate, NumberUtils.pad(endDate.getTime())); RangeQuery aux = new RangeQuery(tBeginDate, tEndDate, true); if (buffer.length() > 0) { buffer.append(" " + petador + " "); } buffer.append("(" + aux.toString() + ") "); } else { } if (buffer.length() > 0) { QueryParser parser = new QueryParser("", new WhitespaceAnalyzer()); Query query = parser.parse(buffer.toString()); return query; } else { return null; } } /** * DOCUMENT ME! * * @param queryFields DOCUMENT ME! * @param analyzer DOCUMENT ME! * * @return DOCUMENT ME! * * @throws ParseException DOCUMENT ME! */ public static Query parseFlags(Hashtable queryFields, Analyzer analyzer) throws ParseException { if ((queryFields == null) || (queryFields.size() == 0)) { return null; } BooleanQuery bQuery = new BooleanQuery(); Query simpleQuery = null; int control = 0; String label = (String) queryFields.get(Field_label); if ((label != null) && !label.trim().equals("")) { control++; QueryParser parser = new QueryParser(Field_label, analyzer); parser.setDefaultOperator(Operator.AND); Query aux = parser.parse(escape(label)); simpleQuery = aux; bQuery.add(aux, BooleanClause.Occur.MUST); } if (control > 0) { if (control == 1) { return simpleQuery; } else { return bQuery; } } else { return null; } } }