@@ -1124,7 +1124,16 @@ async def nmembers(
11241124 -------
11251125 count : int
11261126 """
1127- if self .metadata .consolidated_metadata is not None :
1127+ # check if we can use consolidated metadata, which requires that we have non-None
1128+ # consolidated metadata at all points in the hierarchy.
1129+ use_consolidated_metadata = self .metadata .consolidated_metadata is not None and all (
1130+ x .consolidated_metadata is not None
1131+ for x in self .metadata .consolidated_metadata .flattened_metadata .values ()
1132+ if isinstance (x , GroupMetadata )
1133+ )
1134+
1135+ if use_consolidated_metadata :
1136+ assert self .metadata .consolidated_metadata is not None # helping mypy
11281137 return len (self .metadata .consolidated_metadata .flattened_metadata )
11291138 # TODO: consider using aioitertools.builtins.sum for this
11301139 # return await aioitertools.builtins.sum((1 async for _ in self.members()), start=0)
@@ -1174,13 +1183,16 @@ async def _members(
11741183 ]:
11751184 if self .metadata .consolidated_metadata is not None :
11761185 # we should be able to do members without any additional I/O
1186+ members = self ._members_consolidated (max_depth , current_depth )
1187+
11771188 try :
1178- members = self ._members_consolidated (max_depth , current_depth )
1189+ # we already have this in memory, so fine to build this list
1190+ # and catch the exception if needed.
1191+ members_ = list (members )
11791192 except _MixedConsolidatedMetadataException :
1180- # we've already logged this. We'll fall back to the non-consolidated version.
11811193 pass
11821194 else :
1183- for member in members :
1195+ for member in members_ :
11841196 yield member
11851197 return
11861198
@@ -1238,6 +1250,8 @@ def _members_consolidated(
12381250 ]:
12391251 consolidated_metadata = self .metadata .consolidated_metadata
12401252
1253+ if consolidated_metadata is None :
1254+ raise _MixedConsolidatedMetadataException (prefix )
12411255 # we kind of just want the top-level keys.
12421256 if consolidated_metadata is not None :
12431257 for key in consolidated_metadata .metadata .keys ():
0 commit comments