/** * Mad-Advertisement * Copyright (C) 2011 Thorsten Marx <thmarx@gmx.net> * * 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 3 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 program. If not, see <http://www.gnu.org/licenses/>. */ package test.ad.date; import java.io.File; import java.util.ArrayList; import java.util.List; import org.apache.lucene.analysis.KeywordAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.Field.Index; import org.apache.lucene.document.Field.Store; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TermRangeQuery; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.RAMDirectory; import net.mad.ads.db.enums.Day; import net.mad.ads.db.enums.State; public class Datetest { private static IndexSearcher searcher = null; public static void main (String [] args) throws Exception { RAMDirectory dir = new RAMDirectory(); // FSDirectory dir = FSDirectory.open(new File("lt/")); IndexWriter writer = new IndexWriter(dir, new KeywordAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED); List<Day> days = new ArrayList<Day>(); days.add(Day.All); List<State> states= new ArrayList<State>(); states.add(State.All); writer.addDocument(getDoc("b1", "0600", "0800", "all", "all", days, states)); writer.addDocument(getDoc("b2", "all", "all", "all", "all", days, states)); writer.addDocument(getDoc("b3", "0600", "0700", "all", "all", days, states)); writer.addDocument(getDoc("b4", "0500", "0700", "all", "all", days, states)); writer.addDocument(getDoc("b5", "0630", "0700", "all", "all", days, states)); writer.addDocument(getDoc("b6", "0800", "0900", "all", "all", days, states)); writer.optimize(); writer.close(); searcher = new IndexSearcher(dir); System.out.println("\n6Uhr"); searchTest("0600", "20101221", Day.All, 4); System.out.println("\n6:30Uhr"); searchTest("0630", null, Day.All, 5); System.out.println("\n5Uhr"); searchTest("0500", null, Day.All, 2); System.out.println("\n8:30Uhr"); searchTest("0830", null, Day.All, 2); dir.close(); } public static void searchTest (String time, String date, Day day, int count) throws Exception { BooleanQuery mainQuery = new BooleanQuery(); Query query = getTimeQuery(time); if (query != null) { mainQuery.add(query, Occur.MUST); } query = getDateQuery(date); if (query != null) { mainQuery.add(query, Occur.MUST); } query = getDayQuery(day.getDay()); if (query != null) { mainQuery.add(query, Occur.MUST); } // System.out.println("mainQuery: " + mainQuery.toString()); MyCollector result = new MyCollector(); searcher.search(mainQuery, result); List<Integer> hits = result.getHits(); System.out.println("Treffer " + hits.size() + " von erwartet: " + count); for (Integer docid : result.getHits()) { System.out.print(searcher.doc(docid).get("name") + " "); } } public static Query getDayQuery (int day) { if (day == Day.All.getDay()) { return null; } BooleanQuery query = new BooleanQuery(); BooleanQuery temp = new BooleanQuery(); temp.add(new TermQuery(new Term("day", String.valueOf(day))), Occur.SHOULD); temp.add(new TermQuery(new Term("day", String.valueOf(Day.All.getDay()))), Occur.SHOULD); query.add(temp, Occur.MUST); return query; } public static Query getStateQuery (int state) { if (state == State.All.getState()) { return null; } BooleanQuery query = new BooleanQuery(); BooleanQuery temp = new BooleanQuery(); temp.add(new TermQuery(new Term("state", String.valueOf(state))), Occur.SHOULD); temp.add(new TermQuery(new Term("state", String.valueOf(State.All.getState()))), Occur.SHOULD); query.add(temp, Occur.MUST); return query; } public static Query getTimeQuery (String time) { BooleanQuery query = null; if (time != null) { query = new BooleanQuery(); BooleanQuery temp = new BooleanQuery(); TermRangeQuery tQuery = new TermRangeQuery("time_from", "0000", time, true, true); temp.add(tQuery, Occur.SHOULD); temp.add(new TermQuery(new Term("time_from", "all")), Occur.SHOULD); query.add(temp, Occur.MUST); temp = new BooleanQuery(); tQuery = new TermRangeQuery("time_to", time, "2500", true, true); temp.add(tQuery, Occur.SHOULD); temp.add(new TermQuery(new Term("time_to", "all")), Occur.SHOULD); query.add(temp, Occur.MUST); } return query; } public static Query getDateQuery (String date) { BooleanQuery query = null; if (date != null) { query = new BooleanQuery(); BooleanQuery temp = new BooleanQuery(); TermRangeQuery tQuery = new TermRangeQuery("date_from", null, date, true, true); temp.add(tQuery, Occur.SHOULD); temp.add(new TermQuery(new Term("date_from", "all")), Occur.SHOULD); query.add(temp, Occur.MUST); temp = new BooleanQuery(); tQuery = new TermRangeQuery("date_to", date, null, true, true); temp.add(tQuery, Occur.SHOULD); temp.add(new TermQuery(new Term("time_to", "all")), Occur.SHOULD); query.add(temp, Occur.MUST); } return query; } public static Document getDoc (String name, String timefrom, String timeto, String datefrom, String dateto, List<Day> days, List<State> states) { Document doc = new Document(); if (days != null) { for (Day day : days) { doc.add(new Field("day", String.valueOf(day.getDay()), Store.NO, Index.NOT_ANALYZED_NO_NORMS)); } } else { doc.add(new Field("day", String.valueOf(Day.All.getDay()), Store.NO, Index.NOT_ANALYZED_NO_NORMS)); } if (states != null) { for (State state : states) { doc.add(new Field("state", String.valueOf(state.getState()), Store.NO, Index.NOT_ANALYZED_NO_NORMS)); } } else { doc.add(new Field("state", String.valueOf(State.All.getState()), Store.NO, Index.NOT_ANALYZED_NO_NORMS)); } doc.add(new Field("time_from", timefrom, Store.NO, Index.NOT_ANALYZED_NO_NORMS)); doc.add(new Field("time_from", timefrom, Store.NO, Index.NOT_ANALYZED_NO_NORMS)); doc.add(new Field("time_to", timeto, Store.NO, Index.NOT_ANALYZED_NO_NORMS)); doc.add(new Field("date_from", datefrom, Store.NO, Index.NOT_ANALYZED_NO_NORMS)); doc.add(new Field("date_to", dateto, Store.NO, Index.NOT_ANALYZED_NO_NORMS)); doc.add(new Field("name", name, Store.YES, Index.NOT_ANALYZED_NO_NORMS)); return doc; } }