package org.apache.solr.search.xjoin;
/*
* 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 static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.lucene.search.Query;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.core.SolrCore;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.search.DocIterator;
import org.apache.solr.search.DocSet;
import org.apache.solr.search.QParser;
import org.apache.solr.search.QParserPlugin;
import org.apache.solr.search.QueryParsing;
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.search.SyntaxError;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestXJoinQParserPlugin extends AbstractXJoinTestCase {
static final String COMPONENT_NAME_0 = "xjoin0";
static final String COMPONENT_NAME = "xjoin";
static final String COMPONENT_NAME_2 = "xjoin2";
static final String COMPONENT_NAME_3 = "xjoin3";
static final String COMPONENT_NAME_4 = "xjoin4";
static final String PARSER_NAME = "xjoin";
static SolrCore core;
static SolrQueryRequest req;
static SolrIndexSearcher searcher;
private static void initComponent(SolrCore core, Map<Object, Object> context, String componentName) throws IOException {
XJoinSearchComponent xjsc = (XJoinSearchComponent)core.getSearchComponent(componentName);
DummyXJoinResultsFactory xjrf = (DummyXJoinResultsFactory)xjsc.getResultsFactory();
XJoinResults<?> results = xjrf.getResults(null);
context.put(xjsc.getResultsTag(), results);
}
private static Query parse(String v) throws SyntaxError {
ModifiableSolrParams localParams = new ModifiableSolrParams();
localParams.add(QueryParsing.V, v);
QParserPlugin qpp = core.getQueryPlugin(PARSER_NAME);
QParser qp = qpp.createParser(null, localParams, null, req);
return qp.parse();
}
@BeforeClass
public static void initialise() throws Exception {
core = h.getCore();
// set up mock SOLR query request
req = mock(SolrQueryRequest.class);
Map<Object, Object> context = new HashMap<>();
when(req.getContext()).thenReturn(context);
when(req.getCore()).thenReturn(core);
when(req.getSchema()).thenReturn(core.getLatestSchema());
// put results for XJoin components in request context
initComponent(core, context, COMPONENT_NAME_0);
initComponent(core, context, COMPONENT_NAME);
initComponent(core, context, COMPONENT_NAME_2);
initComponent(core, context, COMPONENT_NAME_3);
initComponent(core, context, COMPONENT_NAME_4);
// get a search, used by some tests
searcher = core.getRegisteredSearcher().get();
}
@AfterClass
public static void destroy() throws Exception {
searcher.close();
}
@Test
public void testSingleComponent() throws Exception {
Query q = parse(COMPONENT_NAME);
DocSet docs = searcher.getDocSet(q);
assertEquals(2, docs.size());
DocIterator it = docs.iterator();
assertTrue(it.hasNext());
assertEquals(1, it.nextDoc());
assertTrue(it.hasNext());
assertEquals(3, it.nextDoc());
assertFalse(it.hasNext());
}
@Test
public void testBooleanCombination() throws Exception {
Query q = parse(COMPONENT_NAME + " AND " + COMPONENT_NAME_2);
DocSet docs = searcher.getDocSet(q);
assertEquals(1, docs.size());
DocIterator it = docs.iterator();
assertTrue(it.hasNext());
assertEquals(3, it.nextDoc());
assertFalse(it.hasNext());
}
@Test(expected=XJoinQParserPlugin.Exception.class)
public void testConflictingJoinFields() throws Exception {
parse(COMPONENT_NAME + " OR " + COMPONENT_NAME_3);
}
@Test
public void testNoResults() throws Exception {
Query q = parse(COMPONENT_NAME_0);
DocSet docs = searcher.getDocSet(q);
assertEquals(0, docs.size());
}
@Test
public void testMultiValued() throws Exception {
Query q = parse(COMPONENT_NAME_4);
DocSet docs = searcher.getDocSet(q);
assertEquals(4, docs.size());
DocIterator it = docs.iterator();
assertTrue(it.hasNext());
assertEquals(0, it.nextDoc());
assertTrue(it.hasNext());
assertEquals(1, it.nextDoc());
assertTrue(it.hasNext());
assertEquals(2, it.nextDoc());
assertTrue(it.hasNext());
assertEquals(3, it.nextDoc());
assertFalse(it.hasNext());
}
}