diff --git a/src/main/java/ortus/boxlang/runtime/types/util/StructUtil.java b/src/main/java/ortus/boxlang/runtime/types/util/StructUtil.java index 9ae7dc108..49af4809a 100644 --- a/src/main/java/ortus/boxlang/runtime/types/util/StructUtil.java +++ b/src/main/java/ortus/boxlang/runtime/types/util/StructUtil.java @@ -460,7 +460,21 @@ public static Stream findKey( IStruct struct, String key ) { returnStruct.put( Key.owner, keyParts.length > 1 - ? unFlattenKeys( flatMap, true, false ).get( Key.of( flatMapParent ) ) + ? unFlattenKeys( + flatMap.entrySet().stream() + .filter( mapEntry -> mapEntry.getKey().getName().length() >= flatMapParent.length() && mapEntry.getKey().getName().substring( 0, flatMapParent.length() ).equals( flatMapParent ) ) + .map( mapEntry -> { + String keyname = mapEntry.getKey().getName(); + String resultKeyName = keyname.substring( flatMapParent.length() + 1 ); + return new AbstractMap.SimpleEntry( + Key.of( resultKeyName ), mapEntry.getValue() + ); + } + ) + .collect( BLCollector.toStruct() ), + true, + false + ) : struct ); returnStruct.put( diff --git a/src/test/java/ortus/boxlang/runtime/bifs/global/struct/StructFindKeyTest.java b/src/test/java/ortus/boxlang/runtime/bifs/global/struct/StructFindKeyTest.java index 50b346e9d..242f68771 100644 --- a/src/test/java/ortus/boxlang/runtime/bifs/global/struct/StructFindKeyTest.java +++ b/src/test/java/ortus/boxlang/runtime/bifs/global/struct/StructFindKeyTest.java @@ -205,7 +205,26 @@ public void testOwnerValues() { myStruct = { horse: nullValue(), bird: { - total: nullValue() + total: nullValue(), + species : { + parrot: { + size : "large", + total: 1, + names : [ + "Polly", + "Jack", + "Fred" + ] + }, + finch: { + size : "small", + total: 2 + }, + duck: { + size : "large", + total: 3 + }, + } }, cow: { total: 12 @@ -220,6 +239,10 @@ public void testOwnerValues() { result = StructFindKey( myStruct, "pig.total" ); resultTop = StructFindKey( myStruct, "cat" ); resultOwner = resultTop.first().owner; + resultNested = structFindKey( myStruct, "size", "all" ); + nestedOwner = resultNested.first().owner; + resultParrotNames = structFindKey( myStruct, "bird.species.parrot.names", "all" ); + parrotResult = resultParrotNames.first(); """, context ); //@formatter:on @@ -228,6 +251,14 @@ public void testOwnerValues() { assertEquals( 1, variables.getAsArray( Key.of( "resultTop" ) ).size() ); assertEquals( Struct.class, variables.get( Key.of( "resultOwner" ) ).getClass() ); assertEquals( 3, StructCaster.cast( variables.get( Key.of( "resultOwner" ) ) ).getAsInteger( Key.of( "total" ) ) ); + assertEquals( Array.class, variables.get( Key.of( "resultNested" ) ).getClass() ); + assertEquals( 3, variables.getAsArray( Key.of( "resultNested" ) ).size() ); + assertEquals( Struct.class, variables.get( Key.of( "nestedOwner" ) ).getClass() ); + assertTrue( StructCaster.cast( variables.get( Key.of( "nestedOwner" ) ) ).containsKey( Key.of( "size" ) ) ); + assertTrue( StructCaster.cast( variables.get( Key.of( "nestedOwner" ) ) ).containsKey( Key.of( "total" ) ) ); + assertEquals( Array.class, variables.get( Key.of( "resultParrotNames" ) ).getClass() ); + assertEquals( 1, variables.getAsArray( Key.of( "resultParrotNames" ) ).size() ); + assertEquals( Array.class, variables.getAsStruct( Key.of( "parrotResult" ) ).get( Key.value ).getClass() ); } }