@@ -184,11 +184,11 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
184
184
]
185
185
}
186
186
187
- method DoBucketQuery (client : DDB .IDynamoDBClient, bucket : nat , query : DDB .QueryInput, counts : array <int >, queryName : string , custom : bool , numBuckets : nat )
187
+ method DoBucketQuery (client : DDB .IDynamoDBClient, bucket : nat , query : DDB .QueryInput, counts : array <int >, queryName : string , custom : bool , filtered : bool , numQueries : nat )
188
188
requires counts. Length == 100
189
189
requires client. ValidState ()
190
190
requires client. Modifies !! {counts}
191
- requires 0 < numBuckets
191
+ requires 0 < numQueries
192
192
ensures client. ValidState ()
193
193
modifies client. Modifies
194
194
modifies counts
@@ -201,7 +201,12 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
201
201
{
202
202
var bucketNumber := DDB. AttributeValue. N (String.Base10Int2String(bucket));
203
203
var values : DDB. ExpressionAttributeValueMap := query. ExpressionAttributeValues. UnwrapOr (map[]);
204
- var q := query. (ExclusiveStartKey := lastKey, ExpressionAttributeValues := Some (values[":aws_dbe_bucket " := bucketNumber]));
204
+ values := values[":aws_dbe_bucket" := bucketNumber];
205
+ if filtered {
206
+ var bucketQueries := DDB. AttributeValue. N (String.Base10Int2String(numQueries));
207
+ values := values[":aws_dbe_bucket_queries" := bucketQueries];
208
+ }
209
+ var q := query. (ExclusiveStartKey := lastKey, ExpressionAttributeValues := Some (values));
205
210
var result :- expect client. Query (q);
206
211
if result. Items. Some? {
207
212
numReturned := numReturned + |result. Items. value|;
@@ -220,7 +225,7 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
220
225
expect "PreferredBucket" in item;
221
226
expect item["PreferredBucket"]. N?;
222
227
var stored_bucket :- expect StrToInt (item["PreferredBucket"].N);
223
- expect bucket == stored_bucket % numBuckets ;
228
+ expect bucket == stored_bucket % numQueries ;
224
229
}
225
230
}
226
231
}
@@ -236,15 +241,15 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
236
241
}
237
242
}
238
243
239
- method TestBucketQueries (client : DDB .IDynamoDBClient, numBuckets : nat , q : DDB .QueryInput, queryName : string , custom : bool := false)
240
- requires 0 < numBuckets
244
+ method TestBucketQueries (client : DDB .IDynamoDBClient, numQueries : nat , q : DDB .QueryInput, queryName : string , custom : bool := false, filtered : bool := false)
245
+ requires 0 < numQueries
241
246
requires client. ValidState ()
242
247
ensures client. ValidState ()
243
248
modifies client. Modifies
244
249
{
245
250
var counts: array < int > := new int [100](i => 0);
246
- for i := 0 to numBuckets {
247
- DoBucketQuery (client, i, q, counts, queryName, custom, numBuckets );
251
+ for i := 0 to numQueries {
252
+ DoBucketQuery (client, i, q, counts, queryName, custom, filtered, numQueries );
248
253
}
249
254
var wasBad : bool := false ;
250
255
for i := 0 to 100 {
@@ -279,6 +284,56 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
279
284
ExpressionAttributeValues := Some (map[":attr1 " := DDB.AttributeValue.S("AAAA"), ":attr5" := DDB. AttributeValue. S ("EEEE")])
280
285
)
281
286
}
287
+ function GetBucketQuery15F () : DDB. QueryInput
288
+ {
289
+ DDB. QueryInput (
290
+ TableName := TableName,
291
+ IndexName := Some("ATTR_INDEX1"),
292
+ FilterExpression := Some ("Attr5 = :attr5 "),
293
+ KeyConditionExpression := Some ("Attr1 = :attr1 "),
294
+ ExpressionAttributeValues := Some (map[":attr1 " := DDB.AttributeValue.S("AAAA"), ":attr5" := DDB. AttributeValue. S ("EEEE")])
295
+ )
296
+ }
297
+ function GetBucketQuery25F () : DDB. QueryInput
298
+ {
299
+ DDB. QueryInput (
300
+ TableName := TableName,
301
+ IndexName := Some("ATTR_INDEX2"),
302
+ FilterExpression := Some ("Attr5 = :attr5 "),
303
+ KeyConditionExpression := Some ("Attr2 = :attr2 "),
304
+ ExpressionAttributeValues := Some (map[":attr2 " := DDB.AttributeValue.S("BBBB"), ":attr5" := DDB. AttributeValue. S ("EEEE")])
305
+ )
306
+ }
307
+ function GetBucketQuery35F () : DDB. QueryInput
308
+ {
309
+ DDB. QueryInput (
310
+ TableName := TableName,
311
+ IndexName := Some("ATTR_INDEX3"),
312
+ FilterExpression := Some ("Attr5 = :attr5 "),
313
+ KeyConditionExpression := Some ("Attr3 = :attr3 "),
314
+ ExpressionAttributeValues := Some (map[":attr3 " := DDB.AttributeValue.S("CCCC"), ":attr5" := DDB. AttributeValue. S ("EEEE")])
315
+ )
316
+ }
317
+ function GetBucketQuery45F () : DDB. QueryInput
318
+ {
319
+ DDB. QueryInput (
320
+ TableName := TableName,
321
+ IndexName := Some("ATTR_INDEX4"),
322
+ FilterExpression := Some ("Attr5 = :attr5 "),
323
+ KeyConditionExpression := Some ("Attr4 = :attr4 "),
324
+ ExpressionAttributeValues := Some (map[":attr4 " := DDB.AttributeValue.S("DDDD"), ":attr5" := DDB. AttributeValue. S ("EEEE")])
325
+ )
326
+ }
327
+ function GetBucketQuery23 () : DDB. QueryInput
328
+ {
329
+ DDB. QueryInput (
330
+ TableName := TableName,
331
+ IndexName := Some("ATTR_INDEX23"),
332
+ FilterExpression := None,
333
+ KeyConditionExpression := Some ("Attr2 = :attr2 and Attr3 = :attr3 "),
334
+ ExpressionAttributeValues := Some (map[":attr2 " := DDB.AttributeValue.S("BBBB"), ":attr3" := DDB. AttributeValue. S ("CCCC")])
335
+ )
336
+ }
282
337
function GetBucketQuery51 () : DDB. QueryInput
283
338
{
284
339
DDB. QueryInput (
@@ -360,8 +415,15 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
360
415
TestBucketQueries (rClient, 3, GetBucketQuery3(), "bucket query 3");
361
416
TestBucketQueries (rClient, 2, GetBucketQuery2(), "bucket query 2");
362
417
TestBucketQueries (rClient, 1, GetBucketQuery1(), "bucket query 1");
363
- TestBucketQueries (rClient, 5, GetBucketQuery15(), "bucket query 5");
364
- TestBucketQueries (rClient, 5, GetBucketQuery51(), "bucket query 5");
418
+
419
+ TestBucketQueries (rClient, 5, GetBucketQuery15(), "bucket query 15");
420
+ TestBucketQueries (rClient, 5, GetBucketQuery51(), "bucket query 51");
421
+ TestBucketQueries (rClient, 5, GetBucketQuery23(), "bucket query 23");
422
+
423
+ TestBucketQueries (rClient, 1, GetBucketQuery15F(), "bucket query 15F", false , true );
424
+ TestBucketQueries (rClient, 2, GetBucketQuery25F(), "bucket query 25F", false , true );
425
+ TestBucketQueries (rClient, 3, GetBucketQuery35F(), "bucket query 35F", false , true );
426
+ TestBucketQueries (rClient, 4, GetBucketQuery45F(), "bucket query 45F", false , true );
365
427
}
366
428
367
429
// As BucketTest1, but with custom bucket selector
@@ -388,8 +450,15 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
388
450
TestBucketQueries (rClient, 3, GetBucketQuery3(), "bucket query 3", true );
389
451
TestBucketQueries (rClient, 2, GetBucketQuery2(), "bucket query 2", true );
390
452
TestBucketQueries (rClient, 1, GetBucketQuery1(), "bucket query 1", true );
391
- TestBucketQueries (rClient, 5, GetBucketQuery15(), "bucket query 5", true );
392
- TestBucketQueries (rClient, 5, GetBucketQuery51(), "bucket query 5", true );
453
+
454
+ TestBucketQueries (rClient, 5, GetBucketQuery15(), "bucket query 15", true );
455
+ TestBucketQueries (rClient, 5, GetBucketQuery51(), "bucket query 51", true );
456
+ TestBucketQueries (rClient, 5, GetBucketQuery23(), "bucket query 23", true );
457
+
458
+ TestBucketQueries (rClient, 1, GetBucketQuery15F(), "bucket query 15F", true , true );
459
+ TestBucketQueries (rClient, 2, GetBucketQuery25F(), "bucket query 25F", true , true );
460
+ TestBucketQueries (rClient, 3, GetBucketQuery35F(), "bucket query 35F", true , true );
461
+ TestBucketQueries (rClient, 4, GetBucketQuery45F(), "bucket query 45F", true , true );
393
462
}
394
463
395
464
function NewOrderRecord (i : nat , str : string ) : Record
0 commit comments