/*******************************************************************************
* Copyright (c) 2005, 2014 springside.github.io
*
* Licensed under the Apache License, Version 2.0 (the "License");
*******************************************************************************/
package org.springside.examples.showcase.repository.jpa;
import static org.assertj.core.api.Assertions.*;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springside.examples.showcase.entity.User;
import org.springside.modules.persistence.DynamicSpecifications;
import org.springside.modules.persistence.SearchFilter;
import org.springside.modules.persistence.SearchFilter.Operator;
import org.springside.modules.test.spring.SpringTransactionalTestCase;
import com.google.common.collect.Lists;
@DirtiesContext
@ContextConfiguration(locations = { "/applicationContext.xml" })
public class DynamicSpecificationTest extends SpringTransactionalTestCase {
@Autowired
private UserDao userDao;
@Test
public void fineUserByFilter() {
// EQ
SearchFilter filter = new SearchFilter("name", Operator.EQ, "管理员");
List<User> users = userDao
.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter), User.class));
assertThat(users).hasSize(1);
// LIKE
filter = new SearchFilter("loginName", Operator.LIKE, "min");
users = userDao.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter), User.class));
assertThat(users).hasSize(1);
// GT
filter = new SearchFilter("id", Operator.GT, "1");
users = userDao.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter), User.class));
assertThat(users).hasSize(5);
filter = new SearchFilter("id", Operator.GT, "6");
users = userDao.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter), User.class));
assertThat(users).isEmpty();
// GTE
filter = new SearchFilter("id", Operator.GTE, "1");
users = userDao.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter), User.class));
assertThat(users).hasSize(6);
filter = new SearchFilter("id", Operator.GTE, "6");
users = userDao.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter), User.class));
assertThat(users).hasSize(1);
// LT
filter = new SearchFilter("id", Operator.LT, "6");
users = userDao.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter), User.class));
assertThat(users).hasSize(5);
filter = new SearchFilter("id", Operator.LT, "1");
users = userDao.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter), User.class));
assertThat(users).isEmpty();
// LTE
filter = new SearchFilter("id", Operator.LTE, "6");
users = userDao.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter), User.class));
assertThat(users).hasSize(6);
filter = new SearchFilter("id", Operator.LTE, "1");
users = userDao.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter), User.class));
assertThat(users).hasSize(1);
// Empty filters, select all
users = userDao.findAll(DynamicSpecifications.bySearchFilter(new ArrayList<SearchFilter>(), User.class));
assertThat(users).hasSize(6);
users = userDao.findAll(DynamicSpecifications.bySearchFilter(null, User.class));
assertThat(users).hasSize(6);
// AND 2 Conditions
SearchFilter filter1 = new SearchFilter("name", Operator.EQ, "管理员");
SearchFilter filter2 = new SearchFilter("loginName", Operator.LIKE, "min");
users = userDao.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter1, filter2), User.class));
assertThat(users).hasSize(1);
filter1 = new SearchFilter("name", Operator.EQ, "管理员");
filter2 = new SearchFilter("loginName", Operator.LIKE, "user");
users = userDao.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter1, filter2), User.class));
assertThat(users).isEmpty();
// 2 conditions on same field
filter1 = new SearchFilter("id", Operator.GTE, "1");
filter2 = new SearchFilter("id", Operator.LTE, "6");
users = userDao.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter1, filter2), User.class));
assertThat(users).hasSize(6);
// Nest Attribute
filter = new SearchFilter("team.id", Operator.EQ, "1");
users = userDao.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter), User.class));
assertThat(users).hasSize(6);
filter = new SearchFilter("team.id", Operator.EQ, "10");
users = userDao.findAll(DynamicSpecifications.bySearchFilter(Lists.newArrayList(filter), User.class));
assertThat(users).isEmpty();
}
}