blob: b26603f7dc7c01d787e487a374d3e76713a0e790 [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.solr.search;
import org.apache.lucene.search.*;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrRequestInfo;
import org.apache.solr.response.SolrQueryResponse;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import java.util.Random;
public class TestOverriddenPrefixQueryForCustomFieldType extends SolrTestCaseJ4 {
private static int[] counts= new int[2];
private static int otherCounts;
String[] otherTerms = {"this", "that", "those", "randomness"};
@BeforeClass
public static void beforeClass() throws Exception {
System.setProperty("solr.tests.CustomIntFieldType",
(Boolean.getBoolean(NUMERIC_POINTS_SYSPROP)
? "solr.IntPointPrefixActsAsRangeQueryFieldType"
: "solr.TrieIntPrefixActsAsRangeQueryFieldType"));
initCore("solrconfig-basic.xml", "schema-customfield.xml");
}
@Override
@Before
public void setUp() throws Exception {
// if you override setUp or tearDown, you better call
// the super classes version
super.setUp();
clearIndex();
assertU(commit());
otherCounts=0;
counts = new int[2];
}
public void createIndex(int nDocs) {
Random r = random();
for (int i=0; i<nDocs; i++) {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", ""+i);
int t = r.nextInt(1000);
if(t%3 == 0) {
doc.addField("swap_foo_bar_in_prefix_query", "foo" + i);
counts[0]++;
} else if(t%3 == 1) {
doc.addField("swap_foo_bar_in_prefix_query", "foo" + i);
doc.addField("swap_foo_bar_in_prefix_query", "spam" + i);
otherCounts++;
counts[0]++;
} else {
doc.addField("swap_foo_bar_in_prefix_query", "bar" + i);
counts[1]++;
}
//Randomly add noise
doc.addField("int_prefix_as_range", i);
doc.addField("intfield", i);
assertU(adoc(doc));
}
assertU(commit());
}
@Test
public void testPrefixQueries() throws Exception {
createIndex(100);
assertQ(req("fl", "id", "q", "*:*"), "//*[@numFound='100']");
// Test that prefix query actually transforms foo <-> bar.
assertQ(req("q", "swap_foo_bar_in_prefix_query:foo*"), "//*[@numFound='" + counts[1] + "']");
assertQ(req("q", "swap_foo_bar_in_prefix_query:bar*"), "//*[@numFound='" + counts[0] + "']");
assertQ(req("q", "swap_foo_bar_in_prefix_query:spam*"), "//*[@numFound='" + otherCounts + "']");
//Custom field should query for the range [2,MAX_INT)
assertQ(req("q", "int_prefix_as_range:2*"),"//*[@numFound='98']");
}
@Test
public void testQuery() throws Exception {
SolrQueryRequest req = req("myField","swap_foo_bar_in_prefix_query");
try {
assertQueryEquals(req,
"{!simple qf=$myField}foo*",
"{!simple qf=$myField}foo*",
"{!prefix f=swap_foo_bar_in_prefix_query}foo",
"{!lucene df=$myField v=foo*}",
"{!lucene}swap_foo_bar_in_prefix_query:foo*");
req.close();
req = req("myField", "int_prefix_as_range");
assertQueryEquals(req,
"{!lucene}int_prefix_as_range:[42 TO 2147483647}",
"{!lucene}int_prefix_as_range:42*",
"{!prefix f=int_prefix_as_range}42",
"{!simple qf=int_prefix_as_range}42*",
"{!simple df=int_prefix_as_range}42*");
} finally {
req.close();
}
}
/**
* @see org.apache.lucene.search.QueryUtils#check
* @see org.apache.lucene.search.QueryUtils#checkEqual
*/
protected void assertQueryEquals(final SolrQueryRequest req,
final String... inputs) throws Exception {
final Query[] queries = new Query[inputs.length];
try {
SolrQueryResponse rsp = new SolrQueryResponse();
SolrRequestInfo.setRequestInfo(new SolrRequestInfo(req, rsp));
for (int i = 0; i < inputs.length; i++) {
queries[i] = (QParser.getParser(inputs[i], req).getQuery());
}
} finally {
SolrRequestInfo.clearRequestInfo();
}
for (int i = 0; i < queries.length; i++) {
org.apache.lucene.search.QueryUtils.check(queries[i]);
for (int j = i; j < queries.length; j++) {
org.apache.lucene.search.QueryUtils.checkEqual(queries[i], queries[j]);
}
}
}
}