/* * Copyright 2012-2017 the original author or authors. * * Licensed 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.springframework.data.solr.core.convert; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.solr.client.solrj.beans.Field; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.SolrInputField; import org.hamcrest.Matchers; import org.hamcrest.collection.IsArrayContainingInAnyOrder; import org.hamcrest.collection.IsCollectionWithSize; import org.hamcrest.collection.IsEmptyCollection; import org.hamcrest.collection.IsMapContaining; import org.hamcrest.core.IsEqual; import org.hamcrest.core.IsInstanceOf; import org.hamcrest.core.IsNull; import org.joda.time.DateTime; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.data.geo.Point; import org.springframework.data.solr.core.mapping.Dynamic; import org.springframework.data.solr.core.mapping.Indexed; import org.springframework.data.solr.core.mapping.SimpleSolrMappingContext; import org.springframework.data.solr.core.query.PartialUpdate; /** * @author Christoph Strobl * @author Francisco Spaeth */ public class MappingSolrConverterTests { private MappingSolrConverter converter; private SimpleSolrMappingContext mappingContext; @Before public void setUp() { mappingContext = new SimpleSolrMappingContext(); converter = new MappingSolrConverter(mappingContext); converter.afterPropertiesSet(); } @SuppressWarnings("rawtypes") @Test public void testWrite() { BeanWithDefaultTypes bean = new BeanWithDefaultTypes(); bean.stringProperty = "j73x73r"; bean.intProperty = 1979; bean.listOfString = Arrays.asList("one", "two", "three"); bean.arrayOfString = new String[] { "three", "two", "one" }; bean.dateProperty = new Date(60264684000000L); SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertEquals(bean.stringProperty, solrDocument.getFieldValue("stringProperty")); Assert.assertEquals(bean.intProperty, solrDocument.getFieldValue("intProperty")); Assert.assertThat(solrDocument.getFieldValues("listOfString"), IsEqual.equalTo((Collection) bean.listOfString)); Assert.assertThat(solrDocument.getFieldValues("arrayOfString"), IsEqual.equalTo((Collection) Arrays.asList(bean.arrayOfString))); Assert.assertEquals(bean.dateProperty, solrDocument.getFieldValue("dateProperty")); } @Test public void testWriteWithCustomType() { BeanWithCustomTypes bean = new BeanWithCustomTypes(); bean.location = new Point(48.362893D, 14.534437D); SolrInputDocument document = new SolrInputDocument(); converter.write(bean, document); Assert.assertEquals("48.362893,14.534437", document.getFieldValue("location")); } @Test public void testWriteWithCustomTypeList() { BeanWithCustomTypes bean = new BeanWithCustomTypes(); bean.locations = Arrays.asList(new Point(48.362893D, 14.534437D), new Point(48.208602D, 16.372996D)); SolrInputDocument document = new SolrInputDocument(); converter.write(bean, document); Assert.assertEquals(Arrays.asList("48.362893,14.534437", "48.208602,16.372996"), document.getFieldValues("locations")); } @Test public void testWriteWithNamedProperty() { BeanWithNamedFields bean = new BeanWithNamedFields(); bean.name = "j73x73r(at)gmail(dot)com"; SolrInputDocument document = new SolrInputDocument(); converter.write(bean, document); Assert.assertEquals(bean.name, document.getFieldValue("namedProperty")); } @Test public void testWriteWithSimpleTypes() { BeanWithSimpleTypes bean = new BeanWithSimpleTypes(); bean.simpleBoolProperty = true; bean.simpleFloatProperty = 10f; bean.simpleIntProperty = 3; SolrInputDocument document = new SolrInputDocument(); converter.write(bean, document); Assert.assertEquals(bean.simpleBoolProperty, document.getFieldValue("simpleBoolProperty")); Assert.assertEquals(bean.simpleFloatProperty, document.getFieldValue("simpleFloatProperty")); Assert.assertEquals(bean.simpleIntProperty, document.getFieldValue("simpleIntProperty")); } @Test public void testWriteWithNulls() { BeanWithDefaultTypes bean = new BeanWithDefaultTypes(); bean.stringProperty = null; bean.intProperty = null; bean.listOfString = null; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertNull(solrDocument.getFieldValue("stringProperty")); Assert.assertNull(solrDocument.getFieldValue("intProperty")); Assert.assertNull(solrDocument.getFieldValues("listOfString")); } @Test public void testWriteWithoutFieldAnnotation() { BeanWithoutAnnotatedFields bean = new BeanWithoutAnnotatedFields(); bean.notIndexedProperty = "!do not index!"; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertNull(solrDocument.getFieldValue("notIndexedProperty")); } @Test public void testWriteWithFieldsExcludedFromIndexing() { BeanWithFieldsExcludedFromIndexing bean = new BeanWithFieldsExcludedFromIndexing(); bean.transientField = "must not be indexed"; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertNull(solrDocument.getFieldValue("transientField")); } @Test public void testWriteMappedProperty() { Map<String, String> values = new HashMap<>(2); values.put("key_1", "value_1"); values.put("key_2", "value_2"); BeanWithWildcards bean = new BeanWithWildcards(); bean.flatMapWithLeadingWildcard = values; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertEquals(values.get("key_1"), solrDocument.getFieldValue("key_1")); Assert.assertEquals(values.get("key_2"), solrDocument.getFieldValue("key_2")); } @Test public void testWriteMappedListProperty() { Map<String, List<String>> values = new HashMap<>(2); values.put("key_1", Collections.singletonList("value_1")); values.put("key_2", Arrays.asList("value_2", "value_3")); BeanWithWildcards bean = new BeanWithWildcards(); bean.multivaluedFieldMapWithLeadingWildcardList = values; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertEquals(values.get("key_1"), solrDocument.getFieldValues("key_1")); Assert.assertEquals(values.get("key_2"), solrDocument.getFieldValues("key_2")); } @Test public void testWriteMappedArrayProperty() { Map<String, String[]> values = new HashMap<>(2); values.put("key_1", new String[] { "value_1" }); values.put("key_2", new String[] { "value_2", "value_3" }); BeanWithWildcards bean = new BeanWithWildcards(); bean.multivaluedFieldMapWithLeadingWildcardArray = values; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertEquals(Arrays.asList(values.get("key_1")), solrDocument.getFieldValues("key_1")); Assert.assertEquals(Arrays.asList(values.get("key_2")), solrDocument.getFieldValues("key_2")); } @Test(expected = IllegalArgumentException.class) public void testWriteSingeValuedFieldWithLeadingWildcard() { BeanWithWildcards bean = new BeanWithWildcards(); bean.fieldWithLeadingWildcard = "leading_1"; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); } @Test(expected = IllegalArgumentException.class) public void testWriteSingeValuedFieldWithTrailingWildcard() { BeanWithWildcards bean = new BeanWithWildcards(); bean.filedWithTrailingWildcard = "trailing_1"; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); } @Test(expected = IllegalArgumentException.class) public void testWriteListWithLeadingWildcard() { BeanWithWildcards bean = new BeanWithWildcards(); bean.listFieldWithLeadingWildcard = Collections.singletonList("leading_1"); SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); } @Test(expected = IllegalArgumentException.class) public void testWriteArrayWithLeadingWildcard() { BeanWithWildcards bean = new BeanWithWildcards(); bean.arrayFieldWithLeadingWildcard = new String[] { "leading_1" }; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); } @Test(expected = IllegalArgumentException.class) public void testWriteListWithTrailingWildcard() { BeanWithWildcards bean = new BeanWithWildcards(); bean.listFieldWithTrailingWildcard = Collections.singletonList("trailing_1"); SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); } @Test(expected = IllegalArgumentException.class) public void testWriteArrayWithTailingWildcard() { BeanWithWildcards bean = new BeanWithWildcards(); bean.arrayFieldWithTrailingWildcard = new String[] { "trailing_1" }; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); } @Test(expected = IllegalArgumentException.class) public void testWriteListWithWildcard() { BeanWithWildcards bean = new BeanWithWildcards(); bean.listFieldWithLeadingWildcard = Collections.singletonList("leading_1"); bean.arrayFieldWithLeadingWildcard = new String[] { "leading_2" }; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); } @Test public void testWriteNonMapPropertyWithWildcardWhenNotIndexed() { BeanWithCatchAllField bean = new BeanWithCatchAllField(); bean.allStringProperties = new String[] { "value_1", "value_2" }; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertTrue(solrDocument.isEmpty()); } @Test public void testWriteWithFieldAnnotationOnSetter() { BeanWithFieldAnnotationOnSetter bean = new BeanWithFieldAnnotationOnSetter(); bean.name = "value_1"; bean.namedField = "value_2"; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertEquals(bean.name, solrDocument.getFieldValue("name")); Assert.assertEquals(bean.namedField, solrDocument.getFieldValue("namedFieldFieldName")); } @SuppressWarnings("unchecked") @Test public void testWriteUpdate() { PartialUpdate update = new PartialUpdate("id", "123"); update.add("language", "java"); update.add("since", 1995); SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(update, solrDocument); Assert.assertEquals(update.getIdField().getValue(), solrDocument.getFieldValue(update.getIdField().getName())); Assert.assertTrue(solrDocument.getFieldValue("since") instanceof Map); Assert.assertEquals(1995, ((Map<String, Object>) solrDocument.getFieldValue("since")).get("set")); } @Test public void testWriteNullToSolrInputDocumentColletion() { Collection<?> result = converter.write((Iterable<?>) null); Assert.assertNotNull(result); Assert.assertThat(result, IsEmptyCollection.empty()); } @Test public void testWriteEmptyCollectionToSolrInputDocumentColletion() { Collection<?> result = converter.write(new ArrayList<>()); Assert.assertNotNull(result); Assert.assertThat(result, IsEmptyCollection.empty()); } @Test public void testWriteCollectionToSolrInputDocumentColletion() { BeanWithDefaultTypes bean1 = new BeanWithDefaultTypes(); bean1.stringProperty = "solr"; BeanWithDefaultTypes bean2 = new BeanWithDefaultTypes(); bean2.intProperty = 10; Collection<SolrInputDocument> result = converter.write(Arrays.asList(bean1, bean2)); Assert.assertNotNull(result); Assert.assertThat(result, IsCollectionWithSize.hasSize(2)); } @Test public void testWriteBeanWithInheritance() { BeanWithInteritance bean = new BeanWithInteritance(); bean.stringProperty = "some string"; bean.intProperty = 10; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertEquals(bean.stringProperty, solrDocument.getFieldValue("stringProperty")); Assert.assertEquals(bean.intProperty, solrDocument.getFieldValue("intProperty")); } @Test public void testRead() { SolrDocument document = new SolrDocument(); document.addField("stringProperty", "christoph"); document.addField("intProperty", 32); document.addField("listOfString", Arrays.asList("one", "two", "three")); document.addField("arrayOfString", new String[] { "spring", "data", "solr" }); document.addField("dateProperty", new Date(60264684000000L)); BeanWithDefaultTypes target = converter.read(BeanWithDefaultTypes.class, document); Assert.assertEquals(document.getFieldValue("stringProperty"), target.stringProperty); Assert.assertEquals(document.getFieldValue("intProperty"), target.intProperty); Assert.assertThat(target.listOfString, IsEqual.equalTo(document.getFieldValue("listOfString"))); Assert.assertArrayEquals(document.getFieldValues("arrayOfString").toArray(), target.arrayOfString); Assert.assertEquals(document.getFieldValue("dateProperty"), target.dateProperty); } @Test public void testReadSingleValuedArray() { SolrDocument document = new SolrDocument(); document.setField("arrayOfString", "christoph"); BeanWithDefaultTypes target = converter.read(BeanWithDefaultTypes.class, document); Assert.assertArrayEquals(document.getFieldValues("arrayOfString").toArray(), target.arrayOfString); } @Test public void testReadWithCustomTypes() { SolrDocument document = new SolrDocument(); document.addField("location", "48.362893,14.534437"); document.addField("locations", Arrays.asList("48.362893,14.534437", "13.923404,142.177731")); BeanWithCustomTypes target = converter.read(BeanWithCustomTypes.class, document); Assert.assertEquals(48.362893D, target.location.getX(), 0.0f); Assert.assertEquals(14.534437D, target.location.getY(), 0.0f); Assert.assertEquals(48.362893D, target.locations.get(0).getX(), 0.0f); Assert.assertEquals(14.534437D, target.locations.get(0).getY(), 0.0f); Assert.assertEquals(13.923404D, target.locations.get(1).getX(), 0.0f); Assert.assertEquals(142.177731D, target.locations.get(1).getY(), 0.0f); } @Test public void testReadWithNamedProperty() { SolrDocument document = new SolrDocument(); document.addField("namedProperty", "strobl"); BeanWithNamedFields target = converter.read(BeanWithNamedFields.class, document); Assert.assertEquals(document.getFieldValue("namedProperty"), target.name); } @Test public void testReadWithSimpleTypes() { SolrDocument document = new SolrDocument(); document.addField("simpleIntProperty", 1); document.addField("simpleBoolProperty", true); document.addField("simpleFloatProperty", 10f); BeanWithSimpleTypes target = converter.read(BeanWithSimpleTypes.class, document); Assert.assertEquals(document.getFieldValue("simpleIntProperty"), target.simpleIntProperty); Assert.assertEquals(document.getFieldValue("simpleBoolProperty"), target.simpleBoolProperty); Assert.assertEquals(document.getFieldValue("simpleFloatProperty"), target.simpleFloatProperty); } @Test public void testReadWithNullFields() { SolrDocument document = new SolrDocument(); document.addField("stringProperty", null); document.addField("intProperty", null); document.addField("listOfString", null); document.addField("arrayOfString", null); document.addField("date", null); BeanWithDefaultTypes target = converter.read(BeanWithDefaultTypes.class, document); Assert.assertNull(target.stringProperty); Assert.assertNull(target.intProperty); Assert.assertNull(target.listOfString); Assert.assertNull(target.arrayOfString); Assert.assertNull(target.dateProperty); } @Test public void testReadWithPropertiesNotInDocument() { SolrDocument document = new SolrDocument(); document.addField("stringProperty", null); BeanWithDefaultTypes target = converter.read(BeanWithDefaultTypes.class, document); Assert.assertEquals(document.getFieldValue("stringProperty"), target.stringProperty); Assert.assertNull(target.intProperty); Assert.assertNull(target.listOfString); } @Test public void testReadToFieldExcludedFromIndexing() { SolrDocument document = new SolrDocument(); document.addField("transientField", "value computed on solr server"); BeanWithFieldsExcludedFromIndexing target = converter.read(BeanWithFieldsExcludedFromIndexing.class, document); Assert.assertEquals(document.getFieldValue("transientField"), target.transientField); } @Test public void testReadWithTargetConstructorCall() { SolrDocument document = new SolrDocument(); document.addField("stringProperty", null); document.addField("intProperty", null); BeanWithDefaultTypes target = converter.read(BeanWithDefaultTypes.class, document); Assert.assertEquals(document.getFieldValue("stringProperty"), target.stringProperty); Assert.assertEquals(document.getFieldValue("intProperty"), target.intProperty); } @Test public void testReadWithCatchAllField() { SolrDocument document = new SolrDocument(); document.addField("stringProperty_ci", "case-insensitive-string"); document.addField("stringProperty_multi", new String[] { "first", "second", "third" }); BeanWithCatchAllField target = converter.read(BeanWithCatchAllField.class, document); Assert.assertEquals(4, target.allStringProperties.length); Assert.assertThat(target.allStringProperties, IsArrayContainingInAnyOrder.arrayContainingInAnyOrder("case-insensitive-string", "first", "second", "third")); } @Test public void testReadPropertyWithTrailingWildcard() { SolrDocument document = new SolrDocument(); document.addField("field_with_trailing_wildcard_ci", "trailing"); BeanWithWildcards target = converter.read(BeanWithWildcards.class, document); Assert.assertEquals("trailing", target.filedWithTrailingWildcard); } @Test public void testReadPropertyWithTrailingWildcardToCollection() { SolrDocument document = new SolrDocument(); document.addField("listFieldWithTrailingWildcard_1", "trailing_1"); document.addField("listFieldWithTrailingWildcard_2", "trailing_2"); BeanWithWildcards target = converter.read(BeanWithWildcards.class, document); Assert.assertEquals(Arrays.asList("trailing_1", "trailing_2"), target.listFieldWithTrailingWildcard); } @Test public void testReadPropertyWithTrailingWildcardToArray() { SolrDocument document = new SolrDocument(); document.addField("arrayFieldWithTrailingWildcard_1", "trailing_1"); document.addField("arrayFieldWithTrailingWildcard_2", "trailing_2"); BeanWithWildcards target = converter.read(BeanWithWildcards.class, document); Assert.assertArrayEquals(new String[] { "trailing_1", "trailing_2" }, target.arrayFieldWithTrailingWildcard); } @Test public void testReadPropertyWithLeadingWildcard() { SolrDocument document = new SolrDocument(); document.addField("ci_field_with_leading_wildcard", "leading"); BeanWithWildcards target = converter.read(BeanWithWildcards.class, document); Assert.assertEquals("leading", target.fieldWithLeadingWildcard); } @Test public void testReadPropertyWithLeadingWildcardToCollection() { SolrDocument document = new SolrDocument(); document.addField("1_listFieldWithLeadingWildcard", "leading_1"); document.addField("2_listFieldWithLeadingWildcard", "leading_2"); BeanWithWildcards target = converter.read(BeanWithWildcards.class, document); Assert.assertEquals(Arrays.asList("leading_1", "leading_2"), target.listFieldWithLeadingWildcard); } @Test public void testReadPropertyWithLeadingWildcardToArray() { SolrDocument document = new SolrDocument(); document.addField("1_arrayFieldWithTrailingWildcard", "leading_1"); document.addField("2_arrayFieldWithTrailingWildcard", "leading_2"); BeanWithWildcards target = converter.read(BeanWithWildcards.class, document); Assert.assertArrayEquals(new String[] { "leading_1", "leading_2" }, target.arrayFieldWithLeadingWildcard); } @Test public void testReadFieldWithLeadingWildcardToMap() { SolrDocument document = new SolrDocument(); document.addField("1_flatMapWithLeadingWildcard", "leading-map-value-1"); document.addField("2_flatMapWithLeadingWildcard", "leading-map-value-2"); BeanWithWildcards target = converter.read(BeanWithWildcards.class, document); Assert.assertEquals(2, target.flatMapWithLeadingWildcard.size()); Assert.assertThat(target.flatMapWithLeadingWildcard, Matchers.allOf(Matchers.hasEntry("1_flatMapWithLeadingWildcard", "leading-map-value-1"), Matchers.hasEntry("2_flatMapWithLeadingWildcard", "leading-map-value-2"))); } @Test(expected = IllegalArgumentException.class) public void testReadMultivaluedFieldWithLeadingWildcardToMapWithSingleEntry() { SolrDocument document = new SolrDocument(); document.addField("1_flatMapWithLeadingWildcard", Arrays.asList("leading-map-value-1", "leading-map-value-2")); converter.read(BeanWithWildcards.class, document); } @Test public void testReadFieldWithTrailingWildcardToMap() { SolrDocument document = new SolrDocument(); document.addField("flatMapWithTrailingWildcard_1", "trailing-map-value-1"); document.addField("flatMapWithTrailingWildcard_2", "trailing-map-value-2"); BeanWithWildcards target = converter.read(BeanWithWildcards.class, document); Assert.assertEquals(2, target.flatMapWithTrailingWildcard.size()); Assert.assertThat(target.flatMapWithTrailingWildcard, Matchers.allOf(Matchers.hasEntry("flatMapWithTrailingWildcard_1", "trailing-map-value-1"), Matchers.hasEntry("flatMapWithTrailingWildcard_2", "trailing-map-value-2"))); } @Test(expected = IllegalArgumentException.class) public void testReadMultivaluedFieldWithTrailingWildcardToMapWithSingleEntry() { SolrDocument document = new SolrDocument(); document.addField("flatMapWithTrailingWildcard_1", Arrays.asList("trailing-map-value-1", "trailing-map-value-2")); converter.read(BeanWithWildcards.class, document); } @Test public void testReadMultivaluedFieldWithLeadingWildcardToArrayInMap() { SolrDocument document = new SolrDocument(); document.addField("1_multivaluedFieldMapWithLeadingWildcard", "leading-map-value-1"); document.addField("2_multivaluedFieldMapWithLeadingWildcard", Arrays.asList("leading-map-value-2", "leading-map-value-3")); BeanWithWildcards target = converter.read(BeanWithWildcards.class, document); Assert.assertEquals(2, target.multivaluedFieldMapWithLeadingWildcardArray.size()); Assert.assertThat(target.multivaluedFieldMapWithLeadingWildcardArray, Matchers.allOf( Matchers.hasEntry("1_multivaluedFieldMapWithLeadingWildcard", new String[] { "leading-map-value-1" }), Matchers.hasEntry("2_multivaluedFieldMapWithLeadingWildcard", new String[] { "leading-map-value-2", "leading-map-value-3" }))); } @Test public void testReadMultivaluedFieldWithLeadingWildcardToListInMap() { SolrDocument document = new SolrDocument(); document.addField("1_multivaluedFieldMapWithLeadingWildcard", "leading-map-value-1"); document.addField("2_multivaluedFieldMapWithLeadingWildcard", Arrays.asList("leading-map-value-2", "leading-map-value-3")); BeanWithWildcards target = converter.read(BeanWithWildcards.class, document); Assert.assertEquals(2, target.multivaluedFieldMapWithLeadingWildcardList.size()); Assert.assertThat(target.multivaluedFieldMapWithLeadingWildcardList, Matchers.allOf( Matchers.hasEntry("1_multivaluedFieldMapWithLeadingWildcard", Collections.singletonList("leading-map-value-1")), Matchers.hasEntry("2_multivaluedFieldMapWithLeadingWildcard", Arrays.asList("leading-map-value-2", "leading-map-value-3")))); } @Test public void testReadMultivaluedFieldWithTrailingWildcardToArrayInMap() { SolrDocument document = new SolrDocument(); document.addField("multivaluedFieldMapWithTrailingWildcard_1", "trailing-map-value-1"); document.addField("multivaluedFieldMapWithTrailingWildcard_2", Arrays.asList("trailing-map-value-2", "trailing-map-value-3")); BeanWithWildcards target = converter.read(BeanWithWildcards.class, document); Assert.assertEquals(2, target.multivaluedFieldMapWithTrailingWildcardArray.size()); Assert.assertThat(target.multivaluedFieldMapWithTrailingWildcardArray, Matchers.allOf( Matchers.hasEntry("multivaluedFieldMapWithTrailingWildcard_1", new String[] { "trailing-map-value-1" }), Matchers.hasEntry("multivaluedFieldMapWithTrailingWildcard_2", new String[] { "trailing-map-value-2", "trailing-map-value-3" }))); } @Test public void testReadMultivaluedFieldWithTrailingWildcardToListInMap() { SolrDocument document = new SolrDocument(); document.addField("multivaluedFieldMapWithTrailingWildcard_1", "trailing-map-value-1"); document.addField("multivaluedFieldMapWithTrailingWildcard_2", Arrays.asList("trailing-map-value-2", "trailing-map-value-3")); BeanWithWildcards target = converter.read(BeanWithWildcards.class, document); Assert.assertEquals(2, target.multivaluedFieldMapWithTrailingWildcardArray.size()); Assert.assertThat(target.multivaluedFieldMapWithTrailingWildcardList, Matchers.allOf( Matchers.hasEntry("multivaluedFieldMapWithTrailingWildcard_1", Collections.singletonList("trailing-map-value-1")), Matchers.hasEntry("multivaluedFieldMapWithTrailingWildcard_2", Arrays.asList("trailing-map-value-2", "trailing-map-value-3")))); } @Test // DATASOLR-202 public void testWriteDynamicMappedPropertyWithLeadingWildcard() { Map<String, String> values = new HashMap<>(2); values.put("key_1", "value_1"); values.put("key_2", "value_2"); BeanWithDynamicMapsWildcards bean = new BeanWithDynamicMapsWildcards(); bean.flatMapWithLeadingWildcard = values; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertNotNull(solrDocument.getFieldValue("key_1_flatMapWithLeadingWildcard")); Assert.assertNotNull(solrDocument.getFieldValue("key_2_flatMapWithLeadingWildcard")); Assert.assertEquals(values.get("key_1"), solrDocument.getFieldValue("key_1_flatMapWithLeadingWildcard")); Assert.assertEquals(values.get("key_2"), solrDocument.getFieldValue("key_2_flatMapWithLeadingWildcard")); } @Test // DATASOLR-202 public void testWriteDynamicMappedListPropertyWithLeadingWildcard() { Map<String, List<String>> values = new HashMap<>(2); values.put("key_1", Collections.singletonList("value_1")); values.put("key_2", Arrays.asList("value_2", "value_3")); BeanWithDynamicMapsWildcards bean = new BeanWithDynamicMapsWildcards(); bean.multivaluedFieldMapWithLeadingWildcardList = values; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertNotNull(solrDocument.getFieldValue("key_1_multivaluedFieldMapWithLeadingWildcard")); Assert.assertNotNull(solrDocument.getFieldValue("key_2_multivaluedFieldMapWithLeadingWildcard")); Assert.assertEquals(values.get("key_1"), solrDocument.getFieldValues("key_1_multivaluedFieldMapWithLeadingWildcard")); Assert.assertEquals(values.get("key_2"), solrDocument.getFieldValues("key_2_multivaluedFieldMapWithLeadingWildcard")); } @Test // DATASOLR-202 public void testWriteDynamicMappedArrayPropertyWithLeadingWildcard() { Map<String, String[]> values = new HashMap<>(2); values.put("key_1", new String[] { "value_1" }); values.put("key_2", new String[] { "value_2", "value_3" }); BeanWithDynamicMapsWildcards bean = new BeanWithDynamicMapsWildcards(); bean.multivaluedFieldMapWithLeadingWildcardArray = values; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertNotNull(solrDocument.getFieldValue("key_1_multivaluedFieldMapWithLeadingWildcard")); Assert.assertNotNull(solrDocument.getFieldValue("key_2_multivaluedFieldMapWithLeadingWildcard")); Assert.assertEquals(Arrays.asList(values.get("key_1")), solrDocument.getFieldValues("key_1_multivaluedFieldMapWithLeadingWildcard")); Assert.assertEquals(Arrays.asList(values.get("key_2")), solrDocument.getFieldValues("key_2_multivaluedFieldMapWithLeadingWildcard")); } @Test // DATASOLR-308 public void testWriteDynamicMappedPropertyWithTrailingWildcard() { Map<String, String> values = new HashMap<>(2); values.put("key_1", "value_1"); values.put("key_2", "value_2"); BeanWithDynamicMapsWildcards bean = new BeanWithDynamicMapsWildcards(); bean.flatMapWithTrailingWildcard = values; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertNotNull(solrDocument.getFieldValue("flatMapWithTrailingWildcard_key_1")); Assert.assertNotNull(solrDocument.getFieldValue("flatMapWithTrailingWildcard_key_2")); Assert.assertEquals(values.get("key_1"), solrDocument.getFieldValue("flatMapWithTrailingWildcard_key_1")); Assert.assertEquals(values.get("key_2"), solrDocument.getFieldValue("flatMapWithTrailingWildcard_key_2")); } @Test // DATASOLR-308 public void testWriteDynamicMappedListPropertyWithTrailingWildcard() { Map<String, List<String>> values = new HashMap<>(2); values.put("key_1", Collections.singletonList("value_1")); values.put("key_2", Arrays.asList("value_2", "value_3")); BeanWithDynamicMapsWildcards bean = new BeanWithDynamicMapsWildcards(); bean.multivaluedFieldMapWithTrailingWildcardList = values; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertNotNull(solrDocument.getFieldValue("multivaluedFieldMapWithTrailingWildcard_key_1")); Assert.assertNotNull(solrDocument.getFieldValue("multivaluedFieldMapWithTrailingWildcard_key_2")); Assert.assertEquals(values.get("key_1"), solrDocument.getFieldValues("multivaluedFieldMapWithTrailingWildcard_key_1")); Assert.assertEquals(values.get("key_2"), solrDocument.getFieldValues("multivaluedFieldMapWithTrailingWildcard_key_2")); } @Test // DATASOLR-308 public void testWriteDynamicMappedArrayPropertyWithTrailingWildcard() { Map<String, String[]> values = new HashMap<>(2); values.put("key_1", new String[] { "value_1" }); values.put("key_2", new String[] { "value_2", "value_3" }); BeanWithDynamicMapsWildcards bean = new BeanWithDynamicMapsWildcards(); bean.multivaluedFieldMapWithTrailingWildcardArray = values; SolrInputDocument solrDocument = new SolrInputDocument(); converter.write(bean, solrDocument); Assert.assertNotNull(solrDocument.getFieldValue("multivaluedFieldMapWithTrailingWildcard_key_1")); Assert.assertNotNull(solrDocument.getFieldValue("multivaluedFieldMapWithTrailingWildcard_key_2")); Assert.assertEquals(Arrays.asList(values.get("key_1")), solrDocument.getFieldValues("multivaluedFieldMapWithTrailingWildcard_key_1")); Assert.assertEquals(Arrays.asList(values.get("key_2")), solrDocument.getFieldValues("multivaluedFieldMapWithTrailingWildcard_key_2")); } @Test // DATASOLR-202 public void testReadFieldWithLeadingWildcardToDynamicMap() { SolrDocument document = new SolrDocument(); document.addField("1_flatMapWithLeadingWildcard", "leading-map-value-1"); document.addField("2_flatMapWithLeadingWildcard", "leading-map-value-2"); BeanWithDynamicMapsWildcards target = converter.read(BeanWithDynamicMapsWildcards.class, document); Assert.assertEquals(2, target.flatMapWithLeadingWildcard.size()); Assert.assertThat(target.flatMapWithLeadingWildcard, Matchers.allOf(Matchers.hasEntry("1", "leading-map-value-1"), Matchers.hasEntry("2", "leading-map-value-2"))); } @Test(expected = IllegalArgumentException.class) // DATASOLR-202 public void testReadMultivaluedFieldWithLeadingWildcardToDynamicMapWithSingleEntry() { SolrDocument document = new SolrDocument(); document.addField("1_flatMapWithLeadingWildcard", Arrays.asList("leading-map-value-1", "leading-map-value-2")); converter.read(BeanWithDynamicMapsWildcards.class, document); } @Test // DATASOLR-202 public void testReadFieldWithTrailingWildcardToDynamicMap() { SolrDocument document = new SolrDocument(); document.addField("flatMapWithTrailingWildcard_1", "trailing-map-value-1"); document.addField("flatMapWithTrailingWildcard_2", "trailing-map-value-2"); BeanWithDynamicMapsWildcards target = converter.read(BeanWithDynamicMapsWildcards.class, document); Assert.assertEquals(2, target.flatMapWithTrailingWildcard.size()); Assert.assertThat(target.flatMapWithTrailingWildcard, Matchers.allOf(Matchers.hasEntry("1", "trailing-map-value-1"), Matchers.hasEntry("2", "trailing-map-value-2"))); } @Test(expected = IllegalArgumentException.class) // DATASOLR-202 public void testReadMultivaluedFieldWithTrailingWildcardToDynamicMapWithSingleEntry() { SolrDocument document = new SolrDocument(); document.addField("flatMapWithTrailingWildcard_1", Arrays.asList("trailing-map-value-1", "trailing-map-value-2")); converter.read(BeanWithDynamicMapsWildcards.class, document); } @Test public void testReadMultivaluedFieldWithLeadingWildcardToArrayInDynamicMap() { SolrDocument document = new SolrDocument(); document.addField("1_multivaluedFieldMapWithLeadingWildcard", "leading-map-value-1"); document.addField("2_multivaluedFieldMapWithLeadingWildcard", Arrays.asList("leading-map-value-2", "leading-map-value-3")); BeanWithDynamicMapsWildcards target = converter.read(BeanWithDynamicMapsWildcards.class, document); Assert.assertEquals(2, target.multivaluedFieldMapWithLeadingWildcardArray.size()); Assert.assertThat(target.multivaluedFieldMapWithLeadingWildcardArray, Matchers.allOf(Matchers.hasEntry("1", new String[] { "leading-map-value-1" }), Matchers.hasEntry("2", new String[] { "leading-map-value-2", "leading-map-value-3" }))); } @Test // DATASOLR-202 public void testReadMultivaluedFieldWithLeadingWildcardToListInDynamicMap() { SolrDocument document = new SolrDocument(); document.addField("1_multivaluedFieldMapWithLeadingWildcard", "leading-map-value-1"); document.addField("2_multivaluedFieldMapWithLeadingWildcard", Arrays.asList("leading-map-value-2", "leading-map-value-3")); BeanWithDynamicMapsWildcards target = converter.read(BeanWithDynamicMapsWildcards.class, document); Assert.assertEquals(2, target.multivaluedFieldMapWithLeadingWildcardList.size()); Assert.assertThat(target.multivaluedFieldMapWithLeadingWildcardList, Matchers.allOf(Matchers.hasEntry("1", Collections.singletonList("leading-map-value-1")), Matchers.hasEntry("2", Arrays.asList("leading-map-value-2", "leading-map-value-3")))); } @Test // DATASOLR-202 public void testReadMultivaluedFieldWithTrailingWildcardToArrayInDynamicMap() { SolrDocument document = new SolrDocument(); document.addField("multivaluedFieldMapWithTrailingWildcard_1", "trailing-map-value-1"); document.addField("multivaluedFieldMapWithTrailingWildcard_2", Arrays.asList("trailing-map-value-2", "trailing-map-value-3")); BeanWithDynamicMapsWildcards target = converter.read(BeanWithDynamicMapsWildcards.class, document); Assert.assertEquals(2, target.multivaluedFieldMapWithTrailingWildcardArray.size()); Assert.assertThat(target.multivaluedFieldMapWithTrailingWildcardArray, Matchers.allOf(Matchers.hasEntry("1", new String[] { "trailing-map-value-1" }), Matchers.hasEntry("2", new String[] { "trailing-map-value-2", "trailing-map-value-3" }))); } @Test // DATASOLR-202 public void testReadMultivaluedFieldWithTrailingWildcardToListInDynamicMap() { SolrDocument document = new SolrDocument(); document.addField("multivaluedFieldMapWithTrailingWildcard_1", "trailing-map-value-1"); document.addField("multivaluedFieldMapWithTrailingWildcard_2", Arrays.asList("trailing-map-value-2", "trailing-map-value-3")); BeanWithDynamicMapsWildcards target = converter.read(BeanWithDynamicMapsWildcards.class, document); Assert.assertEquals(2, target.multivaluedFieldMapWithTrailingWildcardArray.size()); Assert.assertThat(target.multivaluedFieldMapWithTrailingWildcardList, Matchers.allOf(Matchers.hasEntry("1", Collections.singletonList("trailing-map-value-1")), Matchers.hasEntry("2", Arrays.asList("trailing-map-value-2", "trailing-map-value-3")))); } @Test public void testReadWithWithFieldAnnotationOnSetters() { SolrDocument document = new SolrDocument(); document.addField("name", "value_1"); document.addField("namedFieldFieldName", "value_2"); BeanWithFieldAnnotationOnSetter target = converter.read(BeanWithFieldAnnotationOnSetter.class, document); Assert.assertEquals("value_1", target.name); Assert.assertEquals("value_2", target.namedField); } @Test public void testReadBeanWithInheritance() { SolrDocument document = new SolrDocument(); document.addField("stringProperty", "some string"); document.addField("intProperty", 10); BeanWithInteritance target = converter.read(BeanWithInteritance.class, document); Assert.assertEquals(document.getFieldValue("stringProperty"), target.stringProperty); Assert.assertEquals(document.getFieldValue("intProperty"), target.intProperty); } @Test public void testReadToMap() { SolrDocument document = new SolrDocument(); document.addField("map_1", "value-1"); document.addField("map_2", "value-2"); BeanWithDifferentMaps target = converter.read(BeanWithDifferentMaps.class, document); Assert.assertThat(target.mapProperty, IsInstanceOf.instanceOf(HashMap.class)); } @Test public void testReadToHashMapMap() { SolrDocument document = new SolrDocument(); document.addField("hashMap_1", "value-1"); document.addField("hashMap_2", "value-2"); BeanWithDifferentMaps target = converter.read(BeanWithDifferentMaps.class, document); Assert.assertThat(target.hashMapProperty, IsInstanceOf.instanceOf(HashMap.class)); } @Test public void testReadToLinkedHashMapMap() { SolrDocument document = new SolrDocument(); document.addField("linkedHashMap_1", "value-1"); document.addField("linkedHashMap_2", "value-2"); BeanWithDifferentMaps target = converter.read(BeanWithDifferentMaps.class, document); Assert.assertThat(target.linkedHashMapProperty, IsInstanceOf.instanceOf(LinkedHashMap.class)); } @Test public void testReadOverlappingWildcradsIgnoresNoWildcardFields() { SolrDocument document = new SolrDocument(); document.addField("acme_s_com", "value_1"); BeanWithOverlappingWildcards target = converter.read(BeanWithOverlappingWildcards.class, document); Assert.assertThat(target.justAString, IsEqual.equalTo("value_1")); Assert.assertThat(target.keys, IsNull.nullValue(Map.class)); Assert.assertThat(target.strings, IsNull.nullValue(Map.class)); } @Test public void testReadOverlappingWildcradsShouldPlaceStringInMultipleMatchingFields() { SolrDocument document = new SolrDocument(); document.addField("some_key_s", "value_1"); BeanWithOverlappingWildcards target = converter.read(BeanWithOverlappingWildcards.class, document); Assert.assertThat(target.justAString, IsNull.nullValue(String.class)); Assert.assertThat(target.keys, IsMapContaining.hasEntry("some_key_s", "value_1")); Assert.assertThat(target.strings, IsMapContaining.hasEntry("some_key_s", "value_1")); } @Test public void testReadOverlappingWildcradsShouldPlaceStringInOnlyOneMatchingFieldWhenNoFullMatch() { SolrDocument document = new SolrDocument(); document.addField("some_different_s", "value_1"); BeanWithOverlappingWildcards target = converter.read(BeanWithOverlappingWildcards.class, document); Assert.assertThat(target.justAString, IsNull.nullValue(String.class)); Assert.assertThat(target.keys, IsNull.nullValue(Map.class)); Assert.assertThat(target.strings, IsMapContaining.hasEntry("some_different_s", "value_1")); } @Test public void testReadOverlappingWildcardsShouldMatchWildCardAtEndOfPattern() { SolrDocument document = new SolrDocument(); document.addField("_s_prefixed", "value_1"); BeanWithOverlappingWildcards target = converter.read(BeanWithOverlappingWildcards.class, document); Assert.assertThat(target.justAString, IsNull.nullValue(String.class)); Assert.assertThat(target.keys, IsNull.nullValue(Map.class)); Assert.assertThat(target.strings, IsNull.nullValue(Map.class)); Assert.assertThat(target.stringWithPrefix, IsEqual.equalTo("value_1")); } @Test public void shouldConvertTypesWithinCollectionsOfMapCorrectly() { SolrDocument document = new SolrDocument(); document.addField("fieldWithDateTimeInListOfMap_d", new Date(60264684000000L)); BeanWithWildcardsOnTypesThatRequireConversion target = converter .read(BeanWithWildcardsOnTypesThatRequireConversion.class, document); Assert.assertThat(target.fieldWithDateTimeInListOfMap.get("fieldWithDateTimeInListOfMap_d"), IsInstanceOf.instanceOf(List.class)); Assert.assertThat(target.fieldWithDateTimeInListOfMap.get("fieldWithDateTimeInListOfMap_d").get(0), IsInstanceOf.instanceOf(DateTime.class)); } @SuppressWarnings("unchecked") @Test // DATASOLR-171 public void shouldUseConstructorCorrectlyWhenMultivaluedConvertedToArray() { SolrDocument document = new SolrDocument(); document.addField("array", Arrays.asList("v-1", "v-2")); BeanWithArrayConstructor target = converter.read(BeanWithArrayConstructor.class, document); Assert.assertThat(target.fields, IsEqual.equalTo(((List<String>) document.getFieldValue("array")).toArray())); } @Test // DATASOLR-235 public void testRegularFieldBoosting() { BeanWithBoost bean = new BeanWithBoost(); bean.boostedRegularField = "value"; bean.regularField = "value"; Map<String, SolrInputField> target = new HashMap<>(); converter.write(bean, target); // configured boost Assert.assertEquals(0.5f, target.get("boostedRegularField").getBoost(), 0); // default boost Assert.assertEquals(1, target.get("regularField").getBoost(), 0); } @Test // DATASOLR-235 public void testMapWildcardFieldBoosting() { BeanWithBoost bean = new BeanWithBoost(); bean.boostedMapWildcardField = new HashMap<>(); bean.boostedMapWildcardField.put("val1_boostedMapWildcardField", "value"); bean.boostedMapWildcardField.put("val2_boostedMapWildcardField", "value"); bean.mapWildcardField = new HashMap<>(); bean.mapWildcardField.put("val1_mapWildcardField", "value"); bean.mapWildcardField.put("val2_mapWildcardField", "value"); Map<String, SolrInputField> target = new HashMap<>(); converter.write(bean, target); // configured boost Assert.assertEquals(0.5f, target.get("val1_boostedMapWildcardField").getBoost(), 0); Assert.assertEquals(0.5f, target.get("val2_boostedMapWildcardField").getBoost(), 0); // default boost Assert.assertEquals(1, target.get("val1_mapWildcardField").getBoost(), 0); Assert.assertEquals(1, target.get("val2_mapWildcardField").getBoost(), 0); } @Test // DATASOLR-235 public void testDocumentBoosting() { SolrInputDocument boostedDocument = new SolrInputDocument(); SolrInputDocument regularDocument = new SolrInputDocument(); converter.write(new BeanWithBoost(), boostedDocument); converter.write(new BeanBase(), regularDocument); // configured boost Assert.assertEquals(0.5f, boostedDocument.getDocumentBoost(), 0); // default boost Assert.assertEquals(1, regularDocument.getDocumentBoost(), 0); } @Test // DATASOLR-375 public void writeEnumValues() { SolrInputDocument regularDocument = new SolrInputDocument(); BeanWithDefaultTypes source = new BeanWithDefaultTypes(); source.enumProperty = SomeEnum.E2; SolrInputDocument sink = new SolrInputDocument(); converter.write(source, sink); Assert.assertThat(sink.getFieldValue("enumProperty"), IsEqual.equalTo(SomeEnum.E2.name())); } public static class BeanWithoutAnnotatedFields { String notIndexedProperty; } public static class BeanWithCustomTypes { @Field Point location; @Field List<Point> locations; } public static class BeanWithSimpleTypes { @Field int simpleIntProperty; @Field boolean simpleBoolProperty; @Field float simpleFloatProperty; } public static class BeanWithNamedFields { @Field("namedProperty") String name; } public static class BeanWithFieldAnnotationOnSetter { String name; String namedField; @Field public void setName(String name) { this.name = name; } @Field("namedFieldFieldName") public void setNamedField(String namedField) { this.namedField = namedField; } } public static class BeanWithDefaultTypes { @Field String stringProperty; @Field Integer intProperty; @Field List<String> listOfString; @Field String[] arrayOfString; @Field Date dateProperty; @Field SomeEnum enumProperty; } enum SomeEnum { E1, E2 } public static class BeanWithCatchAllField { @Indexed(readonly = true) @Field("stringProperty_*") String[] allStringProperties; } public static class BeanWithConstructor { @Field String stringProperty; @Field Integer intProperty; public BeanWithConstructor(String stringProperty, Integer intProperty) { super(); this.stringProperty = stringProperty; this.intProperty = intProperty; } } public static class BeanWithWildcardsOnTypesThatRequireConversion { @Field("fieldWithDateTimeInListOfMap_*") Map<String, List<DateTime>> fieldWithDateTimeInListOfMap; } public class BeanWithWildcards { @Field("field_with_trailing_wildcard_*") String filedWithTrailingWildcard; @Field("*_field_with_leading_wildcard") String fieldWithLeadingWildcard; @Field("listFieldWithTrailingWildcard_*") List<String> listFieldWithTrailingWildcard; @Field("arrayFieldWithTrailingWildcard_*") String[] arrayFieldWithTrailingWildcard; @Field("*_listFieldWithLeadingWildcard") List<String> listFieldWithLeadingWildcard; @Field("*_arrayFieldWithTrailingWildcard") String[] arrayFieldWithLeadingWildcard; @Field("*_flatMapWithLeadingWildcard") Map<String, String> flatMapWithLeadingWildcard; @Field("flatMapWithTrailingWildcard_*") Map<String, String> flatMapWithTrailingWildcard; @Field("*_multivaluedFieldMapWithLeadingWildcard") Map<String, String[]> multivaluedFieldMapWithLeadingWildcardArray; @Field("*_multivaluedFieldMapWithLeadingWildcard") Map<String, List<String>> multivaluedFieldMapWithLeadingWildcardList; @Field("multivaluedFieldMapWithTrailingWildcard_*") Map<String, String[]> multivaluedFieldMapWithTrailingWildcardArray; @Field("multivaluedFieldMapWithTrailingWildcard_*") Map<String, List<String>> multivaluedFieldMapWithTrailingWildcardList; } public class BeanWithDynamicMapsWildcards { @Field("*_flatMapWithLeadingWildcard") @Dynamic Map<String, String> flatMapWithLeadingWildcard; @Field("flatMapWithTrailingWildcard_*") @Dynamic Map<String, String> flatMapWithTrailingWildcard; @Field("*_multivaluedFieldMapWithLeadingWildcard") @Dynamic Map<String, String[]> multivaluedFieldMapWithLeadingWildcardArray; @Field("*_multivaluedFieldMapWithLeadingWildcard") @Dynamic Map<String, List<String>> multivaluedFieldMapWithLeadingWildcardList; @Field("multivaluedFieldMapWithTrailingWildcard_*") @Dynamic Map<String, String[]> multivaluedFieldMapWithTrailingWildcardArray; @Field("multivaluedFieldMapWithTrailingWildcard_*") @Dynamic Map<String, List<String>> multivaluedFieldMapWithTrailingWildcardList; } public static class BeanWithFieldsExcludedFromIndexing { @Indexed(readonly = true) @Field String transientField; } public static class BeanBase { @Field String stringProperty; } public static class BeanWithInteritance extends BeanBase { @Field Integer intProperty; } public static class BeanWithDifferentMaps { @Field("map_*") Map<String, String> mapProperty; @Field("hashMap_*") HashMap<String, String> hashMapProperty; @Field("linkedHashMap_*") LinkedHashMap<String, String> linkedHashMapProperty; } public static class BeanWithOverlappingWildcards { @Field("*_key_s") Map<String, String> keys; @Field("*_s") Map<String, String> strings; @Field("acme_s_com") String justAString; @Field("_s*") String stringWithPrefix; } public static class BeanWithArrayConstructor { @Field("array") String[] fields; public BeanWithArrayConstructor(String[] fields) { this.fields = fields; } } @org.springframework.data.solr.core.mapping.SolrDocument(boost = 0.5f) public static class BeanWithBoost { @Indexed(boost = 0.5f) String boostedRegularField; @Indexed(name = "*_boostedMapWildcardField", boost = 0.5f) Map<String, String> boostedMapWildcardField; @Indexed String regularField; @Indexed(name = "*_mapWildcardField") Map<String, String> mapWildcardField; } }