blob: 051cad172f30de23bc1ea9ec07fc7895044a22f1 [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.update.processor;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import org.apache.solr.common.SolrInputDocument;
import org.junit.BeforeClass;
import org.junit.Test;
public class CloneFieldUpdateProcessorFactoryTest extends UpdateProcessorTestBase {
@BeforeClass
public static void beforeClass() throws Exception {
initCore("solrconfig-update-processor-chains.xml", "schema12.xml");
}
@Test
public void testSimpleClone() throws Exception {
SolrInputDocument doc = processAdd("clone-single",
doc(f("id", "1"),
f("source1_s", "foo")
));
assertEquals("source1_s should have stringValue", "foo", doc.getFieldValue("source1_s"));
assertEquals("dest_s should have stringValue", "foo", doc.getFieldValue("dest_s"));
}
@Test
public void testMultiClone() throws Exception {
SolrInputDocument doc = processAdd("clone-multi",
doc(f("id", "1"),
f("source1_s", "foo"),
f("source2_s", "bar")));
assertEquals("source1_s should have stringValue", "foo", doc.getFieldValue("source1_s"));
assertEquals("source2_s should have stringValue", "bar", doc.getFieldValue("source2_s"));
Collection<Object> dest_s = doc.getFieldValues("dest_s");
assertTrue(dest_s.contains("foo"));
assertTrue(dest_s.contains("bar"));
}
@Test
public void testArrayClone() throws Exception {
SolrInputDocument doc = processAdd("clone-array",
doc(f("id", "1"),
f("source1_s", "foo"),
f("source2_s", "bar")));
assertEquals("source1_s should have stringValue", "foo", doc.getFieldValue("source1_s"));
assertEquals("source2_s should have stringValue", "bar", doc.getFieldValue("source2_s"));
Collection<Object> dest_s = doc.getFieldValues("dest_s");
assertTrue(dest_s.contains("foo"));
assertTrue(dest_s.contains("bar"));
}
@Test
public void testSelectorClone() throws Exception {
SolrInputDocument doc = processAdd("clone-selector",
doc(f("id", "1"),
f("source0_s", "nope, not me"),
f("source1_s", "foo"),
f("source2_s", "bar")));
assertEquals("source0_s should have stringValue", "nope, not me", doc.getFieldValue("source0_s"));
assertEquals("source1_s should have stringValue", "foo", doc.getFieldValue("source1_s"));
assertEquals("source2_s should have stringValue", "bar", doc.getFieldValue("source2_s"));
Collection<Object> dest_s = doc.getFieldValues("dest_s");
assertTrue(dest_s.contains("foo"));
assertTrue(dest_s.contains("bar"));
assertFalse(dest_s.contains("nope, not me"));
}
public void testMultipleClones() throws Exception {
SolrInputDocument doc = processAdd("multiple-clones",
doc(f("id", "1"),
f("category", "test"),
f("authors", "author1", "author2"),
f("editors", "ed1", "ed2"),
f("bfriday_price", 4.00),
f("sale_price", 5.00),
f("list_price", 6.00),
f("features", "hill", "valley", "dune")));
// the original values should remain
assertEquals("category should have a value", "test", doc.getFieldValue("category"));
Collection<Object> auths = doc.getFieldValues("authors");
assertTrue(auths.size() == 2);
assertTrue(auths.contains("author1"));
assertTrue(auths.contains("author2"));
Collection<Object> eds = doc.getFieldValues("editors");
assertTrue(eds.size() == 2);
assertTrue(eds.contains("ed1"));
assertTrue(eds.contains("ed2"));
assertEquals("bfriday_price should have a value", 4.0, doc.getFieldValue("bfriday_price"));
assertEquals("sale_price should have a value", 5.0, doc.getFieldValue("sale_price"));
assertEquals("list_price should have a value", 6.0, doc.getFieldValue("list_price"));
Collection<Object> features = doc.getFieldValues("features");
assertTrue(features.size() == 3);
assertTrue(features.contains("hill"));
assertTrue(features.contains("valley"));
assertTrue(features.contains("dune"));
// and the copied values shoul be added
assertEquals("category_s should have a value", "test", doc.getFieldValue("category_s"));
Collection<Object> contribs = doc.getFieldValues("contributors");
assertTrue(contribs.size() == 4);
assertTrue(contribs.contains("author1"));
assertTrue(contribs.contains("author2"));
assertTrue(contribs.contains("ed1"));
assertTrue(contribs.contains("ed2"));
Collection<Object> prices = doc.getFieldValues("all_prices");
assertTrue(prices.size() == 2);
assertTrue(prices.contains(5.0));
assertTrue(prices.contains(4.0));
assertFalse(prices.contains(6.0));
// n.b. the field names below imply singularity but that would be achieved with a subsequent
// FirstFieldValueUpdateProcessorFactory (or similar custom class), and not in clone field itself
Collection<Object> keyf = doc.getFieldValues("key_feature");
assertTrue(keyf.size() == 3);
assertTrue(keyf.contains("hill"));
assertTrue(keyf.contains("valley"));
assertTrue(keyf.contains("dune"));
Collection<Object> bestf = doc.getFieldValues("best_feature");
assertTrue(bestf.size() == 3);
assertTrue(bestf.contains("hill"));
assertTrue(bestf.contains("valley"));
assertTrue(bestf.contains("dune"));
}
public void testCloneField() throws Exception {
SolrInputDocument d;
// regardless of chain, all of these checks should be equivalent
for (String chain : Arrays.asList("clone-single", "clone-single-regex",
"clone-multi", "clone-multi-regex",
"clone-array", "clone-array-regex",
"clone-selector", "clone-selector-regex")) {
// simple clone
d = processAdd(chain,
doc(f("id", "1111"),
f("source0_s", "NOT COPIED"),
f("source1_s", "123456789", "", 42, "abcd")));
assertNotNull(chain, d);
assertEquals(chain,
Arrays.asList("123456789", "", 42, "abcd"),
d.getFieldValues("source1_s"));
assertEquals(chain,
Arrays.asList("123456789", "", 42, "abcd"),
d.getFieldValues("dest_s"));
// append to existing values, preserve boost
d = processAdd(chain,
doc(f("id", "1111"),
field("dest_s", "orig1", "orig2"),
f("source0_s", "NOT COPIED"),
f("source1_s", "123456789", "", 42, "abcd")));
assertNotNull(chain, d);
assertEquals(chain,
Arrays.asList("123456789", "", 42, "abcd"),
d.getFieldValues("source1_s"));
assertEquals(chain,
Arrays.asList("orig1", "orig2", "123456789", "", 42, "abcd"),
d.getFieldValues("dest_s"));
}
// should be equivalent for any chain matching source1_s and source2_s (but not source0_s)
for (String chain : Arrays.asList("clone-multi", "clone-multi-regex",
"clone-array", "clone-array-regex",
"clone-selector", "clone-selector-regex")) {
// simple clone
d = processAdd(chain,
doc(f("id", "1111"),
f("source0_s", "NOT COPIED"),
f("source1_s", "123456789", "", 42, "abcd"),
f("source2_s", "xxx", 999)));
assertNotNull(chain, d);
assertEquals(chain,
Arrays.asList("123456789", "", 42, "abcd"),
d.getFieldValues("source1_s"));
assertEquals(chain,
Arrays.asList("xxx", 999),
d.getFieldValues("source2_s"));
assertEquals(chain,
Arrays.asList("123456789", "", 42, "abcd", "xxx", 999),
d.getFieldValues("dest_s"));
// append to existing values
d = processAdd(chain,
doc(f("id", "1111"),
field("dest_s", "orig1", "orig2"),
f("source0_s", "NOT COPIED"),
f("source1_s", "123456789", "", 42, "abcd"),
f("source2_s", "xxx", 999)));
assertNotNull(chain, d);
assertEquals(chain,
Arrays.asList("123456789", "", 42, "abcd"),
d.getFieldValues("source1_s"));
assertEquals(chain,
Arrays.asList("xxx", 999),
d.getFieldValues("source2_s"));
assertEquals(chain,
Arrays.asList("orig1", "orig2",
"123456789", "", 42, "abcd",
"xxx", 999),
d.getFieldValues("dest_s"));
}
// any chain that copies source1_s to dest_s should be equivalent for these assertions
for (String chain : Arrays.asList("clone-simple-regex-syntax",
"clone-single", "clone-single-regex",
"clone-multi", "clone-multi-regex",
"clone-array", "clone-array-regex",
"clone-selector", "clone-selector-regex")) {
// simple clone
d = processAdd(chain,
doc(f("id", "1111"),
f("source1_s", "123456789", "", 42, "abcd")));
assertNotNull(chain, d);
assertEquals(chain,
Arrays.asList("123456789", "", 42, "abcd"),
d.getFieldValues("source1_s"));
assertEquals(chain,
Arrays.asList("123456789", "", 42, "abcd"),
d.getFieldValues("dest_s"));
// append to existing values, preserve boost
d = processAdd(chain,
doc(f("id", "1111"),
field("dest_s", "orig1", "orig2"),
f("source1_s", "123456789", "", 42, "abcd")));
assertNotNull(chain, d);
assertEquals(chain,
Arrays.asList("123456789", "", 42, "abcd"),
d.getFieldValues("source1_s"));
assertEquals(chain,
Arrays.asList("orig1", "orig2", "123456789", "", 42, "abcd"),
d.getFieldValues("dest_s"));
}
}
public void testCloneFieldRegexReplaceAll() throws Exception {
SolrInputDocument d = processAdd("clone-regex-replaceall",
doc(f("id", "1111"),
f("foo_x2_s", "123456789", "", 42, "abcd"),
f("foo_x3_x7_s", "xyz")));
assertNotNull(d);
assertEquals(Arrays.asList("123456789", "", 42, "abcd"),
d.getFieldValues("foo_y2_s"));
assertEquals("xyz",
d.getFieldValue("foo_y3_y7_s"));
}
public void testCloneFieldExample() throws Exception {
SolrInputDocument d;
// test example from the javadocs
d = processAdd("multiple-clones",
doc(f("id", "1111"),
f("category", "misc"),
f("authors", "Isaac Asimov", "John Brunner"),
f("editors", "John W. Campbell"),
f("store1_price", 87),
f("store2_price", 78),
f("store3_price", (Object) null),
f("list_price", 1000),
f("features", "Pages!", "Binding!"),
f("feat_of_strengths", "Pullups")));
assertNotNull(d);
assertEquals("misc", d.getFieldValue("category"));
assertEquals("misc", d.getFieldValue("category_s"));
assertEquals(Arrays.asList("Isaac Asimov", "John Brunner"),
d.getFieldValues("authors"));
assertEquals(Collections.singletonList("John W. Campbell"),
d.getFieldValues("editors"));
assertEquals(Arrays.asList("Isaac Asimov", "John Brunner",
"John W. Campbell"),
d.getFieldValues("contributors"));
assertEquals(87, d.getFieldValue("store1_price"));
assertEquals(78, d.getFieldValue("store2_price"));
assertEquals(1000, d.getFieldValue("list_price"));
assertEquals(Arrays.asList(87, 78),
d.getFieldValues("all_prices"));
assertEquals(Arrays.asList("Pages!", "Binding!"),
d.getFieldValues("key_feature"));
assertEquals("Pullups", d.getFieldValue("key_feat_of_strength"));
}
public void testCloneCombinations() throws Exception {
SolrInputDocument d;
// maxChars
d = processAdd("clone-max-chars",
doc(f("id", "1111"),
f("field1", "text")));
assertNotNull(d);
assertEquals("text", d.getFieldValue("field1"));
assertEquals("tex", d.getFieldValue("toField"));
// move
d = processAdd("clone-move",
doc(f("id", "1111"),
f("field1", "text")));
assertNotNull(d);
assertEquals("text", d.getFieldValue("toField"));
assertFalse(d.containsKey("field1"));
// replace
d = processAdd("clone-replace",
doc(f("id", "1111"),
f("toField", "IGNORED"),
f("field1", "text")));
assertNotNull(d);
assertEquals("text", d.getFieldValue("field1"));
assertEquals("text", d.getFieldValue("toField"));
// append
d = processAdd("clone-append",
doc(f("id", "1111"),
f("toField", "aaa"),
f("field1", "bbb"),
f("field2", "ccc")));
assertNotNull(d);
assertEquals("bbb", d.getFieldValue("field1"));
assertEquals("ccc", d.getFieldValue("field2"));
assertEquals("aaa; bbb; ccc", d.getFieldValue("toField"));
// first value
d = processAdd("clone-first",
doc(f("id", "1111"),
f("field0", "aaa"),
f("field1", "bbb"),
f("field2", "ccc")));
assertNotNull(d);
assertEquals("aaa", d.getFieldValue("toField"));
}
}