From 196e5a7d8d0aa1cdbe1053f3b6a679ae84a73f53 Mon Sep 17 00:00:00 2001 From: Steve Pulec Date: Thu, 5 May 2016 23:39:10 -0400 Subject: [PATCH] Fix dynamodb2 comparisons. Closes #601. --- moto/dynamodb2/models.py | 11 +++++++++-- .../test_dynamodb_table_with_range_key.py | 12 ++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/moto/dynamodb2/models.py b/moto/dynamodb2/models.py index 76dfbf1c3..095dc06cc 100644 --- a/moto/dynamodb2/models.py +++ b/moto/dynamodb2/models.py @@ -53,6 +53,13 @@ class DynamoType(object): def __repr__(self): return "DynamoType: {0}".format(self.to_json()) + @property + def cast_value(self): + if self.type == 'N': + return int(self.value) + else: + return self.value + def to_json(self): return {self.type: self.value} @@ -60,9 +67,9 @@ class DynamoType(object): """ Compares this type against comparison filters """ - range_values = [obj.value for obj in range_objs] + range_values = [obj.cast_value for obj in range_objs] comparison_func = get_comparison_func(range_comparison) - return comparison_func(self.value, *range_values) + return comparison_func(self.cast_value, *range_values) class Item(object): diff --git a/tests/test_dynamodb2/test_dynamodb_table_with_range_key.py b/tests/test_dynamodb2/test_dynamodb_table_with_range_key.py index 8a5c4ed42..53295646a 100644 --- a/tests/test_dynamodb2/test_dynamodb_table_with_range_key.py +++ b/tests/test_dynamodb2/test_dynamodb_table_with_range_key.py @@ -1238,7 +1238,7 @@ def test_boto3_query_gsi_range_comparison(): # Test a query returning all johndoe items results = table.query( - KeyConditionExpression=Key('username').eq('johndoe') & Key("created").gt('0'), + KeyConditionExpression=Key('username').eq('johndoe') & Key("created").gt(0), ScanIndexForward=True, IndexName='TestGSI', ) @@ -1248,7 +1248,7 @@ def test_boto3_query_gsi_range_comparison(): # Return all johndoe items again, but in reverse results = table.query( - KeyConditionExpression=Key('username').eq('johndoe') & Key("created").gt('0'), + KeyConditionExpression=Key('username').eq('johndoe') & Key("created").gt(0), ScanIndexForward=False, IndexName='TestGSI', ) @@ -1258,7 +1258,7 @@ def test_boto3_query_gsi_range_comparison(): # Filter the creation to only return some of the results # And reverse order of hash + range key results = table.query( - KeyConditionExpression=Key("created").gt('1') & Key('username').eq('johndoe'), + KeyConditionExpression=Key("created").gt(1) & Key('username').eq('johndoe'), ConsistentRead=True, IndexName='TestGSI', ) @@ -1266,20 +1266,20 @@ def test_boto3_query_gsi_range_comparison(): # Filter to return no results results = table.query( - KeyConditionExpression=Key('username').eq('janedoe') & Key("created").gt('9'), + KeyConditionExpression=Key('username').eq('janedoe') & Key("created").gt(9), IndexName='TestGSI', ) results['Count'].should.equal(0) results = table.query( - KeyConditionExpression=Key('username').eq('janedoe') & Key("created").eq('5'), + KeyConditionExpression=Key('username').eq('janedoe') & Key("created").eq(5), IndexName='TestGSI', ) results['Count'].should.equal(1) # Test range key sorting results = table.query( - KeyConditionExpression=Key('username').eq('johndoe') & Key("created").gt('0'), + KeyConditionExpression=Key('username').eq('johndoe') & Key("created").gt(0), IndexName='TestGSI', ) expected = [Decimal('1'), Decimal('2'), Decimal('3')]