/* * 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")); } }