package org.apache.lucene.search.spans; /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import org.apache.lucene.index.Term; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.PhraseQuery; import org.apache.lucene.search.SearchEquivalenceTestBase; import org.apache.lucene.search.TermQuery; /** * Basic equivalence tests for span queries */ public class TestSpanSearchEquivalence extends SearchEquivalenceTestBase { // TODO: we could go a little crazy for a lot of these, // but these are just simple minimal cases in case something // goes horribly wrong. Put more intense tests elsewhere. /** SpanTermQuery(A) = TermQuery(A) */ public void testSpanTermVersusTerm() throws Exception { Term t1 = randomTerm(); assertSameSet(new TermQuery(t1), new SpanTermQuery(t1)); } /** SpanOrQuery(A, B) = (A B) */ public void testSpanOrVersusBoolean() throws Exception { Term t1 = randomTerm(); Term t2 = randomTerm(); BooleanQuery q1 = new BooleanQuery(); q1.add(new TermQuery(t1), Occur.SHOULD); q1.add(new TermQuery(t2), Occur.SHOULD); SpanOrQuery q2 = new SpanOrQuery(new SpanTermQuery(t1), new SpanTermQuery(t2)); assertSameSet(q1, q2); } /** SpanNotQuery(A, B) ⊆ SpanTermQuery(A) */ public void testSpanNotVersusSpanTerm() throws Exception { Term t1 = randomTerm(); Term t2 = randomTerm(); assertSubsetOf(new SpanNotQuery(new SpanTermQuery(t1), new SpanTermQuery(t2)), new SpanTermQuery(t1)); } /** SpanFirstQuery(A, 10) ⊆ SpanTermQuery(A) */ public void testSpanFirstVersusSpanTerm() throws Exception { Term t1 = randomTerm(); assertSubsetOf(new SpanFirstQuery(new SpanTermQuery(t1), 10), new SpanTermQuery(t1)); } /** SpanNearQuery([A, B], 0, true) = "A B" */ public void testSpanNearVersusPhrase() throws Exception { Term t1 = randomTerm(); Term t2 = randomTerm(); SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) }; SpanNearQuery q1 = new SpanNearQuery(subquery, 0, true); PhraseQuery q2 = new PhraseQuery(); q2.add(t1); q2.add(t2); assertSameSet(q1, q2); } /** SpanNearQuery([A, B], ∞, false) = +A +B */ public void testSpanNearVersusBooleanAnd() throws Exception { Term t1 = randomTerm(); Term t2 = randomTerm(); SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) }; SpanNearQuery q1 = new SpanNearQuery(subquery, Integer.MAX_VALUE, false); BooleanQuery q2 = new BooleanQuery(); q2.add(new TermQuery(t1), Occur.MUST); q2.add(new TermQuery(t2), Occur.MUST); assertSameSet(q1, q2); } /** SpanNearQuery([A B], 0, false) ⊆ SpanNearQuery([A B], 1, false) */ public void testSpanNearVersusSloppySpanNear() throws Exception { Term t1 = randomTerm(); Term t2 = randomTerm(); SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) }; SpanNearQuery q1 = new SpanNearQuery(subquery, 0, false); SpanNearQuery q2 = new SpanNearQuery(subquery, 1, false); assertSubsetOf(q1, q2); } /** SpanNearQuery([A B], 3, true) ⊆ SpanNearQuery([A B], 3, false) */ public void testSpanNearInOrderVersusOutOfOrder() throws Exception { Term t1 = randomTerm(); Term t2 = randomTerm(); SpanQuery subquery[] = new SpanQuery[] { new SpanTermQuery(t1), new SpanTermQuery(t2) }; SpanNearQuery q1 = new SpanNearQuery(subquery, 3, true); SpanNearQuery q2 = new SpanNearQuery(subquery, 3, false); assertSubsetOf(q1, q2); } }