package com.querydsl.dynamodb;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.querydsl.core.types.Predicate;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBScanExpression;
import com.amazonaws.services.dynamodbv2.datamodeling.PaginatedScanList;
import com.amazonaws.services.dynamodbv2.model.*;
import com.querydsl.dynamodb.domain.QUser;
import com.querydsl.dynamodb.domain.User;
import com.querydsl.dynamodb.domain.User.Gender;
public class DynamoDBQueryTest {
private final QUser user = QUser.user;
static User u1, u2, u3, u4;
private static DynamoDBMapper mapper;
private static AmazonDynamoDB client;
@BeforeClass
public static void setUp() throws Exception {
client = ClientFactory.getInstance();
mapper = new DynamoDBMapper(client, new DynamoDBMapperConfig(
DynamoDBMapperConfig.SaveBehavior.CLOBBER,
DynamoDBMapperConfig.ConsistentReads.CONSISTENT, null));
fillTable();
}
@AfterClass
public static void tearDown() throws Exception {
mapper.batchDelete(u1, u2, u3, u4);
ClientFactory.shutdownInstance();
}
public static void fillTable() throws UnknownHostException {
ProvisionedThroughput provisionedThroughput = new ProvisionedThroughput();
provisionedThroughput.setReadCapacityUnits(1L);
provisionedThroughput.setWriteCapacityUnits(1L);
if (!client.listTables().getTableNames().contains("User")) {
CreateTableRequest createTableRequest = new CreateTableRequest()
.withTableName("User")
.withKeySchema(
new KeySchemaElement().withAttributeName("id")
.withKeyType(KeyType.HASH))
.withProvisionedThroughput(provisionedThroughput)
.withAttributeDefinitions(
new AttributeDefinition().withAttributeName("id").withAttributeType(
ScalarAttributeType.S));
client.createTable(createTableRequest);
} else {
DynamoDBScanExpression scan = new DynamoDBScanExpression();
PaginatedScanList<User> users = mapper.scan(User.class, scan);
for (User user : users) {
Map<String, AttributeValue> key = new HashMap<String, AttributeValue>();
key.put("id", new AttributeValue().withS(user.getId()));
client.deleteItem(new DeleteItemRequest("User", key));
}
}
u1 = addUser("Jaakko", "Jantunen", 20, Gender.MALE, null);
u2 = addUser("Jaakki", "Jantunen", 30, Gender.FEMALE, "One detail");
u3 = addUser("Jaana", "Aakkonen", 40, Gender.MALE, "No details");
u4 = addUser("Jaana", "BeekkoNen", 50, Gender.FEMALE, null);
}
private static User addUser(String first, String last, int age, Gender gender, String details) {
User user = new User(first, last, age, new Date());
user.setGender(gender);
user.setDetails(details);
mapper.save(user);
System.out.println(user.getId());
return user;
}
@Test
public void eq() {
User u = where(user.firstName.eq("Jaakko")).fetchOne();
assertThat(u, equalTo(u1));
}
@Test
public void notEq() {
if (!ClientFactory.isUsingDynamoMock()) {
return;
}
List<User> result = where(user.lastName.ne("Jantunen")).fetch();
assertThat(result, containsInAnyOrder(u3, u4));
}
@Test
public void beginsWith() {
List<User> result = where(user.firstName.startsWith("Jaak")).fetch();
assertThat(result, containsInAnyOrder(u1, u2));
}
@Test
public void between() {
List<User> result = where(user.age.between(29, 41)).fetch();
assertThat(result, containsInAnyOrder(u3, u2));
}
@Test
public void contains() {
List<User> result = where(user.lastName.contains("ekko")).fetch();
assertThat(result, containsInAnyOrder(u4));
}
@Test
public void notContains() {
if (!ClientFactory.isUsingDynamoMock()) {
return;
}
List<User> result = where(user.lastName.contains("nen").not()).fetch();
assertThat(result, containsInAnyOrder(u4));
}
@Test
public void greaterOrEquals() {
List<User> result = where(user.age.goe(40)).fetch();
assertThat(result, containsInAnyOrder(u3, u4));
}
@Test
public void greaterThen() {
List<User> result = where(user.age.gt(20)).fetch();
assertThat(result, containsInAnyOrder(u2, u3, u4));
}
@Test
public void lowerOrEquals() {
List<User> result = where(user.age.loe(20)).fetch();
assertThat(result, containsInAnyOrder(u1));
}
@Test
public void lowerThen() {
List<User> result = where(user.age.lt(40)).fetch();
assertThat(result, containsInAnyOrder(u1, u2));
}
@Test
public void in() {
List<User> result = where(user.age.in(40)).fetch();
assertThat(result, containsInAnyOrder(u3));
}
@Test
public void isNull() {
if (!ClientFactory.isUsingDynamoMock()) {
return;
}
List<User> result = where(user.details.isNull()).fetch();
assertThat(result, containsInAnyOrder(u1, u4));
}
@Test
public void isNotNull() {
if (!ClientFactory.isUsingDynamoMock()) {
return;
}
List<User> result = where(user.details.isNotNull()).fetch();
assertThat(result, containsInAnyOrder(u2, u3));
}
private DynamoDBQuery<User> query() {
return new DynamoDBQuery<User>(client, user);
}
private DynamoDBQuery<User> where(Predicate... e) {
return query().where(e);
}
}