001: /*
002: * Created on Jul 19, 2006
003: */
004: package com.openedit.modules.search;
005:
006: import java.util.Date;
007: import java.util.Iterator;
008: import java.util.List;
009:
010: import org.apache.lucene.document.DateTools;
011: import org.apache.lucene.document.DateTools.Resolution;
012:
013: import com.openedit.hittracker.SearchQuery;
014: import com.openedit.hittracker.Term;
015:
016: public class LuceneSearchQuery extends SearchQuery {
017: public void addAfter(String inFieldId, Date inDate,
018: String inFriendlyFieldName) {
019: String date = DateTools.dateToString(inDate, Resolution.DAY);
020: //fieldDateFilter = RangeFilter.More(inFieldId, date); //more than or equal
021: Term term = new Term() {
022: public String toQuery() {
023: String fin = getId() + ":[" + getValue()
024: + " TO 99999999]";
025: return fin;
026: }
027: };
028: term.setId(inFieldId);
029: term.setValue(date);
030: term.setFriendly(inFriendlyFieldName);
031: getTerms().add(term);
032: }
033:
034: public void addBetween(String inFieldId, Date inLowDate,
035: Date inHighDate, String inFriendlyFieldName) {
036:
037: String lowDate = DateTools.dateToString(inLowDate,
038: Resolution.DAY);
039: String highDate = DateTools.dateToString(inHighDate,
040: Resolution.DAY);
041:
042: //fieldDateFilter = RangeFilter.More(inFieldId, date); //more than or equal
043: Term term = new Term() {
044: public String toQuery() {
045: String fin = getId() + ":[" + getParameter("lowDate")
046: + " TO " + getParameter("highDate") + "]";
047: return fin;
048: }
049: };
050: term.setId(inFieldId);
051: term.addParameter("lowDate", lowDate);
052: term.addParameter("highDate", highDate);
053:
054: term.setFriendly(inFriendlyFieldName);
055: getTerms().add(term);
056: }
057:
058: public void addBefore(String inFieldId, Date inDate,
059: String inFriendlyFieldName) {
060: String date = DateTools.dateToString(inDate, Resolution.DAY);
061:
062: Term term = new Term() {
063: public String toQuery() {
064: String fin = getId() + ":[00000000 TO " + getValue()
065: + "]";
066: return fin;
067: }
068: };
069: term.setId(inFieldId);
070: term.setValue(date);
071: term.setFriendly(inFriendlyFieldName);
072: getTerms().add(term);
073: }
074:
075: // public void addAnd(String inString)
076: // {
077: // if (out.length() > 0)
078: // {
079: // out.append("AND ");
080: // }
081: // out.append(inString);
082: // out.append(" ");
083: // }
084:
085: public void addOrsGroup(String inField, String inValue,
086: String inFriendlyFieldName) {
087: Term term = new Term() {
088: public String toQuery() {
089: StringBuffer orString = new StringBuffer();
090: String[] orwords = getValue().split("\\s");
091: if (orwords.length > 0) {
092: orString.append("(");
093: for (int i = 0; i < orwords.length - 1; i++) {
094: orString.append(orwords[i]);
095: orString.append(" OR ");
096: }
097: orString.append(orwords[orwords.length - 1]);
098: orString.append(")");
099: }
100: return getId() + ":" + orString.toString();
101: }
102: };
103: term.setId(inField);
104: term.setValue(inValue);
105: term.setFriendly("or " + inFriendlyFieldName + " = " + inValue);
106: getTerms().add(term);
107: }
108:
109: public void addMatches(String inField, String inVal,
110: String inFriendly) {
111: if (inFriendly == null) {
112: inFriendly = inField;
113:
114: }
115: Term term = new Term() {
116: public String toQuery() {
117: if (getId() != null) {
118: return getId() + ":(" + getValue() + ")";
119: } else {
120: return getValue();
121: }
122: }
123: };
124: term.setId(inField);
125: term.setValue(inVal);
126: term.setFriendly(inFriendly + ":" + inVal);
127: fieldTerms.add(term);
128: //fieldTerms.add(inField + ":" + inVal);
129: }
130:
131: public void addStartsWith(String inField, String inVal,
132: String inFriendlyFieldName) {
133: Term term = new Term() {
134: public String toQuery() {
135: return getId() + ":(" + getValue() + ")";
136: }
137: };
138: term.setId(inField);
139: if (inFriendlyFieldName != null) {
140: String full = inFriendlyFieldName + " contains " + inVal;
141: term.setFriendly(full);
142: }
143: if (inVal.indexOf("*") == -1 && inVal.indexOf(":") == -1) {
144: term.setValue(inVal + "*");
145: } else {
146: term.setValue(inVal);
147: term.setFriendly(inField + " starts with " + inVal);
148: }
149:
150: fieldTerms.add(term);
151:
152: }
153:
154: public void addNots(String inId, String inNots,
155: String inFriendlyFieldName) {
156: Term term = new Term() {
157: public String toQuery() {
158: StringBuffer orString = new StringBuffer();
159:
160: String[] notwords = getValue().split("\\s");
161: if (notwords.length > 0) {
162: for (int i = 0; i < notwords.length; i++) {
163: orString.append(" NOT " + notwords[i]);
164: }
165: }
166: return orString.toString();
167: }
168: };
169: term.setId(inId);
170: term.setValue(inNots);
171: term.setFriendly(inFriendlyFieldName);
172: getTerms().add(term);
173: }
174:
175: public void addNot(String inNot) {
176:
177: addNots(null, inNot, "not " + inNot);
178: //fieldTerms.add("NOT " + inNot);
179: }
180:
181: // public void addDayRangeBeforeToday(String inDaterange)
182: // {
183: // GregorianCalendar d = new GregorianCalendar();
184: // SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
185: // String end = format.format(d.getTime());
186: // int less = Integer.parseInt(inDaterange);
187: // int m = 0 - less ;
188: // d.add(GregorianCalendar.DAY_OF_YEAR,m);
189: // //var start = d.getMonth() + '/' + d.getDate() + '/' + d.getFullYear();
190: // String start = format.format(d.getTime());
191: //
192: // String fin = "date:[" + start + " TO " + end + "]";
193: // //alert( );
194: // //query.value = query.value + ' AND ' + fin;
195: //
196: // fieldTerms.add(fin);
197: // }
198: //
199: // public void addMonthRangeBeforeToday(String inMonths)
200: // {
201: // int less = Integer.parseInt(inMonths);
202: // int m = 0 - less ;
203: // GregorianCalendar d = new GregorianCalendar();
204: // //var start = d.getMonth() + '/' + d.getDate() + '/' + d.getFullYear();
205: // SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
206: // String end = format.format(d.getTime());
207: // d.add(GregorianCalendar.MONTH,m);
208: // String start = format.format(d.getTime());
209: //
210: // //Is this right? Looks like wrong format
211: // String fin = "date:[" + start + " TO " + end + "]";
212: // fieldTerms.add(fin);
213: // }
214:
215: public String toQuery() {
216: StringBuffer done = new StringBuffer();
217: String op = null;
218: if (isAndTogether()) {
219: op = "+";
220: } else {
221: done.append("(");
222: op = " OR ";
223: }
224: for (int i = 0; i < fieldTerms.size(); i++) {
225: Term field = (Term) fieldTerms.get(i);
226: String q = field.toQuery();
227: if (i > 0 && !q.startsWith("+") && !q.startsWith("-")) {
228: done.append(op);
229: }
230: done.append(q);
231: if (i + 1 < fieldTerms.size()) {
232: done.append(" ");
233: }
234: }
235: if (!isAndTogether()) {
236: done.append(")");
237: }
238: return done.toString();
239: }
240:
241: public String toFriendly() {
242: String op = " or ";
243: if (isAndTogether()) {
244: op = " and ";
245: }
246: StringBuffer done = new StringBuffer();
247: for (int i = 0; i < fieldTerms.size(); i++) {
248: Term field = (Term) fieldTerms.get(i);
249: String q = field.getFriendly();
250: if (q != null) {
251: if (i > 0 && !q.startsWith("+") && !q.startsWith("-")) {
252: done.append(op);
253: }
254: done.append(q);
255: if (i + 1 < fieldTerms.size()) {
256: done.append(" ");
257: }
258:
259: }
260: }
261: return done.toString();
262:
263: }
264:
265: public void addExact(String inId, String inValue,
266: String inFriendlyFieldName) {
267: if (inFriendlyFieldName == null) {
268: inFriendlyFieldName = inId;
269: }
270: Term term = new Term() {
271: public String toQuery() {
272: return getId() + ":\"" + getValue() + "\"";
273: }
274: };
275: term.setId(inId);
276: term.setValue(inValue);
277: term.setFriendly(inFriendlyFieldName + "is " + inValue);
278: getTerms().add(term);
279:
280: }
281:
282: public void addExact(String inValue, String inFriendlyFieldName) {
283: Term term = new Term() {
284: public String toQuery() {
285: return "\"" + getValue() + "\"";
286: }
287: };
288:
289: term.setValue(inValue);
290: term.setFriendly(inFriendlyFieldName);
291: getTerms().add(term);
292:
293: }
294:
295: public void addNot(String inField, String inVal, String inFriendly) {
296: Term term = new Term() {
297: public String toQuery() {
298: return "-" + getId() + ":" + getValue();
299: }
300: };
301: term.setFriendly(inFriendly);
302: term.setId(inField);
303: term.setValue(inVal);
304:
305: fieldTerms.add(term);
306: }
307:
308: public void addCategoryFilter(List inRemaining, String inFriendly) {
309: Term term = new Term() {
310: public String toQuery() {
311: return "-" + getId() + ":" + getValue() + "";
312: }
313: };
314: term.setId("category");
315: StringBuffer all = new StringBuffer();
316: all.append("(");
317: for (Iterator iter = inRemaining.iterator(); iter.hasNext();) {
318: String cat = (String) iter.next();
319: all.append(cat);
320: all.append(" ");
321: }
322: all.append(")");
323: term.setValue(all.toString());
324: term.setFriendly(inFriendly);
325: getTerms().add(term);
326: }
327:
328: }
|