blob: 6ef47cc9f6a5c510c3a201603972bba3de8be73a [file] [log] [blame]
/*
* 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.schema;
import java.util.HashMap;
import java.util.Map;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.MapSolrParams;
import org.apache.solr.core.SolrCore;
import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.request.SolrQueryRequest;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* This is a simple test to make sure the <code>CopyField</code> works.
* It uses its own special schema file.
*
* @since solr 1.4
*/
public class CopyFieldTest extends SolrTestCaseJ4 {
@BeforeClass
public static void beforeClass() throws Exception {
initCore("solrconfig.xml","schema-copyfield-test.xml");
}
@Test
public void testCopyFieldSchemaFieldSchemaField() {
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> {
new CopyField(new SchemaField("source", new TextField()), null);
});
assertTrue(e.getLocalizedMessage().contains("can't be NULL"));
e = expectThrows(IllegalArgumentException.class, () -> {
new CopyField(null, new SchemaField("destination", new TextField()));
});
assertTrue(e.getLocalizedMessage().contains("can't be NULL"));
e = expectThrows(IllegalArgumentException.class, () -> {
new CopyField(null, null);
});
assertTrue(e.getLocalizedMessage().contains("can't be NULL"));
}
@Test
public void testCopyFieldSchemaFieldSchemaFieldInt() {
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> {
new CopyField(null, new SchemaField("destination", new TextField()), 1000);
});
assertTrue(e.getLocalizedMessage().contains("can't be NULL"));
e = expectThrows(IllegalArgumentException.class, () -> {
new CopyField(new SchemaField("source", new TextField()), null, 1000);
});
assertTrue(e.getLocalizedMessage().contains("can't be NULL"));
e = expectThrows(IllegalArgumentException.class, () -> {
new CopyField(null, null, 1000);
});
assertTrue(e.getLocalizedMessage().contains("can't be NULL"));
e = expectThrows(IllegalArgumentException.class, () -> {
new CopyField(new SchemaField("source", new TextField()),
new SchemaField("destination", new TextField()), -1000);
});
assertTrue(e.getLocalizedMessage().contains("can't have a negative value"));
new CopyField(new SchemaField("source", new TextField()),
new SchemaField("destination", new TextField()), CopyField.UNLIMITED);
}
@Test
public void testGetSource() {
final CopyField copyField = new CopyField(new SchemaField("source",
new TextField()), new SchemaField("destination",
new TextField()), 1000);
assertEquals("source", copyField.getSource().name);
}
@Test
public void testGetDestination() {
final CopyField copyField = new CopyField(new SchemaField("source",
new TextField()), new SchemaField("destination",
new TextField()), 1000);
assertEquals("destination", copyField.getDestination().name);
}
@Test
public void testGetMaxChars() {
final CopyField copyField = new CopyField(new SchemaField("source",
new TextField()), new SchemaField("destination",
new TextField()), 1000);
assertEquals(1000, copyField.getMaxChars());
}
@Test
public void testCopyFieldFunctionality()
{
SolrCore core = h.getCore();
assertU(adoc("id", "5", "title", "test copy field", "text_en", "this is a simple test of the copy field functionality"));
assertU(commit());
Map<String,String> args = new HashMap<>();
args.put( CommonParams.Q, "text_en:simple" );
args.put( "indent", "true" );
SolrQueryRequest req = new LocalSolrQueryRequest( core, new MapSolrParams( args) );
assertQ("Make sure they got in", req
,"//*[@numFound='1']"
,"//result/doc[1]/str[@name='id'][.='5']"
);
args = new HashMap<>();
args.put( CommonParams.Q, "highlight:simple" );
args.put( "indent", "true" );
req = new LocalSolrQueryRequest( core, new MapSolrParams( args) );
assertQ("dynamic source", req
,"//*[@numFound='1']"
,"//result/doc[1]/str[@name='id'][.='5']"
,"//result/doc[1]/arr[@name='highlight']/str[.='this is a simple test of ']"
);
args = new HashMap<>();
args.put( CommonParams.Q, "text_en:functionality" );
args.put( "indent", "true" );
req = new LocalSolrQueryRequest( core, new MapSolrParams( args) );
assertQ("Make sure they got in", req
,"//*[@numFound='1']");
args = new HashMap<>();
args.put( CommonParams.Q, "highlight:functionality" );
args.put( "indent", "true" );
req = new LocalSolrQueryRequest( core, new MapSolrParams( args) );
assertQ("dynamic source", req
,"//*[@numFound='0']");
}
@Test
public void testExplicitSourceGlob()
{
SolrCore core = h.getCore();
IndexSchema schema = core.getLatestSchema();
assertTrue("schema should contain explicit field 'sku1'", schema.getFields().containsKey("sku1"));
assertTrue("schema should contain explicit field 'sku2'", schema.getFields().containsKey("sku2"));
assertNull("'sku*' should not be (or match) a dynamic field", schema.getDynamicPattern("sku*"));
assertTrue("schema should contain dynamic field '*_s'", schema.getDynamicPattern("*_s").equals("*_s"));
final String subsetPattern = "*_dest_sub_s";
final String dynamicPattern1 = schema.getDynamicPattern(subsetPattern);
assertTrue("'" + subsetPattern + "' should match dynamic field '*_s', but instead matches '" + dynamicPattern1 + "'",
dynamicPattern1.equals("*_s"));
final String dest_sub_no_ast_s = "dest_sub_no_ast_s";
assertFalse(schema.getFields().containsKey(dest_sub_no_ast_s)); // Should not be an explicit field
final String dynamicPattern2 = schema.getDynamicPattern(dest_sub_no_ast_s);
assertTrue("'" + dest_sub_no_ast_s + "' should match dynamic field '*_s', but instead matches '" + dynamicPattern2 + "'",
dynamicPattern2.equals("*_s"));
assertU(adoc("id", "5", "sku1", "10-1839ACX-93", "sku2", "AAM46"));
assertU(commit());
Map<String,String> args = new HashMap<>();
args.put( CommonParams.Q, "text:AAM46" );
args.put( "indent", "true" );
SolrQueryRequest req = new LocalSolrQueryRequest( core, new MapSolrParams( args) );
assertQ("sku2 copied to text", req
,"//*[@numFound='1']"
,"//result/doc[1]/str[@name='id'][.='5']"
);
args = new HashMap<>();
args.put( CommonParams.Q, "1_s:10-1839ACX-93" );
args.put( "indent", "true" );
req = new LocalSolrQueryRequest( core, new MapSolrParams( args) );
assertQ("sku1 copied to dynamic dest *_s", req
,"//*[@numFound='1']"
,"//result/doc[1]/str[@name='id'][.='5']"
,"//result/doc[1]/arr[@name='sku1']/str[.='10-1839ACX-93']"
);
args = new HashMap<>();
args.put( CommonParams.Q, "1_dest_sub_s:10-1839ACX-93" );
args.put( "indent", "true" );
req = new LocalSolrQueryRequest( core, new MapSolrParams( args) );
assertQ("sku1 copied to *_dest_sub_s (*_s subset pattern)", req
,"//*[@numFound='1']");
args = new HashMap<>();
args.put( CommonParams.Q, "dest_sub_no_ast_s:AAM46" );
args.put( "indent", "true" );
req = new LocalSolrQueryRequest( core, new MapSolrParams( args) );
assertQ("sku2 copied to dest_sub_no_ast_s (*_s subset pattern no asterisk)", req
,"//*[@numFound='1']");
}
@Test
public void testSourceGlobMatchesNoDynamicOrExplicitField()
{
// SOLR-4650: copyField source globs should not have to match an explicit or dynamic field
SolrCore core = h.getCore();
IndexSchema schema = core.getLatestSchema();
assertNull("'testing123_*' should not be (or match) a dynamic or explicit field", schema.getFieldOrNull("testing123_*"));
assertTrue("schema should contain dynamic field '*_s'", schema.getDynamicPattern("*_s").equals("*_s"));
assertU(adoc("id", "5", "sku1", "10-1839ACX-93", "testing123_s", "AAM46"));
assertU(commit());
Map<String,String> args = new HashMap<>();
args.put( CommonParams.Q, "text:AAM46" );
args.put( "indent", "true" );
SolrQueryRequest req = new LocalSolrQueryRequest( core, new MapSolrParams( args) );
assertQ("sku2 copied to text", req
,"//*[@numFound='1']"
,"//result/doc[1]/str[@name='id'][.='5']"
);
}
public void testCatchAllCopyField() {
IndexSchema schema = h.getCore().getLatestSchema();
assertNull("'*' should not be (or match) a dynamic field",
schema.getDynamicPattern("*"));
assertU(adoc("id", "5", "sku1", "10-1839ACX-93", "testing123_s", "AAM46"));
assertU(commit());
for (String q : new String[] {"5", "10-1839ACX-93", "AAM46" }) {
assertQ(req("q","catchall_t:" + q)
,"//*[@numFound='1']"
,"//result/doc[1]/str[@name='id'][.='5']");
}
}
}