package org.zstack.test.core.db;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.transaction.annotation.Transactional;
import org.zstack.core.componentloader.ComponentLoader;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.core.db.SimpleQuery;
import org.zstack.core.db.SimpleQuery.Od;
import org.zstack.core.db.SimpleQuery.Op;
import org.zstack.test.BeanConstructor;
import org.zstack.test.DBUtil;
import org.zstack.test.core.db.PersonVO.Sex;
import javax.persistence.Tuple;
import java.util.Date;
import java.util.List;
public class TestSimpleQuery {
ComponentLoader loader;
DatabaseFacade dbf;
int personNum = 100;
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = true)
class Persist {
@Transactional
void persist() {
for (int i = 0; i < personNum; i++) {
PersonVO vo = new PersonVO();
vo.setAge(i);
vo.setDate(new Date());
vo.setDescription("This is person " + String.valueOf(i));
vo.setMarriage((i % 5 == 0));
vo.setName("Person" + String.valueOf(i));
if (i % 2 == 0) {
vo.setSex(PersonVO.Sex.FEMALE);
} else {
vo.setSex(PersonVO.Sex.MALE);
}
vo.setTitle(String.valueOf(i) + "Person");
dbf.getEntityManager().persist(vo);
}
}
}
@Before
public void setUp() throws Exception {
DBUtil.reDeployDB();
BeanConstructor con = new BeanConstructor();
loader = con.build();
dbf = loader.getComponent(DatabaseFacade.class);
new Persist().persist();
}
@Test
public void test() {
SimpleQuery<PersonVO> query = dbf.createQuery(PersonVO.class);
query.add(PersonVO_.sex, Op.EQ, Sex.FEMALE);
List<PersonVO> females = query.list();
Assert.assertEquals(personNum / 2, females.size());
query = dbf.createQuery(PersonVO.class);
query.select(PersonVO_.age);
query.add(PersonVO_.sex, Op.EQ, Sex.FEMALE);
List<Integer> femaleAges = query.listValue();
for (Integer age : femaleAges) {
Assert.assertEquals(age % 2, 0);
}
query = dbf.createQuery(PersonVO.class);
query.select(PersonVO_.age, PersonVO_.marriage, PersonVO_.name);
query.add(PersonVO_.marriage, Op.EQ, true);
query.add(PersonVO_.sex, Op.EQ, Sex.FEMALE);
List<Tuple> tuples = query.listTuple();
for (Tuple t : tuples) {
int age = t.get(0, Integer.class);
/* all married female should be at age which can divide 10 exactly*/
Assert.assertEquals(age % 10, 0);
}
query = dbf.createQuery(PersonVO.class);
query.orderBy(PersonVO_.age, Od.DESC);
List<PersonVO> ps = query.list();
Assert.assertEquals(ps.get(0).getAge(), this.personNum - 1);
query = dbf.createQuery(PersonVO.class);
query.orderBy(PersonVO_.age, Od.ASC);
ps = query.list();
Assert.assertEquals(ps.get(0).getAge(), 0);
query = dbf.createQuery(PersonVO.class);
long count = query.count();
Assert.assertEquals(count, this.personNum);
}
}