diff --git a/moto/dynamodb2/models.py b/moto/dynamodb2/models.py index 4352a2c5..efd784ab 100644 --- a/moto/dynamodb2/models.py +++ b/moto/dynamodb2/models.py @@ -53,16 +53,16 @@ class DynamoType(object): ) def __lt__(self, other): - return self.value < other.value + return self.cast_value < other.cast_value def __le__(self, other): - return self.value <= other.value + return self.cast_value <= other.cast_value def __gt__(self, other): - return self.value > other.value + return self.cast_value > other.cast_value def __ge__(self, other): - return self.value >= other.value + return self.cast_value >= other.cast_value def __repr__(self): return "DynamoType: {0}".format(self.to_json()) diff --git a/tests/test_dynamodb2/test_dynamodb.py b/tests/test_dynamodb2/test_dynamodb.py index 097d101e..8aa1480d 100644 --- a/tests/test_dynamodb2/test_dynamodb.py +++ b/tests/test_dynamodb2/test_dynamodb.py @@ -2295,6 +2295,35 @@ def test_index_with_unknown_attributes_should_fail(): ex.exception.response['Error']['Message'].should.contain(expected_exception) +@mock_dynamodb2 +def test_sorted_query_with_numerical_sort_key(): + dynamodb = boto3.resource('dynamodb', region_name='us-east-1') + dynamodb.create_table(TableName="CarCollection", + KeySchema=[{ 'AttributeName': "CarModel", 'KeyType': 'HASH'}, + {'AttributeName': "CarPrice", 'KeyType': 'RANGE'}], + AttributeDefinitions=[{'AttributeName': "CarModel", 'AttributeType': "S"}, + {'AttributeName': "CarPrice", 'AttributeType': "N"}], + ProvisionedThroughput={'ReadCapacityUnits': 1, 'WriteCapacityUnits': 1}) + + def create_item(price): + return {"CarModel": "M", "CarPrice": price} + + table = dynamodb.Table('CarCollection') + items = list(map(create_item, [2, 1, 10, 3])) + for item in items: + table.put_item(Item=item) + + response = table.query(KeyConditionExpression=Key('CarModel').eq("M")) + + response_items = response['Items'] + assert len(items) == len(response_items) + assert all(isinstance(item["CarPrice"], Decimal) for item in response_items) + response_prices = [item["CarPrice"] for item in response_items] + expected_prices = [Decimal(item["CarPrice"]) for item in items] + expected_prices.sort() + assert expected_prices == response_prices, "result items are not sorted by numerical value" + + # https://github.com/spulec/moto/issues/1874 @mock_dynamodb2 def test_item_size_is_under_400KB():