@@ -184,11 +184,11 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
184184 ]
185185 }
186186
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 )
188188 requires counts. Length == 100
189189 requires client. ValidState ()
190190 requires client. Modifies !! {counts}
191- requires 0 < numBuckets
191+ requires 0 < numQueries
192192 ensures client. ValidState ()
193193 modifies client. Modifies
194194 modifies counts
@@ -201,7 +201,12 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
201201 {
202202 var bucketNumber := DDB. AttributeValue. N (String.Base10Int2String(bucket));
203203 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));
205210 var result :- expect client. Query (q);
206211 if result. Items. Some? {
207212 numReturned := numReturned + |result. Items. value|;
@@ -220,7 +225,7 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
220225 expect "PreferredBucket" in item;
221226 expect item["PreferredBucket"]. N?;
222227 var stored_bucket :- expect StrToInt (item["PreferredBucket"].N);
223- expect bucket == stored_bucket % numBuckets ;
228+ expect bucket == stored_bucket % numQueries ;
224229 }
225230 }
226231 }
@@ -236,15 +241,15 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
236241 }
237242 }
238243
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
241246 requires client. ValidState ()
242247 ensures client. ValidState ()
243248 modifies client. Modifies
244249 {
245250 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 );
248253 }
249254 var wasBad : bool := false ;
250255 for i := 0 to 100 {
@@ -279,6 +284,56 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
279284 ExpressionAttributeValues := Some (map[":attr1 " := DDB.AttributeValue.S("AAAA"), ":attr5" := DDB. AttributeValue. S ("EEEE")])
280285 )
281286 }
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+ }
282337 function GetBucketQuery51 () : DDB. QueryInput
283338 {
284339 DDB. QueryInput (
@@ -360,8 +415,15 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
360415 TestBucketQueries (rClient, 3, GetBucketQuery3(), "bucket query 3");
361416 TestBucketQueries (rClient, 2, GetBucketQuery2(), "bucket query 2");
362417 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 );
365427 }
366428
367429 // As BucketTest1, but with custom bucket selector
@@ -388,8 +450,15 @@ module {:options "-functionSyntax:4"} DdbEncryptionTestVectors {
388450 TestBucketQueries (rClient, 3, GetBucketQuery3(), "bucket query 3", true );
389451 TestBucketQueries (rClient, 2, GetBucketQuery2(), "bucket query 2", true );
390452 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 );
393462 }
394463
395464 function NewOrderRecord (i : nat , str : string ) : Record
0 commit comments