Merge pull request #2463 from gruebel/fix-dynamodb-get-item-ProjectionExpression

Add ProjectionExpression & ExpressionAttributeNames to DynamoDB get_it…
This commit is contained in:
Mike Grima 2019-10-13 10:47:25 -07:00 committed by GitHub
commit 893f0d4f83
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 269 additions and 25 deletions

View file

@ -369,7 +369,80 @@ def test_query_returns_consumed_capacity():
@mock_dynamodb2
def test_basic_projection_expressions():
def test_basic_projection_expression_using_get_item():
dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
# Create the DynamoDB table.
table = dynamodb.create_table(
TableName='users',
KeySchema=[
{
'AttributeName': 'forum_name',
'KeyType': 'HASH'
},
{
'AttributeName': 'subject',
'KeyType': 'RANGE'
},
],
AttributeDefinitions=[
{
'AttributeName': 'forum_name',
'AttributeType': 'S'
},
{
'AttributeName': 'subject',
'AttributeType': 'S'
},
],
ProvisionedThroughput={
'ReadCapacityUnits': 5,
'WriteCapacityUnits': 5
}
)
table = dynamodb.Table('users')
table.put_item(Item={
'forum_name': 'the-key',
'subject': '123',
'body': 'some test message'
})
table.put_item(Item={
'forum_name': 'not-the-key',
'subject': '123',
'body': 'some other test message'
})
result = table.get_item(
Key = {
'forum_name': 'the-key',
'subject': '123'
},
ProjectionExpression='body, subject'
)
result['Item'].should.be.equal({
'subject': '123',
'body': 'some test message'
})
# The projection expression should not remove data from storage
result = table.get_item(
Key = {
'forum_name': 'the-key',
'subject': '123'
}
)
result['Item'].should.be.equal({
'forum_name': 'the-key',
'subject': '123',
'body': 'some test message'
})
@mock_dynamodb2
def test_basic_projection_expressions_using_query():
dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
# Create the DynamoDB table.
@ -452,6 +525,7 @@ def test_basic_projection_expressions():
assert 'body' in results['Items'][1]
assert 'forum_name' in results['Items'][1]
@mock_dynamodb2
def test_basic_projection_expressions_using_scan():
dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
@ -538,7 +612,73 @@ def test_basic_projection_expressions_using_scan():
@mock_dynamodb2
def test_basic_projection_expressions_with_attr_expression_names():
def test_basic_projection_expression_using_get_item_with_attr_expression_names():
dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
# Create the DynamoDB table.
table = dynamodb.create_table(
TableName='users',
KeySchema=[
{
'AttributeName': 'forum_name',
'KeyType': 'HASH'
},
{
'AttributeName': 'subject',
'KeyType': 'RANGE'
},
],
AttributeDefinitions=[
{
'AttributeName': 'forum_name',
'AttributeType': 'S'
},
{
'AttributeName': 'subject',
'AttributeType': 'S'
},
],
ProvisionedThroughput={
'ReadCapacityUnits': 5,
'WriteCapacityUnits': 5
}
)
table = dynamodb.Table('users')
table.put_item(Item={
'forum_name': 'the-key',
'subject': '123',
'body': 'some test message',
'attachment': 'something'
})
table.put_item(Item={
'forum_name': 'not-the-key',
'subject': '123',
'body': 'some other test message',
'attachment': 'something'
})
result = table.get_item(
Key={
'forum_name': 'the-key',
'subject': '123'
},
ProjectionExpression='#rl, #rt, subject',
ExpressionAttributeNames={
'#rl': 'body',
'#rt': 'attachment'
},
)
result['Item'].should.be.equal({
'subject': '123',
'body': 'some test message',
'attachment': 'something'
})
@mock_dynamodb2
def test_basic_projection_expressions_using_query_with_attr_expression_names():
dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
# Create the DynamoDB table.
@ -603,6 +743,7 @@ def test_basic_projection_expressions_with_attr_expression_names():
assert 'attachment' in results['Items'][0]
assert results['Items'][0]['attachment'] == 'something'
@mock_dynamodb2
def test_basic_projection_expressions_using_scan_with_attr_expression_names():
dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
@ -2250,6 +2391,76 @@ def test_batch_items_returns_all():
assert [item['username']['S'] for item in returned_items] == ['user1', 'user2', 'user3']
@mock_dynamodb2
def test_batch_items_with_basic_projection_expression():
dynamodb = _create_user_table()
returned_items = dynamodb.batch_get_item(RequestItems={
'users': {
'Keys': [{
'username': {'S': 'user0'}
}, {
'username': {'S': 'user1'}
}, {
'username': {'S': 'user2'}
}, {
'username': {'S': 'user3'}
}],
'ConsistentRead': True,
'ProjectionExpression': 'username'
}
})['Responses']['users']
returned_items.should.have.length_of(3)
[item['username']['S'] for item in returned_items].should.be.equal(['user1', 'user2', 'user3'])
[item.get('foo') for item in returned_items].should.be.equal([None, None, None])
# The projection expression should not remove data from storage
returned_items = dynamodb.batch_get_item(RequestItems = {
'users': {
'Keys': [{
'username': {'S': 'user0'}
}, {
'username': {'S': 'user1'}
}, {
'username': {'S': 'user2'}
}, {
'username': {'S': 'user3'}
}],
'ConsistentRead': True
}
})['Responses']['users']
[item['username']['S'] for item in returned_items].should.be.equal(['user1', 'user2', 'user3'])
[item['foo']['S'] for item in returned_items].should.be.equal(['bar', 'bar', 'bar'])
@mock_dynamodb2
def test_batch_items_with_basic_projection_expression_and_attr_expression_names():
dynamodb = _create_user_table()
returned_items = dynamodb.batch_get_item(RequestItems={
'users': {
'Keys': [{
'username': {'S': 'user0'}
}, {
'username': {'S': 'user1'}
}, {
'username': {'S': 'user2'}
}, {
'username': {'S': 'user3'}
}],
'ConsistentRead': True,
'ProjectionExpression': '#rl',
'ExpressionAttributeNames': {
'#rl': 'username'
},
}
})['Responses']['users']
returned_items.should.have.length_of(3)
[item['username']['S'] for item in returned_items].should.be.equal(['user1', 'user2', 'user3'])
[item.get('foo') for item in returned_items].should.be.equal([None, None, None])
@mock_dynamodb2
def test_batch_items_should_throw_exception_for_duplicate_request():
client = _create_user_table()