/*
* Copyright (c) 2016 OBiBa. All rights reserved.
*
* This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.obiba.core.service.impl.hibernate;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.junit.Assert;
import org.junit.Test;
import org.obiba.core.service.SortingClause;
import org.obiba.core.service.impl.hibernate.AssociationCriteria.Operation;
import org.obiba.core.service.impl.hibernate.testModel.A;
import org.obiba.core.service.impl.hibernate.testModel.B;
import org.obiba.core.service.impl.hibernate.testModel.C;
import org.obiba.core.test.spring.BaseDefaultSpringContextTestCase;
import org.obiba.core.test.spring.Dataset;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
@SuppressWarnings("unchecked")
@Transactional
@Dataset
public class AssociationCriteriaTest extends BaseDefaultSpringContextTestCase {
private SessionFactory factory;
@Override
@Autowired(required = true)
public void setSessionFactory(SessionFactory factory) {
this.factory = factory;
}
@Test
public void testMatch() {
C template = new C();
template.setValue(201);
AssociationCriteria ac = AssociationCriteria.create(A.class, factory.getCurrentSession())
.add("bees.cees", Operation.match, template);
A result = (A) ac.getCriteria().uniqueResult();
Assert.assertNotNull(result);
}
@Test
public void testMatchMultiple() {
A template = new A();
template.setValue(2);
AssociationCriteria ac = AssociationCriteria.create(C.class, factory.getCurrentSession())
.add("parent.parent", Operation.match, template);
List<C> results = ac.getCriteria().list();
Assert.assertNotNull(results);
Assert.assertEquals(3, results.size());
}
@Test
public void testMatchMultipleOrderByMiddleEntity() {
A template = new A();
template.setValue(2);
AssociationCriteria ac = AssociationCriteria.create(C.class, factory.getCurrentSession())
.add("parent.parent", Operation.match, template).addSortingClauses(SortingClause.create("parent.value", false));
List<C> results = ac.getCriteria().list();
Assert.assertNotNull(results);
Assert.assertEquals(3, results.size());
C first = results.get(0);
C second = results.get(1);
C third = results.get(2);
Assert.assertTrue(first.getParent().getValue() >= second.getParent().getValue());
Assert.assertTrue(second.getParent().getValue() >= third.getParent().getValue());
}
@Test
public void testMatchAndOrderByUnreferencedEntity() {
A template = new A();
template.setValue(2);
AssociationCriteria ac = AssociationCriteria.create(B.class, factory.getCurrentSession())
.add("parent", Operation.match, template).addSortingClauses(SortingClause.create("cees.value", false));
List<B> results = ac.getCriteria().list();
Assert.assertNotNull(results);
Assert.assertEquals(2, results.size());
}
@Test
public void testEq() {
AssociationCriteria ac = AssociationCriteria.create(B.class, factory.getCurrentSession())
.add("value", Operation.eq, 102);
B result = (B) ac.getCriteria().uniqueResult();
Assert.assertNotNull(result);
Assert.assertEquals(new Integer(102), result.getValue());
}
@Test
public void testOr() {
AssociationCriteria ac = AssociationCriteria.create(A.class, factory.getCurrentSession())
.add("bees", Operation.or, Restrictions.eq("value", 102), Restrictions.eq("value", 101));
List<A> results = ac.getCriteria().list();
Assert.assertNotNull(results);
Assert.assertEquals(2, results.size());
}
@Test
public void testIn() {
AssociationCriteria ac = AssociationCriteria.create(A.class, factory.getCurrentSession())
.add("bees.value", Operation.in, 101, 102);
List<A> results = ac.getCriteria().list();
Assert.assertNotNull(results);
Assert.assertEquals(2, results.size());
}
@Test
public void testGt() {
AssociationCriteria ac = AssociationCriteria.create(A.class, factory.getCurrentSession())
.add("bees.value", Operation.gt, 101);
List<A> results = ac.getCriteria().list();
Assert.assertNotNull(results);
Assert.assertEquals(1, results.size());
}
@Test
public void testGe() {
AssociationCriteria ac = AssociationCriteria.create(A.class, factory.getCurrentSession())
.add("bees.value", Operation.ge, 101);
List<A> results = ac.getCriteria().list();
Assert.assertNotNull(results);
Assert.assertEquals(2, results.size());
}
@Test
public void testLt() {
AssociationCriteria ac = AssociationCriteria.create(A.class, factory.getCurrentSession())
.add("bees.value", Operation.lt, 102);
List<A> results = ac.getCriteria().list();
Assert.assertNotNull(results);
Assert.assertEquals(1, results.size());
}
@Test
public void testLe() {
AssociationCriteria ac = AssociationCriteria.create(A.class, factory.getCurrentSession())
.add("bees.value", Operation.le, 102);
List<A> results = ac.getCriteria().list();
Assert.assertNotNull(results);
Assert.assertEquals(2, results.size());
}
@Test
public void testNullSortingClause() {
AssociationCriteria ac = AssociationCriteria.create(A.class, factory.getCurrentSession()).addSortingClauses();
List<A> results = ac.getCriteria().list();
Assert.assertNotNull(results);
}
@Test
public void testNoAddNoSort() {
AssociationCriteria ac = AssociationCriteria.create(A.class, factory.getCurrentSession());
List<A> results = ac.getCriteria().list();
Assert.assertNotNull(results);
}
}