/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.envers.test.integration.query; import java.util.Arrays; import java.util.HashSet; import java.util.List; import javax.persistence.EntityManager; import org.hibernate.envers.RevisionType; import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase; import org.hibernate.envers.test.Priority; import org.hibernate.envers.test.entities.StrIntTestEntity; import org.hibernate.envers.test.tools.TestTools; import org.junit.Assert; import org.junit.Test; /** * @author Adam Warski (adam at warski dot org) */ @SuppressWarnings({"unchecked"}) public class RevisionConstraintQuery extends BaseEnversJPAFunctionalTestCase { private Integer id1; @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] {StrIntTestEntity.class}; } @Test @Priority(10) public void initData() { // Revision 1 EntityManager em = getEntityManager(); em.getTransaction().begin(); StrIntTestEntity site1 = new StrIntTestEntity( "a", 10 ); StrIntTestEntity site2 = new StrIntTestEntity( "b", 15 ); em.persist( site1 ); em.persist( site2 ); id1 = site1.getId(); Integer id2 = site2.getId(); em.getTransaction().commit(); // Revision 2 em.getTransaction().begin(); site1 = em.find( StrIntTestEntity.class, id1 ); site2 = em.find( StrIntTestEntity.class, id2 ); site1.setStr1( "d" ); site2.setNumber( 20 ); em.getTransaction().commit(); // Revision 3 em.getTransaction().begin(); site1 = em.find( StrIntTestEntity.class, id1 ); site2 = em.find( StrIntTestEntity.class, id2 ); site1.setNumber( 1 ); site2.setStr1( "z" ); em.getTransaction().commit(); // Revision 4 em.getTransaction().begin(); site1 = em.find( StrIntTestEntity.class, id1 ); site2 = em.find( StrIntTestEntity.class, id2 ); site1.setNumber( 5 ); site2.setStr1( "a" ); em.getTransaction().commit(); } @Test public void testRevisionsLtQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, false, true ) .addProjection( AuditEntity.revisionNumber().distinct() ) .add( AuditEntity.revisionNumber().lt( 3 ) ) .getResultList(); Assert.assertEquals( Arrays.asList( 1, 2 ), result ); } @Test public void testRevisionsGeQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, false, true ) .addProjection( AuditEntity.revisionNumber().distinct() ) .add( AuditEntity.revisionNumber().ge( 2 ) ) .getResultList(); Assert.assertEquals( TestTools.makeSet( 2, 3, 4 ), new HashSet( result ) ); } @Test public void testRevisionsLeWithPropertyQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, false, true ) .addProjection( AuditEntity.revisionNumber() ) .add( AuditEntity.revisionNumber().le( 3 ) ) .add( AuditEntity.property( "str1" ).eq( "a" ) ) .getResultList(); Assert.assertEquals( Arrays.asList( 1 ), result ); } @Test public void testRevisionsGtWithPropertyQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, false, true ) .addProjection( AuditEntity.revisionNumber() ) .add( AuditEntity.revisionNumber().gt( 1 ) ) .add( AuditEntity.property( "number" ).lt( 10 ) ) .getResultList(); Assert.assertEquals( Arrays.asList( 3, 4 ), result ); } @Test public void testRevisionProjectionQuery() { Object[] result = (Object[]) getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, false, true ) .addProjection( AuditEntity.revisionNumber().max() ) .addProjection( AuditEntity.revisionNumber().count() ) .addProjection( AuditEntity.revisionNumber().countDistinct() ) .addProjection( AuditEntity.revisionNumber().min() ) .add( AuditEntity.id().eq( id1 ) ) .getSingleResult(); Assert.assertEquals( Integer.valueOf( 4 ), result[0] ); Assert.assertEquals( Long.valueOf( 4 ), result[1] ); Assert.assertEquals( Long.valueOf( 4 ), result[2] ); Assert.assertEquals( Integer.valueOf( 1 ), result[3] ); } @Test public void testRevisionOrderQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, false, true ) .addProjection( AuditEntity.revisionNumber() ) .add( AuditEntity.id().eq( id1 ) ) .addOrder( AuditEntity.revisionNumber().desc() ) .getResultList(); Assert.assertEquals( Arrays.asList( 4, 3, 2, 1 ), result ); } @Test public void testRevisionCountQuery() { // The query shouldn't be ordered as always, otherwise - we get an exception. Object result = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, false, true ) .addProjection( AuditEntity.revisionNumber().count() ) .add( AuditEntity.id().eq( id1 ) ) .getSingleResult(); Assert.assertEquals( Long.valueOf( 4 ), result ); } @Test public void testRevisionTypeEqQuery() { // The query shouldn't be ordered as always, otherwise - we get an exception. List results = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, true, true ) .add( AuditEntity.id().eq( id1 ) ) .add( AuditEntity.revisionType().eq( RevisionType.MOD ) ) .getResultList(); Assert.assertEquals( 3, results.size() ); Assert.assertEquals( new StrIntTestEntity( "d", 10, id1 ), results.get( 0 ) ); Assert.assertEquals( new StrIntTestEntity( "d", 1, id1 ), results.get( 1 ) ); Assert.assertEquals( new StrIntTestEntity( "d", 5, id1 ), results.get( 2 ) ); } @Test public void testRevisionTypeNeQuery() { // The query shouldn't be ordered as always, otherwise - we get an exception. List results = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, true, true ) .add( AuditEntity.id().eq( id1 ) ) .add( AuditEntity.revisionType().ne( RevisionType.MOD ) ) .getResultList(); Assert.assertEquals( 1, results.size() ); Assert.assertEquals( new StrIntTestEntity( "a", 10, id1 ), results.get( 0 ) ); } }