@@ -90,6 +90,84 @@ async def test_create_vector_embedding_container_async(self):
9090 assert properties ["indexingPolicy" ]["vectorIndexes" ] == indexing_policy ["vectorIndexes" ]
9191 await self .test_db .delete_container (container_id )
9292
93+ async def test_replace_vector_indexing_policy_async (self ):
94+ # Replace should work so long as the new indexing policy doesn't change the vector indexes, and as long as
95+ # the previously defined vector embedding policy is also provided.
96+ vector_embedding_policy = {
97+ "vectorEmbeddings" : [
98+ {
99+ "path" : "/vector1" ,
100+ "dataType" : "float32" ,
101+ "dimensions" : 256 ,
102+ "distanceFunction" : "euclidean"
103+ }
104+ ]
105+ }
106+ indexing_policy = {
107+ "indexingMode" : "consistent" ,
108+ "automatic" : True ,
109+ "includedPaths" : [
110+ {
111+ "path" : "/*"
112+ }
113+ ],
114+ "excludedPaths" : [
115+ {
116+ "path" : "/vector1/*"
117+ },
118+ {
119+ "path" : "/\" _etag\" /?"
120+ }
121+ ],
122+ "fullTextIndexes" : [],
123+ "vectorIndexes" : [
124+ {
125+ "path" : "/vector1" ,
126+ "type" : "diskANN" ,
127+ "quantizationByteSize" : 128 ,
128+ "indexingSearchListSize" : 100
129+ }
130+ ]
131+ }
132+ container_id = "vector_container" + str (uuid .uuid4 ())
133+ created_container = await self .test_db .create_container (
134+ id = container_id ,
135+ partition_key = PartitionKey (path = "/id" ),
136+ indexing_policy = indexing_policy ,
137+ vector_embedding_policy = vector_embedding_policy
138+ )
139+ new_indexing_policy = {
140+ "indexingMode" : "consistent" ,
141+ "automatic" : True ,
142+ "includedPaths" : [
143+ {"path" : "/color/?" },
144+ {"path" : "/description/?" },
145+ {"path" : "/cost/?" }
146+ ],
147+ "excludedPaths" : [
148+ {"path" : "/*" },
149+ {"path" : "/vector1/*" },
150+ {"path" : "/\" _etag\" /?" }
151+ ],
152+ "fullTextIndexes" : [],
153+ "vectorIndexes" : [
154+ {
155+ "path" : "/vector1" ,
156+ "type" : "diskANN" ,
157+ "quantizationByteSize" : 128 ,
158+ "indexingSearchListSize" : 100
159+ }]
160+ }
161+ await self .test_db .replace_container (
162+ created_container ,
163+ PartitionKey (path = "/id" ),
164+ vector_embedding_policy = vector_embedding_policy ,
165+ indexing_policy = new_indexing_policy )
166+ properties = await created_container .read ()
167+ assert properties ["vectorEmbeddingPolicy" ] == vector_embedding_policy
168+ assert properties ["indexingPolicy" ]["vectorIndexes" ] == indexing_policy ["vectorIndexes" ]
169+ await self .test_db .delete_container (container_id )
170+
93171 async def test_fail_create_vector_indexing_policy_async (self ):
94172 vector_embedding_policy = {
95173 "vectorEmbeddings" : [
@@ -249,6 +327,29 @@ async def test_fail_replace_vector_indexing_policy_async(self):
249327 indexing_policy = indexing_policy ,
250328 vector_embedding_policy = vector_embedding_policy
251329 )
330+ # don't provide vector embedding policy
331+ try :
332+ await self .test_db .replace_container (
333+ created_container ,
334+ PartitionKey (path = "/id" ),
335+ indexing_policy = indexing_policy )
336+ pytest .fail ("Container replace should have failed for missing embedding policy." )
337+ except exceptions .CosmosHttpResponseError as e :
338+ assert e .status_code == 400
339+ assert ("The Vector Indexing Policy's path::/vector1 not matching in Embedding's path."
340+ in e .http_error_message )
341+ # don't provide vector indexing policy
342+ try :
343+ await self .test_db .replace_container (
344+ created_container ,
345+ PartitionKey (path = "/id" ),
346+ vector_embedding_policy = vector_embedding_policy )
347+ pytest .fail ("Container replace should have failed for missing indexing policy." )
348+ except exceptions .CosmosHttpResponseError as e :
349+ assert e .status_code == 400
350+ assert ("The Vector Indexing Policy cannot be changed in Collection Replace."
351+ in e .http_error_message )
352+ # using a new indexing policy
252353 new_indexing_policy = {
253354 "vectorIndexes" : [
254355 {"path" : "/vector1" , "type" : "quantizedFlat" }]
@@ -257,11 +358,31 @@ async def test_fail_replace_vector_indexing_policy_async(self):
257358 await self .test_db .replace_container (
258359 created_container ,
259360 PartitionKey (path = "/id" ),
361+ vector_embedding_policy = vector_embedding_policy ,
260362 indexing_policy = new_indexing_policy )
261- pytest .fail ("Container replace should have failed for indexing policy." )
363+ pytest .fail ("Container replace should have failed for new indexing policy." )
262364 except exceptions .CosmosHttpResponseError as e :
263365 assert e .status_code == 400
264- assert ("The Vector Indexing Policy's path::/vector1 not matching in Embedding's path."
366+ assert ("Paths in existing vector indexing policy cannot be modified in Collection Replace"
367+ in e .http_error_message )
368+ # using a new vector embedding policy
369+ new_embedding_policy = {
370+ "vectorEmbeddings" : [
371+ {
372+ "path" : "/vector1" ,
373+ "dataType" : "float32" ,
374+ "dimensions" : 384 ,
375+ "distanceFunction" : "euclidean" }]}
376+ try :
377+ await self .test_db .replace_container (
378+ created_container ,
379+ PartitionKey (path = "/id" ),
380+ vector_embedding_policy = new_embedding_policy ,
381+ indexing_policy = indexing_policy )
382+ pytest .fail ("Container replace should have failed for new embedding policy." )
383+ except exceptions .CosmosHttpResponseError as e :
384+ assert e .status_code == 400
385+ assert ("The Vector Embedding Policy cannot be changed in Collection Replace"
265386 in e .http_error_message )
266387 await self .test_db .delete_container (container_id )
267388
0 commit comments