/* * 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.response.transform; import org.apache.solr.SolrTestCaseJ4; import org.apache.solr.common.SolrException; import org.apache.solr.core.CoreContainer; import org.apache.solr.core.SolrCore; import org.apache.solr.request.SolrRequestHandler; import org.apache.solr.servlet.DirectSolrConnection; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import com.google.common.collect.ImmutableMap; public class TestSubQueryTransformerCrossCore extends SolrTestCaseJ4 { private static SolrCore fromCore; @BeforeClass public static void beforeTests() throws Exception { System.setProperty("enable.update.log", "false"); // schema12 doesn't support _version_ initCore("solrconfig-basic.xml","schema-docValuesJoin.xml"); final CoreContainer coreContainer = h.getCoreContainer(); fromCore = coreContainer.create("fromCore", //FileSystems.getDefault().getPath( TEST_HOME()), ImmutableMap.of("config","solrconfig-basic.xml","schema","schema-docValuesJoin.xml" ImmutableMap.of("configSet", "minimal") ); assertU(add(doc("id", "1","name_s", "john", "title_s", "Director", "dept_ss_dv","Engineering", "text_t","These guys develop stuff"))); assertU(add(doc("id", "2","name_s", "mark", "title_s", "VP", "dept_ss_dv","Marketing", "text_t","These guys make you look good"))); assertU(add(doc("id", "3","name_s", "nancy", "title_s", "MTS", "dept_ss_dv","Sales", "text_t","These guys sell stuff"))); assertU(add(doc("id", "4","name_s", "dave", "title_s", "MTS", "dept_ss_dv","Support", "dept_ss_dv","Engineering" , "text_t","These guys help customers"))); assertU(add(doc("id", "5","name_s", "tina", "title_s", "VP", "dept_ss_dv","Engineering", "text_t","These guys develop stuff"))); assertU(commit()); update(fromCore, add(doc("id","10", "dept_id_s", "Engineering", "text_t","These guys develop stuff", "salary_i_dv", "1000"))); update(fromCore, add(doc("id","11", "dept_id_s", "Marketing", "text_t","These guys make you look good","salary_i_dv", "1500"))); update(fromCore, add(doc("id","12", "dept_id_s", "Sales", "text_t","These guys sell stuff","salary_i_dv", "1600"))); update(fromCore, add(doc("id","13", "dept_id_s", "Support", "text_t","These guys help customers","salary_i_dv", "800"))); update(fromCore, commit()); } public static String update(SolrCore core, String xml) throws Exception { DirectSolrConnection connection = new DirectSolrConnection(core); SolrRequestHandler handler = core.getRequestHandler("/update"); return connection.request(handler, null, xml); } @Test public void testSameCoreSingleField() throws Exception { assertQ("subq1.fl is limited to single field", req("q","name_s:john", "fl","*,depts:[subquery fromIndex=fromCore]", "depts.q","{!term f=dept_id_s v=$row.dept_ss_dv}", "depts.fl","text_t"), "//result/doc/str[@name='name_s_dv'][.='john']/../result[@name='depts']/doc/str[@name='text_t'][.='These guys develop stuff']", "count(//result/doc/str[@name='name_s_dv'][.='john']/../result[@name='depts']/doc/*)=1");// only text_t } @Test public void testAbsentCore() throws Exception { assertQEx("from index not exist", req("q","name_s:dave", "fl","*,depts:[subquery fromIndex=fromCore2]", "depts.q","{!term f=dept_id_s v=$row.dept_ss_dv}", "depts.fl","text_t"), SolrException.ErrorCode.BAD_REQUEST ); } @Test public void testCrossCoreSubQueryTransformer() throws Exception { assertQ("make sure request is parsed in this core", req("q","name_s:john", "fl","*,depts:[subquery]", // text is tokenized and can be found, despite there is no substitution magic "depts.q","{!field f=text_t}These guys"), "//result/doc/str[@name='name_s_dv'][.='john']/../result[@name='depts']/doc" ); assertQ("make sure request is parsed in that core", req("q","name_s:john", "fl","*,depts:[subquery fromIndex=fromCore]", // text is NOT tokenized and can NOT be found "depts.q","{!field f=text_t}These guys"), "count(//result/doc/str[@name='name_s_dv'][.='john']/../result[@name='depts']/doc)=0" ); assertQ("make sure request is parsed in that core", req("q","-name_s:dave", "indent", "true", "fl","*,depts:[subquery fromIndex=fromCore]", // stored text (text_t is string in minimal configset) can be found as "depts.q","{!field f=text_t v=$row.text_t}", "depts.fl", "dept_id_s" ), "//result/doc/str[@name='name_s_dv'][.='john']/.." + "/result[@name='depts']/doc/str[@name='dept_id_s'][.='Engineering']", "//result/doc/str[@name='name_s_dv'][.='tina']/.." + "/result[@name='depts']/doc/str[@name='dept_id_s'][.='Engineering']", "//result/doc/str[@name='name_s_dv'][.='mark']/.." + "/result[@name='depts']/doc/str[@name='dept_id_s'][.='Marketing']" ); } @AfterClass public static void nukeAll() { fromCore = null; } }