Repository: usergrid Updated Branches: refs/heads/USERGRID-1088 [created] 5772ebbd4
Fix issue where data from objects nested within an array were not getting indexed. Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/5772ebbd Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/5772ebbd Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/5772ebbd Branch: refs/heads/USERGRID-1088 Commit: 5772ebbd4da8077f1451f412f71bf189a854a0a8 Parents: 432c2e9 Author: Michael Russo <[email protected]> Authored: Tue Nov 3 11:12:29 2015 -0800 Committer: Michael Russo <[email protected]> Committed: Tue Nov 3 11:12:29 2015 -0800 ---------------------------------------------------------------------- .../index/impl/EntityMappingParser.java | 4 ++ .../index/impl/EntityToMapConverterTest.java | 56 ++++++++++++++++++++ 2 files changed, 60 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/usergrid/blob/5772ebbd/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EntityMappingParser.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EntityMappingParser.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EntityMappingParser.java index 63cef04..2c82782 100644 --- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EntityMappingParser.java +++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EntityMappingParser.java @@ -202,11 +202,15 @@ public class EntityMappingParser implements FieldParser { */ private void iterate( final Map<String, ?> map ) { + lastCollection.push( map ); + for ( final Map.Entry<String, ?> jsonField : map.entrySet() ) { pushField( jsonField.getKey() ); visitValue( jsonField.getValue() ); popField(); } + + lastCollection.pop(); } http://git-wip-us.apache.org/repos/asf/usergrid/blob/5772ebbd/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityToMapConverterTest.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityToMapConverterTest.java b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityToMapConverterTest.java index c412cf4..32c17f3 100644 --- a/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityToMapConverterTest.java +++ b/stack/corepersistence/queryindex/src/test/java/org/apache/usergrid/persistence/index/impl/EntityToMapConverterTest.java @@ -650,4 +650,60 @@ public class EntityToMapConverterTest { assertEquals( "value", field.get( IndexingUtils.FIELD_STRING ) ); } + + /** + * Objects nested within arrays are allowed to be indexed (just not n+1 nested arrays themselves) + */ + @Test + public void testObjectNestedInArray() { + + final ArrayField<Object> array = new ArrayField<>("array"); + + // this should not get indexed + final ArrayField<Object> nestedArray1 = new ArrayField<>("nestedArray"); + nestedArray1.add("1"); + + // this should get indexed + final EntityObject nestedObject1 = new EntityObject(); + final ArrayField<Object> objectArray = new ArrayField<>("nestedArrayInObject"); + final EntityObject nestedObject2 = new EntityObject(); + nestedObject2.setField(new StringField("nestedKey", "nestedValue")); + objectArray.add(nestedObject2); + nestedObject1.setField(objectArray); + + array.add(nestedArray1); + array.add(nestedObject1); + + + Entity rootEntity = new Entity( "test" ); + + rootEntity.setField( array ); + + + final UUID version = UUIDGenerator.newTimeUUID(); + + EntityUtils.setVersion( rootEntity, version ); + + final ApplicationScope scope = new ApplicationScopeImpl( createId( "application" ) ); + + final IndexEdge indexEdge = + new IndexEdgeImpl( createId( "source" ), "testEdgeType", SearchEdge.NodeType.SOURCE, 1000 ); + + + final Map<String, Object> entityMap = EntityToMapConverter.convert( scope, indexEdge, rootEntity ); + + + final List<EntityField> fields = ( List<EntityField> ) entityMap.get( IndexingUtils.ENTITY_FIELDS ); + + assertEquals( 1, fields.size() ); + + + final EntityField field = fields.get( 0 ); + + final String path = "array.nestedArrayInObject.nestedKey".toLowerCase(); + + assertEquals( path, field.get( IndexingUtils.FIELD_NAME ) ); + + } + }
