@@ -90,6 +90,84 @@ async def test_create_vector_embedding_container_async(self):
90
90
assert properties ["indexingPolicy" ]["vectorIndexes" ] == indexing_policy ["vectorIndexes" ]
91
91
await self .test_db .delete_container (container_id )
92
92
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
+
93
171
async def test_fail_create_vector_indexing_policy_async (self ):
94
172
vector_embedding_policy = {
95
173
"vectorEmbeddings" : [
@@ -249,6 +327,29 @@ async def test_fail_replace_vector_indexing_policy_async(self):
249
327
indexing_policy = indexing_policy ,
250
328
vector_embedding_policy = vector_embedding_policy
251
329
)
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
252
353
new_indexing_policy = {
253
354
"vectorIndexes" : [
254
355
{"path" : "/vector1" , "type" : "quantizedFlat" }]
@@ -257,11 +358,31 @@ async def test_fail_replace_vector_indexing_policy_async(self):
257
358
await self .test_db .replace_container (
258
359
created_container ,
259
360
PartitionKey (path = "/id" ),
361
+ vector_embedding_policy = vector_embedding_policy ,
260
362
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." )
262
364
except exceptions .CosmosHttpResponseError as e :
263
365
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"
265
386
in e .http_error_message )
266
387
await self .test_db .delete_container (container_id )
267
388
0 commit comments