blob: 2308ad333837a230223346308e9dfec2c20a1ddf [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.schema.IndexSchema;
import org.apache.solr.schema.SchemaField;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Test for QueryDocAuthorizationComponent (with conjunctive match) and SubsetQueryPlugin
*/
public class SubsetQueryTest extends SolrTestCaseJ4 {
private static final String f = "stringdv";
private static final String countField = "valcount";
private static final String qParser = "subset";
@BeforeClass
public static void beforeTests() throws Exception {
initCore("solrconfig-subsetquery.xml", "schema-docValuesSubsetMatch.xml");
// sanity check our schema meets our expectations
final IndexSchema schema = h.getCore().getLatestSchema();
final SchemaField sf = schema.getField(f);
assert(sf.indexed());
final SchemaField sfCount = schema.getField(countField);
assert(sfCount.indexed());
}
public void setUp() throws Exception {
super.setUp();
assertU(delQ("*:*"));
}
/** Tests the ability to do basic queries using SubsetQueryPlugin
*/
@Test
public void testSubsetQueryPluginSimple() {
assertU(adoc("id", "1", f, "a", countField, "1"));
assertU(adoc("id", "2", f, "b", countField, "1"));
assertU(adoc("id", "3", f, "c", countField, "1"));
assertU(adoc("id", "4", f, "d", countField, "1"));
assertU(adoc("id", "5", f, "a", f, "b", countField, "2"));
assertU(adoc("id", "6", f, "a", f, "b", f, "c", countField, "3"));
assertU(adoc("id", "7", f, "a", f, "b", f, "c", f, "d", countField, "4"));
assertU(adoc("id", "8", f, "a", f, "b", f, "c", f, "d", f, "bar", countField, "5"));
assertU(adoc("id", "9", countField, "0"));
assertU(commit());
// string: normal fq
assertQ(req("q", "*:*", "fq", "stringdv:b", "sort", "id asc"),
"//*[@numFound='5']",
"//result/doc[1]/str[@name='id'][.=2]",
"//result/doc[2]/str[@name='id'][.=5]",
"//result/doc[3]/str[@name='id'][.=6]",
"//result/doc[4]/str[@name='id'][.=7]",
"//result/doc[5]/str[@name='id'][.=8]"
);
assertQ(req("q", "*:*", "fq", "stringdv:b", "fq", "valcount:1", "sort", "id asc"),
"//*[@numFound='1']",
"//result/doc[1]/str[@name='id'][.=2]"
);
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"b\" set_field=\"stringdv\" allow_missing_val=false wildcard_token=\"foo\" }", "sort", "id asc"),
"//*[@numFound='1']",
"//result/doc[1]/str[@name='id'][.=2]"
);
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"a,b\" set_field=\"stringdv\" allow_missing_val=false wildcard_token=\"foo\" }", "sort", "id asc"),
"//*[@numFound='3']",
"//result/doc[1]/str[@name='id'][.=1]",
"//result/doc[2]/str[@name='id'][.=2]",
"//result/doc[3]/str[@name='id'][.=5]"
);
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"a,b\" set_field=\"stringdv\" allow_missing_val=true wildcard_token=\"foo\" }", "sort", "id asc"),
"//*[@numFound='4']",
"//result/doc[1]/str[@name='id'][.=1]",
"//result/doc[2]/str[@name='id'][.=2]",
"//result/doc[3]/str[@name='id'][.=5]",
"//result/doc[4]/str[@name='id'][.=9]"
);
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"a,b,c,d\" set_field=\"stringdv\" allow_missing_val=true wildcard_token=\"foo\" }", "sort", "id asc"),
"//*[@numFound='8']"
);
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"a,b,c,d\" set_field=\"stringdv\" allow_missing_val=true wildcard_token=\"bar\" }", "sort", "id asc"),
"//*[@numFound='9']"
);
}
/** Tests the missingValues capability, both +ve and -ve testing
*/
@Test
public void testMissingValues() throws Exception {
assertU(adoc("id", "1", f, "a", countField, "1"));
assertU(adoc("id", "2", countField, "0"));
assertU(adoc("id", "3", f, "b", countField, "1"));
assertU(adoc("id", "4", countField, "0"));
assertU(adoc("id", "5", f, "a", f, "b", countField, "2"));
assertU(adoc("id", "6", countField, "0"));
assertU(adoc("id", "7", f, "a", f, "b", f, "c", countField, "3"));
assertU(adoc("id", "8", countField, "0"));
assertU(commit());
// string: normal fq
assertQ(req("q", "*:*", "sort", "id asc"),
"//*[@numFound='8']"
);
// string: normal fq
assertQ(req("q", "*:*", "fq", "stringdv:b", "sort", "id asc"),
"//*[@numFound='3']",
"//result/doc[1]/str[@name='id'][.=3]",
"//result/doc[2]/str[@name='id'][.=5]",
"//result/doc[3]/str[@name='id'][.=7]"
);
// Just matching docs with only b
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"b\" set_field=\"stringdv\" allow_missing_val=false wildcard_token=\"foo\" }", "sort", "id asc"),
"//*[@numFound='1']",
"//result/doc[1]/str[@name='id'][.=3]"
);
// Matching docs with only b and also the docs with no values (2, 4, 6, 8)
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"b\" set_field=\"stringdv\" allow_missing_val=true wildcard_token=\"foo\" }", "sort", "id asc"),
"//*[@numFound='5']",
"//result/doc[1]/str[@name='id'][.=2]",
"//result/doc[2]/str[@name='id'][.=3]",
"//result/doc[3]/str[@name='id'][.=4]",
"//result/doc[4]/str[@name='id'][.=6]",
"//result/doc[5]/str[@name='id'][.=8]"
);
// Matching docs with a, b or a and b
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"a,b\" set_field=\"stringdv\" allow_missing_val=false wildcard_token=\"foo\" }", "sort", "id asc"),
"//*[@numFound='3']",
"//result/doc[1]/str[@name='id'][.=1]",
"//result/doc[2]/str[@name='id'][.=3]",
"//result/doc[3]/str[@name='id'][.=5]"
);
// Matching docs with a, b or a and b and also the docs with no values (2, 4, 6, 8)
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"a,b\" set_field=\"stringdv\" allow_missing_val=true wildcard_token=\"foo\" }", "sort", "id asc"),
"//*[@numFound='7']",
"//result/doc[1]/str[@name='id'][.=1]",
"//result/doc[2]/str[@name='id'][.=2]",
"//result/doc[3]/str[@name='id'][.=3]",
"//result/doc[4]/str[@name='id'][.=4]",
"//result/doc[5]/str[@name='id'][.=5]",
"//result/doc[6]/str[@name='id'][.=6]",
"//result/doc[7]/str[@name='id'][.=8]"
);
}
/** Tests the wildcardToken capability, both +ve and -ve testing
* Wildcard token means you should match those documents with that term, as well as those listed
*/
@Test
public void testWildcardToken() throws Exception {
assertU(adoc("id", "1", f, "a", countField, "1"));
assertU(adoc("id", "2", f, "a", f, "foo", countField, "2"));
assertU(adoc("id", "3", f, "b", countField, "1"));
assertU(adoc("id", "4", f, "b", f, "foo", countField, "2"));
assertU(adoc("id", "5", f, "a", f, "b", countField, "2"));
assertU(adoc("id", "6", f, "a", f, "b", f, "foo", countField, "3"));
assertU(adoc("id", "7", f, "a", f, "b", f, "c", countField, "3"));
assertU(adoc("id", "8", f, "a", f, "b", f, "c", f, "foo", countField, "4"));
assertU(adoc("id", "9", f, "foo", countField, "1"));
assertU(commit());
// string: normal fq
assertQ(req("q", "*:*", "sort", "id asc"),
"//*[@numFound='9']"
);
// string: normal fq
assertQ(req("q", "*:*", "fq", "stringdv:b", "sort", "id asc"),
"//*[@numFound='6']",
"//result/doc[1]/str[@name='id'][.=3]",
"//result/doc[2]/str[@name='id'][.=4]",
"//result/doc[3]/str[@name='id'][.=5]",
"//result/doc[4]/str[@name='id'][.=6]",
"//result/doc[5]/str[@name='id'][.=7]",
"//result/doc[6]/str[@name='id'][.=8]"
);
// Matching docs with only b, plus wildcard token of bar (has no matches)
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"b\" set_field=\"stringdv\" allow_missing_val=false wildcard_token=\"bar\" }", "sort", "id asc"),
"//*[@numFound='1']",
"//result/doc[1]/str[@name='id'][.=3]"
);
// Matching docs with only b, plus wildcard token of foo (matches 4 and 9)
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"b\" set_field=\"stringdv\" allow_missing_val=false wildcard_token=\"foo\" }", "sort", "id asc"),
"//*[@numFound='3']",
"//result/doc[1]/str[@name='id'][.=3]",
"//result/doc[2]/str[@name='id'][.=4]",
"//result/doc[3]/str[@name='id'][.=9]"
);
// Matching docs with a, b or a and b, plus wildcard token of bar (has no matches)
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"a,b\" set_field=\"stringdv\" allow_missing_val=false wildcard_token=\"bar\" }", "sort", "id asc"),
"//*[@numFound='3']",
"//result/doc[1]/str[@name='id'][.=1]",
"//result/doc[2]/str[@name='id'][.=3]",
"//result/doc[3]/str[@name='id'][.=5]"
);
// Matching docs with a, b or a and b, plus wildcard token of foo (matches 2, 4, 6 and 9)
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"a,b\" set_field=\"stringdv\" allow_missing_val=false wildcard_token=\"foo\" }", "sort", "id asc"),
"//*[@numFound='7']",
"//result/doc[1]/str[@name='id'][.=1]",
"//result/doc[2]/str[@name='id'][.=2]",
"//result/doc[3]/str[@name='id'][.=3]",
"//result/doc[4]/str[@name='id'][.=4]",
"//result/doc[5]/str[@name='id'][.=5]",
"//result/doc[6]/str[@name='id'][.=6]",
"//result/doc[7]/str[@name='id'][.=9]"
);
}
/** Tests the wildcardToken capability and the missingValues together, both +ve and -ve testing
*/
@Test
public void testWildcardTokenWithMissing() throws Exception {
assertU(adoc("id", "1", f, "a", countField, "1"));
assertU(adoc("id", "2", f, "a", f, "foo", countField, "2"));
assertU(adoc("id", "3", f, "b", countField, "1"));
assertU(adoc("id", "4", f, "b", f, "foo", countField, "2"));
assertU(adoc("id", "5", f, "a", f, "b", countField, "2"));
assertU(adoc("id", "6", f, "a", f, "b", f, "foo", countField, "3"));
assertU(adoc("id", "7", f, "a", f, "b", f, "c", countField, "3"));
assertU(adoc("id", "8", f, "a", f, "b", f, "c", f, "foo", countField, "4"));
assertU(adoc("id", "9", f, "foo", countField, "1"));
assertU(adoc("id", "10", countField, "0"));
assertU(commit());
// string: normal fq
assertQ(req("q", "*:*", "sort", "id asc"),
"//*[@numFound='10']"
);
// string: normal fq
assertQ(req("q", "*:*", "fq", "stringdv:b", "sort", "id asc"),
"//*[@numFound='6']",
"//result/doc[1]/str[@name='id'][.=3]",
"//result/doc[2]/str[@name='id'][.=4]",
"//result/doc[3]/str[@name='id'][.=5]",
"//result/doc[4]/str[@name='id'][.=6]",
"//result/doc[5]/str[@name='id'][.=7]",
"//result/doc[6]/str[@name='id'][.=8]"
);
// Matches docs with only b, allowMissing=false, wildcard of bar
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"b\" set_field=\"stringdv\" allow_missing_val=false wildcard_token=\"bar\" }", "sort", "id asc"),
"//*[@numFound='1']",
"//result/doc[1]/str[@name='id'][.=3]"
);
// Matches docs with only b, allowMissing=false, wildcard of foo (matches 4 and 9)
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"b\" set_field=\"stringdv\" allow_missing_val=false wildcard_token=\"foo\" }", "sort", "id asc"),
"//*[@numFound='3']",
"//result/doc[1]/str[@name='id'][.=3]",
"//result/doc[2]/str[@name='id'][.=4]",
"//result/doc[3]/str[@name='id'][.=9]"
);
// Matches docs with only b, allowMissing=true (matches 10), wildcard of foo (matches 4 and 9)
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"b\" set_field=\"stringdv\" allow_missing_val=true wildcard_token=\"foo\" }", "sort", "id asc"),
"//*[@numFound='4']",
"//result/doc[1]/str[@name='id'][.=10]",
"//result/doc[2]/str[@name='id'][.=3]",
"//result/doc[3]/str[@name='id'][.=4]",
"//result/doc[4]/str[@name='id'][.=9]"
);
// Matching docs with a, b or a and b,
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"a,b\" set_field=\"stringdv\" allow_missing_val=false wildcard_token=\"bar\" }", "sort", "id asc"),
"//*[@numFound='3']",
"//result/doc[1]/str[@name='id'][.=1]",
"//result/doc[2]/str[@name='id'][.=3]",
"//result/doc[3]/str[@name='id'][.=5]"
);
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"a,b\" set_field=\"stringdv\" allow_missing_val=false wildcard_token=\"foo\" }", "sort", "id asc"),
"//*[@numFound='7']",
"//result/doc[1]/str[@name='id'][.=1]",
"//result/doc[2]/str[@name='id'][.=2]",
"//result/doc[3]/str[@name='id'][.=3]",
"//result/doc[4]/str[@name='id'][.=4]",
"//result/doc[5]/str[@name='id'][.=5]",
"//result/doc[6]/str[@name='id'][.=6]",
"//result/doc[7]/str[@name='id'][.=9]"
);
assertQ(req("q", "*:*", "fq", "{!" + qParser + " count_field=\"valcount\" set_value=\"a,b\" set_field=\"stringdv\" allow_missing_val=true wildcard_token=\"foo\" }", "sort", "id asc"),
"//*[@numFound='8']",
"//result/doc[1]/str[@name='id'][.=1]",
"//result/doc[2]/str[@name='id'][.=10]",
"//result/doc[3]/str[@name='id'][.=2]",
"//result/doc[4]/str[@name='id'][.=3]",
"//result/doc[5]/str[@name='id'][.=4]",
"//result/doc[6]/str[@name='id'][.=5]",
"//result/doc[7]/str[@name='id'][.=6]",
"//result/doc[8]/str[@name='id'][.=9]"
);
}
}