@@ -137,6 +137,9 @@ def __init__(self, key: InstanceKey, value: Value,
137
137
self .value = value # type: Value
138
138
"""Value of the receiver."""
139
139
140
+ """" Mapping from key tuple to children """
141
+ self ._childmap = None # type: dict
142
+
140
143
@property
141
144
def name (self ) -> InstanceName :
142
145
"""Name of the receiver."""
@@ -178,6 +181,8 @@ def __getitem__(self, key: InstanceKey) -> "InstanceNode":
178
181
`name`.
179
182
InstanceValueError: If the receiver's value is not an object.
180
183
"""
184
+ if isinstance (self .value , ArrayValue ) and isinstance (key , tuple ):
185
+ return self ._mapentry (key )
181
186
if isinstance (self .value , ObjectValue ):
182
187
return self ._member (key )
183
188
if isinstance (self .value , ArrayValue ):
@@ -397,6 +402,28 @@ def _entry(self, index: int) -> "ArrayEntry":
397
402
except (IndexError , TypeError ):
398
403
raise NonexistentInstance (self .json_pointer (), "entry " + str (index )) from None
399
404
405
+ def _mapentry (self , key : tuple ) -> "ArrayEntry" :
406
+ if self ._childmap is None :
407
+ self ._childmap = {}
408
+ keys = self .schema_node ._key_members
409
+
410
+ # iterate over all childs
411
+ for child in self :
412
+ keylist = []
413
+
414
+ # collect key values into tuple
415
+ for keyit in keys :
416
+ keylist .append (child [keyit ].value )
417
+
418
+ # cache mapping
419
+ self ._childmap [tuple (keylist )] = child
420
+
421
+ try :
422
+ return self ._childmap [key ]
423
+ except (KeyError ):
424
+ raise NonexistentInstance (self .json_pointer (),
425
+ f"key '{ key } '" ) from None
426
+
400
427
def _peek_schema_route (self , sroute : SchemaRoute ) -> Value :
401
428
irt = InstanceRoute ()
402
429
sn = self .schema_node
0 commit comments