1 package org.apache.lucene.search;
4 * Licensed to the Apache Software Foundation (ASF) under one or more
5 * contributor license agreements. See the NOTICE file distributed with
6 * this work for additional information regarding copyright ownership.
7 * The ASF licenses this file to You under the Apache License, Version 2.0
8 * (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
20 import java.io.IOException;
22 import org.apache.lucene.analysis.MockAnalyzer;
23 import org.apache.lucene.analysis.MockTokenizer;
24 import org.apache.lucene.document.Document;
25 import org.apache.lucene.document.Field;
26 import org.apache.lucene.index.IndexReader;
27 import org.apache.lucene.index.RandomIndexWriter;
28 import org.apache.lucene.index.Term;
29 import org.apache.lucene.store.Directory;
30 import org.apache.lucene.util.LuceneTestCase;
32 public class BooleanFilterTest extends LuceneTestCase {
33 private Directory directory;
34 private IndexReader reader;
37 public void setUp() throws Exception {
39 directory = newDirectory();
40 RandomIndexWriter writer = new RandomIndexWriter(random, directory, new MockAnalyzer(random, MockTokenizer.WHITESPACE, false));
42 //Add series of docs with filterable fields : acces rights, prices, dates and "in-stock" flags
43 addDoc(writer, "admin guest", "010", "20040101","Y");
44 addDoc(writer, "guest", "020", "20040101","Y");
45 addDoc(writer, "guest", "020", "20050101","Y");
46 addDoc(writer, "admin", "020", "20050101","Maybe");
47 addDoc(writer, "admin guest", "030", "20050101","N");
48 reader = writer.getReader();
53 public void tearDown() throws Exception {
59 private void addDoc(RandomIndexWriter writer, String accessRights, String price, String date, String inStock) throws IOException
61 Document doc=new Document();
62 doc.add(newField("accessRights",accessRights,Field.Store.YES,Field.Index.ANALYZED));
63 doc.add(newField("price",price,Field.Store.YES,Field.Index.ANALYZED));
64 doc.add(newField("date",date,Field.Store.YES,Field.Index.ANALYZED));
65 doc.add(newField("inStock",inStock,Field.Store.YES,Field.Index.ANALYZED));
66 writer.addDocument(doc);
69 private Filter getRangeFilter(String field,String lowerPrice, String upperPrice)
71 Filter f = new TermRangeFilter(field,lowerPrice,upperPrice,true,true);
74 private Filter getTermsFilter(String field,String text)
76 TermsFilter tf=new TermsFilter();
77 tf.addTerm(new Term(field,text));
82 private void tstFilterCard(String mes, int expected, Filter filt)
85 DocIdSetIterator disi = filt.getDocIdSet(reader).iterator();
87 while (disi.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
90 assertEquals(mes, expected, actual);
94 public void testShould() throws Throwable
96 BooleanFilter booleanFilter = new BooleanFilter();
97 booleanFilter.add(new FilterClause(getTermsFilter("price","030"),BooleanClause.Occur.SHOULD));
98 tstFilterCard("Should retrieves only 1 doc",1,booleanFilter);
101 public void testShoulds() throws Throwable
103 BooleanFilter booleanFilter = new BooleanFilter();
104 booleanFilter.add(new FilterClause(getRangeFilter("price","010", "020"),BooleanClause.Occur.SHOULD));
105 booleanFilter.add(new FilterClause(getRangeFilter("price","020", "030"),BooleanClause.Occur.SHOULD));
106 tstFilterCard("Shoulds are Ored together",5,booleanFilter);
108 public void testShouldsAndMustNot() throws Throwable
110 BooleanFilter booleanFilter = new BooleanFilter();
111 booleanFilter.add(new FilterClause(getRangeFilter("price","010", "020"),BooleanClause.Occur.SHOULD));
112 booleanFilter.add(new FilterClause(getRangeFilter("price","020", "030"),BooleanClause.Occur.SHOULD));
113 booleanFilter.add(new FilterClause(getTermsFilter("inStock", "N"),BooleanClause.Occur.MUST_NOT));
114 tstFilterCard("Shoulds Ored but AndNot",4,booleanFilter);
116 booleanFilter.add(new FilterClause(getTermsFilter("inStock", "Maybe"),BooleanClause.Occur.MUST_NOT));
117 tstFilterCard("Shoulds Ored but AndNots",3,booleanFilter);
119 public void testShouldsAndMust() throws Throwable
121 BooleanFilter booleanFilter = new BooleanFilter();
122 booleanFilter.add(new FilterClause(getRangeFilter("price","010", "020"),BooleanClause.Occur.SHOULD));
123 booleanFilter.add(new FilterClause(getRangeFilter("price","020", "030"),BooleanClause.Occur.SHOULD));
124 booleanFilter.add(new FilterClause(getTermsFilter("accessRights", "admin"),BooleanClause.Occur.MUST));
125 tstFilterCard("Shoulds Ored but MUST",3,booleanFilter);
127 public void testShouldsAndMusts() throws Throwable
129 BooleanFilter booleanFilter = new BooleanFilter();
130 booleanFilter.add(new FilterClause(getRangeFilter("price","010", "020"),BooleanClause.Occur.SHOULD));
131 booleanFilter.add(new FilterClause(getRangeFilter("price","020", "030"),BooleanClause.Occur.SHOULD));
132 booleanFilter.add(new FilterClause(getTermsFilter("accessRights", "admin"),BooleanClause.Occur.MUST));
133 booleanFilter.add(new FilterClause(getRangeFilter("date","20040101", "20041231"),BooleanClause.Occur.MUST));
134 tstFilterCard("Shoulds Ored but MUSTs ANDED",1,booleanFilter);
136 public void testShouldsAndMustsAndMustNot() throws Throwable
138 BooleanFilter booleanFilter = new BooleanFilter();
139 booleanFilter.add(new FilterClause(getRangeFilter("price","030", "040"),BooleanClause.Occur.SHOULD));
140 booleanFilter.add(new FilterClause(getTermsFilter("accessRights", "admin"),BooleanClause.Occur.MUST));
141 booleanFilter.add(new FilterClause(getRangeFilter("date","20050101", "20051231"),BooleanClause.Occur.MUST));
142 booleanFilter.add(new FilterClause(getTermsFilter("inStock","N"),BooleanClause.Occur.MUST_NOT));
143 tstFilterCard("Shoulds Ored but MUSTs ANDED and MustNot",0,booleanFilter);
146 public void testJustMust() throws Throwable
148 BooleanFilter booleanFilter = new BooleanFilter();
149 booleanFilter.add(new FilterClause(getTermsFilter("accessRights", "admin"),BooleanClause.Occur.MUST));
150 tstFilterCard("MUST",3,booleanFilter);
152 public void testJustMustNot() throws Throwable
154 BooleanFilter booleanFilter = new BooleanFilter();
155 booleanFilter.add(new FilterClause(getTermsFilter("inStock","N"),BooleanClause.Occur.MUST_NOT));
156 tstFilterCard("MUST_NOT",4,booleanFilter);
158 public void testMustAndMustNot() throws Throwable
160 BooleanFilter booleanFilter = new BooleanFilter();
161 booleanFilter.add(new FilterClause(getTermsFilter("inStock","N"),BooleanClause.Occur.MUST));
162 booleanFilter.add(new FilterClause(getTermsFilter("price","030"),BooleanClause.Occur.MUST_NOT));
163 tstFilterCard("MUST_NOT wins over MUST for same docs",0,booleanFilter);