blob: 1a97a99e36a5f7f6667062230beb67343839d7b2 [file] [log] [blame]
/*
* 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.
*/
package org.apache.lucene.search;
import java.util.Random;
import org.apache.lucene.index.Term;
import org.apache.lucene.util.TestUtil;
/**
* random sloppy phrase query tests
*/
public class TestSloppyPhraseQuery2 extends SearchEquivalenceTestBase {
/** "A B"~N ⊆ "A B"~N+1 */
public void testIncreasingSloppiness() throws Exception {
Term t1 = randomTerm();
Term t2 = randomTerm();
for (int i = 0; i < 10; i++) {
PhraseQuery q1 = new PhraseQuery(i, t1.field(), t1.bytes(), t2.bytes());
PhraseQuery q2 = new PhraseQuery(i + 1, t1.field(), t1.bytes(), t2.bytes());
assertSubsetOf(q1, q2);
}
}
/** same as the above with posincr */
public void testIncreasingSloppinessWithHoles() throws Exception {
Term t1 = randomTerm();
Term t2 = randomTerm();
for (int i = 0; i < 10; i++) {
PhraseQuery.Builder builder = new PhraseQuery.Builder();
builder.add(t1, 0);
builder.add(t2, 2);
builder.setSlop(i);
PhraseQuery q1 = builder.build();
builder.setSlop(i + 1);
PhraseQuery q2 = builder.build();
assertSubsetOf(q1, q2);
}
}
/** "A B C"~N ⊆ "A B C"~N+1 */
public void testIncreasingSloppiness3() throws Exception {
Term t1 = randomTerm();
Term t2 = randomTerm();
Term t3 = randomTerm();
for (int i = 0; i < 10; i++) {
PhraseQuery q1 = new PhraseQuery(i, t1.field(), t1.bytes(), t2.bytes(), t3.bytes());
PhraseQuery q2 = new PhraseQuery(i + 1, t1.field(), t1.bytes(), t2.bytes(), t3.bytes());
assertSubsetOf(q1, q2);
assertSubsetOf(q1, q2);
}
}
/** same as the above with posincr */
public void testIncreasingSloppiness3WithHoles() throws Exception {
Term t1 = randomTerm();
Term t2 = randomTerm();
Term t3 = randomTerm();
int pos1 = 1 + random().nextInt(3);
int pos2 = pos1 + 1 + random().nextInt(3);
for (int i = 0; i < 10; i++) {
PhraseQuery.Builder builder = new PhraseQuery.Builder();
builder.add(t1, 0);
builder.add(t2, pos1);
builder.add(t3, pos2);
builder.setSlop(i);
PhraseQuery q1 = builder.build();
builder.setSlop(i + 1);
PhraseQuery q2 = builder.build();
assertSubsetOf(q1, q2);
}
}
/** "A A"~N ⊆ "A A"~N+1 */
public void testRepetitiveIncreasingSloppiness() throws Exception {
Term t = randomTerm();
for (int i = 0; i < 10; i++) {
PhraseQuery q1 = new PhraseQuery(i, t.field(), t.bytes(), t.bytes());
PhraseQuery q2 = new PhraseQuery(i + 1, t.field(), t.bytes(), t.bytes());
assertSubsetOf(q1, q2);
}
}
/** same as the above with posincr */
public void testRepetitiveIncreasingSloppinessWithHoles() throws Exception {
Term t = randomTerm();
for (int i = 0; i < 10; i++) {
PhraseQuery.Builder builder = new PhraseQuery.Builder();
builder.add(t, 0);
builder.add(t, 2);
builder.setSlop(i);
PhraseQuery q1 = builder.build();
builder.setSlop(i + 1);
PhraseQuery q2 = builder.build();
assertSubsetOf(q1, q2);
}
}
/** "A A A"~N ⊆ "A A A"~N+1 */
public void testRepetitiveIncreasingSloppiness3() throws Exception {
Term t = randomTerm();
for (int i = 0; i < 10; i++) {
PhraseQuery q1 = new PhraseQuery(i, t.field(), t.bytes(), t.bytes(), t.bytes());
PhraseQuery q2 = new PhraseQuery(i + 1, t.field(), t.bytes(), t.bytes(), t.bytes());
assertSubsetOf(q1, q2);
assertSubsetOf(q1, q2);
}
}
/** same as the above with posincr */
public void testRepetitiveIncreasingSloppiness3WithHoles() throws Exception {
Term t = randomTerm();
int pos1 = 1 + random().nextInt(3);
int pos2 = pos1 + 1 + random().nextInt(3);
for (int i = 0; i < 10; i++) {
PhraseQuery.Builder builder = new PhraseQuery.Builder();
builder.add(t, 0);
builder.add(t, pos1);
builder.add(t, pos2);
builder.setSlop(i);
PhraseQuery q1 = builder.build();
builder.setSlop(i + 1);
PhraseQuery q2 = builder.build();
assertSubsetOf(q1, q2);
assertSubsetOf(q1, q2);
}
}
/** MultiPhraseQuery~N ⊆ MultiPhraseQuery~N+1 */
public void testRandomIncreasingSloppiness() throws Exception {
long seed = random().nextLong();
for (int i = 0; i < 10; i++) {
MultiPhraseQuery q1 = randomPhraseQuery(seed);
MultiPhraseQuery q2 = randomPhraseQuery(seed);
q1 = new MultiPhraseQuery.Builder(q1).setSlop(i).build();
q2 = new MultiPhraseQuery.Builder(q2).setSlop(i+1).build();
assertSubsetOf(q1, q2);
}
}
private MultiPhraseQuery randomPhraseQuery(long seed) {
Random random = new Random(seed);
int length = TestUtil.nextInt(random, 2, 5);
MultiPhraseQuery.Builder pqb = new MultiPhraseQuery.Builder();
int position = 0;
for (int i = 0; i < length; i++) {
int depth = TestUtil.nextInt(random, 1, 3);
Term terms[] = new Term[depth];
for (int j = 0; j < depth; j++) {
terms[j] = new Term("field", "" + (char) TestUtil.nextInt(random, 'a', 'z'));
}
pqb.add(terms, position);
position += TestUtil.nextInt(random, 1, 3);
}
return pqb.build();
}
}