@@ -1047,21 +1047,22 @@ async def get_metadata_field_min_max_async(self, metadata_field: str) -> dict[st
10471047 except Exception :
10481048 return {}
10491049
1050- def count_unique_metadata_by_filter (self , metadata_field : str , filters : dict [str , Any ] | None = None ) -> int :
1050+ def count_unique_metadata_by_filter (self , filters : dict [str , Any ], metadata_fields : list [ str ] ) -> dict [ str , int ] :
10511051 """
1052- Returns the number of unique values for the given metadata field among documents that match the filters.
1052+ Returns the number of unique values for each specified metadata field among documents that match the filters.
10531053
1054- :param metadata_field: The metadata field key (inside ``meta``) to count unique values for.
1055- :param filters: Optional filters to restrict the documents considered.
1054+ :param filters: The filters to restrict the documents considered.
10561055 For filter syntax, see [Haystack metadata filtering](https://docs.haystack.deepset.ai/docs/metadata-filtering)
1056+ :param metadata_fields: List of metadata field keys (inside ``meta``) to count unique values for.
10571057
1058- :returns: The number of unique values for the field among the filtered documents.
1058+ :returns: A dictionary mapping each metadata field name to the count of its unique values among the filtered
1059+ documents.
10591060 """
10601061 self ._initialize_client ()
10611062 assert self ._client is not None
10621063
10631064 qdrant_filter = convert_filters_to_qdrant (filters ) if filters else None
1064- unique_values = set ()
1065+ unique_values_by_field : dict [ str , set [ Any ]] = { field : set () for field in metadata_fields }
10651066
10661067 try :
10671068 next_offset = None
@@ -1087,37 +1088,38 @@ def count_unique_metadata_by_filter(self, metadata_field: str, filters: dict[str
10871088 for record in records :
10881089 if record .payload and "meta" in record .payload :
10891090 meta = record .payload ["meta" ]
1090- if metadata_field in meta :
1091- value = meta [ metadata_field ]
1092- if value is not None :
1093- # Convert to hashable type if needed
1094- if isinstance (value , (list , dict )):
1095- unique_values .add (str (value ))
1096- else :
1097- unique_values .add (value )
1098-
1099- return len (unique_values )
1091+ for field in metadata_fields :
1092+ if field in meta :
1093+ value = meta [ field ]
1094+ if value is not None :
1095+ if isinstance (value , (list , dict )):
1096+ unique_values_by_field [ field ] .add (str (value ))
1097+ else :
1098+ unique_values_by_field [ field ] .add (value )
1099+
1100+ return { field : len (unique_values_by_field [ field ]) for field in metadata_fields }
11001101 except Exception :
1101- return 0
1102+ return dict . fromkeys ( metadata_fields , 0 )
11021103
11031104 async def count_unique_metadata_by_filter_async (
1104- self , metadata_field : str , filters : dict [str , Any ] | None = None
1105- ) -> int :
1105+ self , filters : dict [str , Any ], metadata_fields : list [ str ]
1106+ ) -> dict [ str , int ] :
11061107 """
1107- Asynchronously returns the number of unique values for the given metadata field among documents that match
1108- the filters.
1108+ Asynchronously returns the number of unique values for each specified metadata field among documents that
1109+ match the filters.
11091110
1110- :param metadata_field: The metadata field key (inside ``meta``) to count unique values for.
1111- :param filters: Optional filters to restrict the documents considered.
1111+ :param filters: The filters to restrict the documents considered.
11121112 For filter syntax, see [Haystack metadata filtering](https://docs.haystack.deepset.ai/docs/metadata-filtering)
1113+ :param metadata_fields: List of metadata field keys (inside ``meta``) to count unique values for.
11131114
1114- :returns: The number of unique values for the field among the filtered documents.
1115+ :returns: A dictionary mapping each metadata field name to the count of its unique values among the filtered
1116+ documents.
11151117 """
11161118 await self ._initialize_async_client ()
11171119 assert self ._async_client is not None
11181120
11191121 qdrant_filter = convert_filters_to_qdrant (filters ) if filters else None
1120- unique_values = set ()
1122+ unique_values_by_field : dict [ str , set [ Any ]] = { field : set () for field in metadata_fields }
11211123
11221124 try :
11231125 next_offset = None
@@ -1143,18 +1145,18 @@ async def count_unique_metadata_by_filter_async(
11431145 for record in records :
11441146 if record .payload and "meta" in record .payload :
11451147 meta = record .payload ["meta" ]
1146- if metadata_field in meta :
1147- value = meta [ metadata_field ]
1148- if value is not None :
1149- # Convert to hashable type if needed
1150- if isinstance (value , (list , dict )):
1151- unique_values .add (str (value ))
1152- else :
1153- unique_values .add (value )
1154-
1155- return len (unique_values )
1148+ for field in metadata_fields :
1149+ if field in meta :
1150+ value = meta [ field ]
1151+ if value is not None :
1152+ if isinstance (value , (list , dict )):
1153+ unique_values_by_field [ field ] .add (str (value ))
1154+ else :
1155+ unique_values_by_field [ field ] .add (value )
1156+
1157+ return { field : len (unique_values_by_field [ field ]) for field in metadata_fields }
11561158 except Exception :
1157- return 0
1159+ return dict . fromkeys ( metadata_fields , 0 )
11581160
11591161 def get_metadata_field_unique_values (
11601162 self , metadata_field : str , filters : dict [str , Any ] | None = None , limit : int = 100 , offset : int = 0
0 commit comments