@@ -72,7 +72,14 @@ def poll_until_update_reflected(
7272 )
7373
7474 if expected_metadata is not None :
75- metadata_match = vec .metadata == expected_metadata
75+ # Check that all expected metadata fields are present and match
76+ # (metadata may be merged, so we check for our fields specifically)
77+ if vec .metadata is None :
78+ metadata_match = False
79+ else :
80+ metadata_match = all (
81+ vec .metadata .get (k ) == v for k , v in expected_metadata .items ()
82+ )
7683
7784 if values_match and metadata_match :
7885 logger .debug (f"Update reflected for vector { vector_id } " )
@@ -173,14 +180,41 @@ def test_update_only_metadata_no_values(self, idx, update_namespace):
173180 new_metadata = {"genre" : "thriller" , "year" : 2023 }
174181 idx .update (id = vector_id , set_metadata = new_metadata , namespace = target_namespace )
175182
176- # Wait for update to be reflected
177- poll_until_update_reflected (
178- idx , vector_id , target_namespace , expected_metadata = new_metadata , timeout = 180
179- )
183+ # Wait for update to be reflected - check that specified fields are present
184+ # Note: set_metadata may replace or merge, so we check for the fields we set
185+ def check_metadata_update ():
186+ fetched = idx .fetch (ids = [vector_id ], namespace = target_namespace )
187+ if vector_id in fetched .vectors :
188+ vec = fetched .vectors [vector_id ]
189+ if vec .metadata is not None :
190+ # Check that our specified fields match
191+ return (
192+ vec .metadata .get ("genre" ) == "thriller" and vec .metadata .get ("year" ) == 2023
193+ )
194+ return False
195+
196+ timeout = 180
197+ delta_t = 2
198+ total_time = 0
199+ max_delta_t = 10
200+
201+ while total_time < timeout :
202+ if check_metadata_update ():
203+ break
204+ time .sleep (delta_t )
205+ total_time += delta_t
206+ delta_t = min (delta_t * 1.5 , max_delta_t )
207+ else :
208+ raise TimeoutError (
209+ f"Timed out waiting for metadata update on vector { vector_id } in namespace { target_namespace } "
210+ )
180211
181212 # Verify metadata updated but values unchanged
182213 fetched_vec = idx .fetch (ids = [vector_id ], namespace = target_namespace )
183- assert fetched_vec .vectors [vector_id ].metadata == new_metadata
214+ # Check that the fields we set are present
215+ assert fetched_vec .vectors [vector_id ].metadata is not None
216+ assert fetched_vec .vectors [vector_id ].metadata .get ("genre" ) == "thriller"
217+ assert fetched_vec .vectors [vector_id ].metadata .get ("year" ) == 2023
184218 # Values should remain the same (approximately, due to floating point)
185219 assert len (fetched_vec .vectors [vector_id ].values ) == len (original_values )
186220 assert fetched_vec .vectors [vector_id ].values [0 ] == pytest .approx (original_values [0 ], 0.01 )
0 commit comments