| /* |
| * 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.join; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Collections; |
| import java.util.List; |
| |
| import org.apache.solr.SolrTestCaseJ4; |
| import org.apache.solr.request.SolrQueryRequest; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| |
| public class BlockJoinFacetSimpleTest extends SolrTestCaseJ4 { |
| private static String handler; |
| |
| @BeforeClass |
| public static void beforeClass() throws Exception { |
| initCore("solrconfig-blockjoinfacetcomponent.xml", "schema-blockjoinfacetcomponent.xml"); |
| handler = random().nextBoolean() ? "/blockJoinDocSetFacetRH":"/blockJoinFacetRH"; |
| createIndex(); |
| } |
| |
| public static void createIndex() throws Exception { |
| |
| final String match; |
| List<String> docs = Arrays.asList( |
| // match |
| match = adoc("id", "10","type_s", "parent","BRAND_s", "Nike").replace("</doc>", |
| ""+ |
| doc("id", "11","type_s", "child","COLOR_s", "Red","SIZE_s", "XL")+// matches child filter |
| doc("id", "12","type_s", "child","COLOR_s", "Red","SIZE_s", "XL")+// matches child filter |
| doc("id", "13","type_s", "child","COLOR_s", "Blue","SIZE_s", "XL")+"</doc>"), |
| // mismatch |
| adoc("id", "100","type_s", "parent","BRAND_s", "Reebok").replace("</doc>", |
| ""+doc("id", "101","type_s", "child","COLOR_s", "Red","SIZE_s", "M")+ |
| doc("id", "102","type_s", "child","COLOR_s", "Blue","SIZE_s", "XL")+ |
| doc("id", "104","type_s", "child","COLOR_s", "While","SIZE_s", "XL")+ |
| doc("id", "105","type_s", "child","COLOR_s", "Green","SIZE_s", "XXXL")+ |
| "</doc>")); |
| |
| Collections.shuffle(docs, random()); |
| for(String d : docs){ |
| assertU(d); |
| } |
| if(random().nextBoolean()){// let's have a deleted doc |
| if(random().nextBoolean()){ |
| assertU("let's have two segs",commit()); |
| } |
| assertU("overriding matching doc",match); |
| } |
| assertU(commit()); |
| assertQ(req("q", "*:*"), "//*[@numFound='" + 9 + "']"); |
| } |
| |
| @Test |
| public void testSimple() throws Exception { |
| //query |
| // parents |
| assertQ(req("q", "type_s:parent"), "//*[@numFound='" + 2 + "']"); |
| |
| String alt[][] ={ {"q", "{!parent which=\"type_s:parent\"}+COLOR_s:Red +SIZE_s:XL"}, |
| {"q", "+{!parent which=\"type_s:parent\"}+COLOR_s:Red +BRAND_s:Nike"}, |
| {"q", "{!parent which=\"type_s:parent\"}+COLOR_s:Red", "fq", "BRAND_s:Nike"}}; |
| |
| for(String param[] : alt){ |
| final List<String> reqParams = new ArrayList<>(Arrays.asList(param)); |
| reqParams.addAll(Arrays.asList("qt",handler, |
| "facet", (random().nextBoolean() ? "true":"false"),// it's indifferent to |
| "child.facet.field", "COLOR_s", |
| "child.facet.field", "SIZE_s")); |
| assertQ(req(reqParams.toArray(new String[0])), |
| "//*[@numFound='" + 1 + "']", |
| "//lst[@name='COLOR_s']/int[@name='Red'][.='1']", |
| // "//lst[@name='COLOR_s']/int[@name='Blue'][.='1']", |
| "count(//lst[@name='COLOR_s']/int)=1", |
| "//lst[@name='SIZE_s']/int[@name='XL'][.='1']", |
| "count(//lst[@name='SIZE_s']/int)=1"); |
| |
| } |
| } |
| |
| @Test |
| public void testParentLevelFQExclusion() { |
| SolrQueryRequest req = req( |
| "qt", handler, |
| "q", "{!parent which=type_s:parent}+SIZE_s:XL", |
| "fq", "{!term f=BRAND_s tag=rbrand}Nike", |
| "facet", "true", |
| "facet.field", "BRAND_s", |
| "child.facet.field", "COLOR_s"); |
| assertQ("no exclusion, brand facet got only one Nike",req, "//*[@numFound='" + 1 + "']", |
| "count(//lst[@name='BRAND_s']/int[.='1'])=1"); |
| |
| assertQ("nike filter is excluded, expecting both brand in facet",req( |
| "qt", handler, |
| "q", "{!parent which=type_s:parent}+SIZE_s:XL", |
| "fq", "{!term f=BRAND_s tag=rbrand}Nike", |
| "facet", "true", |
| "facet.field", "{!ex=rbrand}BRAND_s", |
| "child.facet.field", "COLOR_s"), |
| "//*[@numFound='" + 1 + "']", |
| "count(//lst[@name='BRAND_s']/int[.='1'])=2"); |
| |
| } |
| } |