diff --git a/pom.xml b/pom.xml index 10a0f160..ca18d91c 100755 --- a/pom.xml +++ b/pom.xml @@ -339,6 +339,7 @@ src/test/resources/customerhistory_table.json
src/test/resources/installation_table.json
src/test/resources/auditable_user_table.json
+ src/test/resources/person_table.json
${dynamodblocal.port} ${project.build.directory}/dynamodb-dist diff --git a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/AbstractDynamoDBQueryCreator.java b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/AbstractDynamoDBQueryCreator.java index 4d0c0125..15664ffa 100644 --- a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/AbstractDynamoDBQueryCreator.java +++ b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/AbstractDynamoDBQueryCreator.java @@ -74,11 +74,15 @@ protected DynamoDBQueryCriteria addCriteria(DynamoDBQueryCriteria PropertyPath leafNodePropertyPath = part.getProperty().getLeafProperty(); String leafNodePropertyName = leafNodePropertyPath.toDotPath(); + //TODO #114 - is this correct? + //TODO max deepth of 32 supported by AWS + /* if (leafNodePropertyName.indexOf(".") != -1) { + int index = leafNodePropertyName.lastIndexOf("."); leafNodePropertyName = leafNodePropertyName.substring(index); - } + }*/ switch (part.getType()) { diff --git a/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/Address.java b/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/Address.java new file mode 100644 index 00000000..cbebff25 --- /dev/null +++ b/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/Address.java @@ -0,0 +1,22 @@ +package org.socialsignin.spring.data.dynamodb.repository.query.nested; + +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument; + +@DynamoDBDocument +public class Address { + private String city; + private String country; + + public String getCity() { + return city; + } + public void setCity(String city) { + this.city = city; + } + public String getCountry() { + return country; + } + public void setCountry(String country) { + this.country = country; + } +} \ No newline at end of file diff --git a/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/NestedPropertiesIT.java b/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/NestedPropertiesIT.java new file mode 100644 index 00000000..b5bbcdc0 --- /dev/null +++ b/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/NestedPropertiesIT.java @@ -0,0 +1,59 @@ +package org.socialsignin.spring.data.dynamodb.repository.query.nested; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.socialsignin.spring.data.dynamodb.core.ConfigurationTI; +import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.util.List; + +import static org.junit.Assert.assertEquals; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = {ConfigurationTI.class, NestedPropertiesIT.TestAppConfig.class}) +public class NestedPropertiesIT { + + @Configuration + @EnableDynamoDBRepositories(basePackages = "org.socialsignin.spring.data.dynamodb.query.nested") + public static class TestAppConfig { + } + + @Autowired + private PersonRepository personRepository; + + @Test + public void testNestedProperty() { + + Address usaAddress = new Address(); + usaAddress.setCity("New York"); + usaAddress.setCountry("USA"); + + Address deAddress = new Address(); + deAddress.setCity("Frankfurt"); + deAddress.setCity("Germany"); + + Person p1 = new Person(); + p1.setName("personName"); + p1.setPhone("phone"); + p1.setArea("area"); + p1.setAddress(usaAddress); + + Person p2 = new Person(); + p2.setName("otherName"); + p2.setPhone("42"); + p2.setArea("otherArea"); + p2.setAddress(deAddress); + +/// personRepository.save(p1); + + List actual = personRepository.findByAddressCountry("USA"); + assertEquals(1, actual.size()); + + actual = personRepository.findByPhone("42"); + assertEquals(1, actual.size()); + } +} diff --git a/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/Person.java b/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/Person.java new file mode 100644 index 00000000..903860fd --- /dev/null +++ b/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/Person.java @@ -0,0 +1,50 @@ +package org.socialsignin.spring.data.dynamodb.repository.query.nested; + +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; +import org.springframework.data.annotation.Id; + +@DynamoDBTable(tableName = "Person") +public class Person { + + @Id + private PersonId personId; + + private String phone; + private Address address; + + @DynamoDBHashKey + public String getName() { + return personId != null ? personId.getName() : null; + } + + @DynamoDBRangeKey + public String getArea() { + return personId != null ? personId.getArea() : null; + } + public Address getAddress() { + return address; + } + public String getPhone() { + return phone; + } + public void setPhone(String phone) { + this.phone = phone; + } + public void setName(String name) { + if (personId == null) { + personId = new PersonId(); + } + this.personId.setName(name); + } + public void setArea(String area) { + if (personId == null) { + personId = new PersonId(); + } + this.personId.setArea(area); + } + public void setAddress(Address address) { + this.address = address; + } +} \ No newline at end of file diff --git a/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/PersonId.java b/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/PersonId.java new file mode 100644 index 00000000..e51d82b5 --- /dev/null +++ b/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/PersonId.java @@ -0,0 +1,38 @@ +package org.socialsignin.spring.data.dynamodb.repository.query.nested; + +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; +import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey; + +import java.io.Serializable; + +public class PersonId implements Serializable { + + private static final long serialVersionUID = 1L; + + private String name; + private String area; + + @DynamoDBRangeKey + public String getArea() { + return area; + } + + @DynamoDBHashKey + public String getName() { + return name; + } + + public PersonId() {} + + public PersonId(String name, String area) { + this.name = name; + this.area = area; + } + public void setName(String name) { + this.name = name; + } + public void setArea(String area) { + this.area = area; + } +} + diff --git a/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/PersonRepository.java b/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/PersonRepository.java new file mode 100644 index 00000000..7416bb19 --- /dev/null +++ b/src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/nested/PersonRepository.java @@ -0,0 +1,21 @@ +package org.socialsignin.spring.data.dynamodb.repository.query.nested; + +import org.socialsignin.spring.data.dynamodb.repository.EnableScan; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface PersonRepository extends PagingAndSortingRepository { + + Person findByNameAndArea(@Param("name") String name, @Param("area") String area); + + @EnableScan + List findByArea(@Param("area") String area); + + @EnableScan + List findByPhone(@Param("phone") String phone); + + @EnableScan + List findByAddressCountry(@Param("country") String country); +} \ No newline at end of file diff --git a/src/test/resources/person_table.json b/src/test/resources/person_table.json new file mode 100755 index 00000000..a6953561 --- /dev/null +++ b/src/test/resources/person_table.json @@ -0,0 +1,27 @@ +{ + "AttributeDefinitions": [ + { + "AttributeName": "Name", + "AttributeType": "S" + }, + { + "AttributeName": "Area", + "AttributeType": "S" + } + ], + "KeySchema": [ + { + "AttributeName": "Name", + "KeyType": "HASH" + }, + { + "AttributeName": "Area", + "KeyType": "RANGE" + } + ], + "ProvisionedThroughput": { + "ReadCapacityUnits": "10", + "WriteCapacityUnits": "10" + }, + "TableName": "person" +} \ No newline at end of file