blob: 44e09bf8447a4adbffa887b294d1f7e8e911206c [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.solr.SolrTestCaseJ4;
import org.apache.solr.response.transform.ScoreAugmenter;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestSolrQueryParser extends SolrTestCaseJ4 {
@BeforeClass
public static void beforeClass() throws Exception {
System.setProperty("enable.update.log", "false"); // schema12 doesn't support _version_
initCore("solrconfig.xml", "schema12.xml");
createIndex();
}
public static void createIndex() {
String v;
v="how now brown cow";
assertU(adoc("id","1", "text",v, "text_np",v));
v="now cow";
assertU(adoc("id","2", "text",v, "text_np",v));
assertU(adoc("id","3", "foo_s","a ' \" \\ {! ) } ( { z")); // A value filled with special chars
assertU(adoc("id","10", "qqq_s","X"));
assertU(adoc("id","11", "www_s","X"));
assertU(adoc("id","12", "eee_s","X"));
assertU(adoc("id","13", "eee_s","'balance'"));
assertU(commit());
}
@Test
public void testPhrase() {
// should generate a phrase of "now cow" and match only one doc
assertQ(req("q","text:now-cow", "indent","true")
,"//*[@numFound='1']"
);
// should generate a query of (now OR cow) and match both docs
assertQ(req("q","text_np:now-cow", "indent","true")
,"//*[@numFound='2']"
);
}
@Test
public void testLocalParamsInQP() throws Exception {
assertJQ(req("q","qaz {!term f=text v=$qq} wsx", "qq","now")
,"/response/numFound==2"
);
assertJQ(req("q","qaz {!term f=text v=$qq} wsx", "qq","nomatch")
,"/response/numFound==0"
);
assertJQ(req("q","qaz {!term f=text}now wsx", "qq","now")
,"/response/numFound==2"
);
assertJQ(req("q","qaz {!term f=foo_s v='a \\' \" \\\\ {! ) } ( { z'} wsx") // single quote escaping
,"/response/numFound==1"
);
assertJQ(req("q","qaz {!term f=foo_s v=\"a ' \\\" \\\\ {! ) } ( { z\"} wsx") // double quote escaping
,"/response/numFound==1"
);
// double-join to test back-to-back local params
assertJQ(req("q","qaz {!join from=www_s to=eee_s}{!join from=qqq_s to=www_s}id:10" )
,"/response/docs/[0]/id=='12'"
);
}
@Test
public void testSolr4121() throws Exception {
// At one point, balanced quotes messed up the parser(SOLR-4121)
assertJQ(req("q","eee_s:'balance'", "indent","true")
,"/response/numFound==1"
);
}
@Test
public void testSyntax() throws Exception {
// a bare * should be treated as *:*
assertJQ(req("q","*", "df","doesnotexist_s")
,"/response/docs/[0]==" // make sure we get something...
);
assertJQ(req("q","doesnotexist_s:*")
,"/response/numFound==0" // nothing should be found
);
assertJQ(req("q","doesnotexist_s:( * * * )")
,"/response/numFound==0" // nothing should be found
);
// length of date math caused issues...
assertJQ(req("q","foo_dt:\"2013-03-08T00:46:15Z/DAY+000MILLISECONDS+00SECONDS+00MINUTES+00HOURS+0000000000YEARS+6MONTHS+3DAYS\"", "debug","query")
,"/debug/parsedquery=='foo_dt:2013-09-11T00:00:00Z'"
);
}
@Test
public void testNestedQueryModifiers() throws Exception {
// One previous error was that for nested queries, outer parameters overrode nested parameters.
// For example _query_:"\"a b\"~2" was parsed as "a b"
String subqq="_query_:\"{!v=$qq}\"";
assertJQ(req("q","_query_:\"\\\"how brown\\\"~2\""
, "debug","query"
)
,"/response/docs/[0]/id=='1'"
);
assertJQ(req("q",subqq, "qq","\"how brown\"~2"
, "debug","query"
)
,"/response/docs/[0]/id=='1'"
);
// Should explicit slop override? It currently does not, but that could be considered a bug.
assertJQ(req("q",subqq+"~1", "qq","\"how brown\"~2"
, "debug","query"
)
,"/response/docs/[0]/id=='1'"
);
// Should explicit slop override? It currently does not, but that could be considered a bug.
assertJQ(req("q"," {!v=$qq}~1", "qq","\"how brown\"~2"
, "debug","query"
)
,"/response/docs/[0]/id=='1'"
);
// boost should multiply
assertJQ(req("fq","id:1", "fl","id,score", "q", subqq+"^3", "qq","text:x^2"
, "debug","query"
)
,"/debug/parsedquery=='text:x^6.0'"
);
// boost should multiply
assertJQ(req("fq","id:1", "fl","id,score", "q", " {!v=$qq}^3", "qq","text:x^2"
, "debug","query"
)
,"/debug/parsedquery=='text:x^6.0'"
);
}
}