blob: 34d88e9d0d6e349631c3dd6cef92938355319a31 [file] [log] [blame]
package org.apache.solr.handler.component;
/*
* 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.solr.SolrTestCaseJ4;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.TermsParams;
import org.junit.BeforeClass;
import org.junit.Test;
import java.util.regex.Pattern;
/**
*
*
**/
public class TermsComponentTest extends SolrTestCaseJ4 {
@BeforeClass
public static void beforeTest() throws Exception {
System.setProperty("enable.update.log", "false"); // schema12 doesn't support _version_
initCore("solrconfig.xml","schema12.xml");
assertNull(h.validateUpdate(adoc("id", "0", "lowerfilt", "a", "standardfilt", "a", "foo_i","1")));
assertNull(h.validateUpdate(adoc("id", "1", "lowerfilt", "a", "standardfilt", "aa", "foo_i","1")));
assertNull(h.validateUpdate(adoc("id", "2", "lowerfilt", "aa", "standardfilt", "aaa", "foo_i","2")));
assertNull(h.validateUpdate(adoc("id", "3", "lowerfilt", "aaa", "standardfilt", "abbb")));
assertNull(h.validateUpdate(adoc("id", "4", "lowerfilt", "ab", "standardfilt", "b")));
assertNull(h.validateUpdate(adoc("id", "5", "lowerfilt", "abb", "standardfilt", "bb")));
assertNull(h.validateUpdate(adoc("id", "6", "lowerfilt", "abc", "standardfilt", "bbbb")));
assertNull(h.validateUpdate(adoc("id", "7", "lowerfilt", "b", "standardfilt", "c")));
assertNull(h.validateUpdate(adoc("id", "8", "lowerfilt", "baa", "standardfilt", "cccc")));
assertNull(h.validateUpdate(adoc("id", "9", "lowerfilt", "bbb", "standardfilt", "ccccc")));
assertNull(h.validateUpdate(adoc("id", "10", "standardfilt", "ddddd")));
assertNull(h.validateUpdate(adoc("id", "11", "standardfilt", "ddddd")));
assertNull(h.validateUpdate(adoc("id", "12", "standardfilt", "ddddd")));
assertNull(h.validateUpdate(adoc("id", "13", "standardfilt", "ddddd")));
assertNull(h.validateUpdate(adoc("id", "14", "standardfilt", "d")));
assertNull(h.validateUpdate(adoc("id", "15", "standardfilt", "d")));
assertNull(h.validateUpdate(adoc("id", "16", "standardfilt", "d")));
assertNull(h.validateUpdate(adoc("id", "17", "standardfilt", "snake")));
assertNull(h.validateUpdate(adoc("id", "18", "standardfilt", "spider")));
assertNull(h.validateUpdate(adoc("id", "19", "standardfilt", "shark")));
assertNull(h.validateUpdate(adoc("id", "20", "standardfilt", "snake")));
assertNull(h.validateUpdate(adoc("id", "21", "standardfilt", "snake")));
assertNull(h.validateUpdate(adoc("id", "22", "standardfilt", "shark")));
assertNull(h.validateUpdate(commit()));
}
@Test
public void testEmptyLower() throws Exception {
assertQ(req("indent","true", "qt","/terms", "terms","true", "terms.fl","lowerfilt", "terms.upper","b")
,"count(//lst[@name='lowerfilt']/*)=6"
,"//int[@name='a'] "
,"//int[@name='aa'] "
,"//int[@name='aaa'] "
,"//int[@name='ab'] "
,"//int[@name='abb'] "
,"//int[@name='abc'] "
);
}
@Test
public void testMultipleFields() throws Exception {
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","lowerfilt", "terms.upper","b",
"terms.fl","standardfilt")
,"count(//lst[@name='lowerfilt']/*)=6"
,"count(//lst[@name='standardfilt']/*)=4"
);
}
@Test
public void testUnlimitedRows() throws Exception {
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","lowerfilt",
"terms.fl","standardfilt",
"terms.rows","-1")
,"count(//lst[@name='lowerfilt']/*)=9"
,"count(//lst[@name='standardfilt']/*)=10"
);
}
@Test
public void testPrefix() throws Exception {
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","lowerfilt", "terms.upper","b",
"terms.fl","standardfilt",
"terms.lower","aa", "terms.lower.incl","false", "terms.prefix","aa", "terms.upper","b", "terms.limit","50")
,"count(//lst[@name='lowerfilt']/*)=1"
,"count(//lst[@name='standardfilt']/*)=1"
);
}
@Test
public void testRegexp() throws Exception {
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","standardfilt",
"terms.lower","a", "terms.lower.incl","false",
"terms.upper","c", "terms.upper.incl","true",
"terms.regex","b.*")
,"count(//lst[@name='standardfilt']/*)=3"
);
}
@Test
public void testRegexpFlagParsing() {
ModifiableSolrParams params = new ModifiableSolrParams();
params.add(TermsParams.TERMS_REGEXP_FLAG, "case_insensitive", "literal", "comments", "multiline", "unix_lines",
"unicode_case", "dotall", "canon_eq");
int flags = new TermsComponent().resolveRegexpFlags(params);
int expected = Pattern.CASE_INSENSITIVE | Pattern.LITERAL | Pattern.COMMENTS | Pattern.MULTILINE | Pattern.UNIX_LINES
| Pattern.UNICODE_CASE | Pattern.DOTALL | Pattern.CANON_EQ;
assertEquals(expected, flags);
}
@Test
public void testRegexpWithFlags() throws Exception {
// TODO: there are no uppercase or mixed-case terms in the index!
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","standardfilt",
"terms.lower","a", "terms.lower.incl","false",
"terms.upper","c", "terms.upper.incl","true",
"terms.regex","B.*",
"terms.regex.flag","case_insensitive")
,"count(//lst[@name='standardfilt']/*)=3"
);
}
@Test
public void testSortCount() throws Exception {
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","standardfilt",
"terms.lower","s", "terms.lower.incl","false",
"terms.prefix","s",
"terms.sort","count")
,"count(//lst[@name='standardfilt']/*)=3"
,"//lst[@name='standardfilt']/int[1][@name='snake'][.='3']"
,"//lst[@name='standardfilt']/int[2][@name='shark'][.='2']"
,"//lst[@name='standardfilt']/int[3][@name='spider'][.='1']"
);
}
@Test
public void testSortIndex() throws Exception {
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","standardfilt",
"terms.lower","s", "terms.lower.incl","false",
"terms.prefix","s",
"terms.sort","index")
,"count(//lst[@name='standardfilt']/*)=3"
,"//lst[@name='standardfilt']/int[1][@name='shark'][.='2']"
,"//lst[@name='standardfilt']/int[2][@name='snake'][.='3']"
,"//lst[@name='standardfilt']/int[3][@name='spider'][.='1']"
);
}
@Test
public void testPastUpper() throws Exception {
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","lowerfilt",
//no upper bound, lower bound doesn't exist
"terms.lower","d")
,"count(//lst[@name='standardfilt']/*)=0"
);
}
@Test
public void testLowerExclusive() throws Exception {
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","lowerfilt",
"terms.lower","a", "terms.lower.incl","false",
"terms.upper","b")
,"count(//lst[@name='lowerfilt']/*)=5"
,"//int[@name='aa'] "
,"//int[@name='aaa'] "
,"//int[@name='ab'] "
,"//int[@name='abb'] "
,"//int[@name='abc'] "
);
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","standardfilt",
"terms.lower","cc", "terms.lower.incl","false",
"terms.upper","d")
,"count(//lst[@name='standardfilt']/*)=2"
);
}
@Test
public void test() throws Exception {
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","lowerfilt",
"terms.lower","a",
"terms.upper","b")
,"count(//lst[@name='lowerfilt']/*)=6"
,"//int[@name='a'] "
,"//int[@name='aa'] "
,"//int[@name='aaa'] "
,"//int[@name='ab'] "
,"//int[@name='abb'] "
,"//int[@name='abc'] "
);
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","lowerfilt",
"terms.lower","a",
"terms.upper","b",
"terms.raw","true", // this should have no effect on a text field
"terms.limit","2")
,"count(//lst[@name='lowerfilt']/*)=2"
,"//int[@name='a']"
,"//int[@name='aa']"
);
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","foo_i")
,"//int[@name='1'][.='2']"
);
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","foo_i", "terms.raw","true")
,"not(//int[@name='1'][.='2'])"
);
// check something at the end of the index
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","zzz_i")
,"count(//lst[@name='zzz_i']/*)=0"
);
}
@Test
public void testMinMaxFreq() throws Exception {
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","lowerfilt",
"terms.lower","a",
"terms.mincount","2",
"terms.maxcount","-1",
"terms.limit","50")
,"count(//lst[@name='lowerfilt']/*)=1"
);
assertQ(req("indent","true", "qt","/terms", "terms","true",
"terms.fl","standardfilt",
"terms.lower","d",
"terms.mincount","2",
"terms.maxcount","3",
"terms.limit","50")
,"count(//lst[@name='standardfilt']/*)=3"
);
}
}