/*
* 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.List;
import javax.persistence.EntityManager;
import org.hibernate.envers.query.AuditEntity;
import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
import org.hibernate.envers.test.Priority;
import org.hibernate.envers.test.entities.IntTestEntity;
import org.hibernate.envers.test.entities.ids.UnusualIdNamingEntity;
import org.hibernate.envers.test.tools.TestTools;
import org.hibernate.testing.TestForIssue;
import org.junit.Assert;
import org.junit.Test;
/**
* @author Adam Warski (adam at warski dot org)
*/
@SuppressWarnings({"unchecked"})
public class AggregateQuery extends BaseEnversJPAFunctionalTestCase {
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] {IntTestEntity.class, UnusualIdNamingEntity.class};
}
@Test
@Priority(10)
public void initData() {
EntityManager em = getEntityManager();
// Revision 1
em.getTransaction().begin();
IntTestEntity ite1 = new IntTestEntity( 2 );
IntTestEntity ite2 = new IntTestEntity( 10 );
em.persist( ite1 );
em.persist( ite2 );
Integer id1 = ite1.getId();
Integer id2 = ite2.getId();
em.getTransaction().commit();
// Revision 2
em.getTransaction().begin();
IntTestEntity ite3 = new IntTestEntity( 8 );
UnusualIdNamingEntity uine1 = new UnusualIdNamingEntity( "id1", "data1" );
em.persist( uine1 );
em.persist( ite3 );
ite1 = em.find( IntTestEntity.class, id1 );
ite1.setNumber( 0 );
em.getTransaction().commit();
// Revision 3
em.getTransaction().begin();
ite2 = em.find( IntTestEntity.class, id2 );
ite2.setNumber( 52 );
em.getTransaction().commit();
em.close();
}
@Test
public void testEntitiesAvgMaxQuery() {
Object[] ver1 = (Object[]) getAuditReader().createQuery()
.forEntitiesAtRevision( IntTestEntity.class, 1 )
.addProjection( AuditEntity.property( "number" ).max() )
.addProjection( AuditEntity.property( "number" ).function( "avg" ) )
.getSingleResult();
Object[] ver2 = (Object[]) getAuditReader().createQuery()
.forEntitiesAtRevision( IntTestEntity.class, 2 )
.addProjection( AuditEntity.property( "number" ).max() )
.addProjection( AuditEntity.property( "number" ).function( "avg" ) )
.getSingleResult();
Object[] ver3 = (Object[]) getAuditReader().createQuery()
.forEntitiesAtRevision( IntTestEntity.class, 3 )
.addProjection( AuditEntity.property( "number" ).max() )
.addProjection( AuditEntity.property( "number" ).function( "avg" ) )
.getSingleResult();
assert (Integer) ver1[0] == 10;
assert (Double) ver1[1] == 6.0;
assert (Integer) ver2[0] == 10;
assert (Double) ver2[1] == 6.0;
assert (Integer) ver3[0] == 52;
assert (Double) ver3[1] == 20.0;
}
@Test
@TestForIssue(jiraKey = "HHH-8036")
public void testEntityIdProjection() {
Integer maxId = (Integer) getAuditReader().createQuery().forRevisionsOfEntity( IntTestEntity.class, true, true )
.addProjection( AuditEntity.id().max() )
.add( AuditEntity.revisionNumber().gt( 2 ) )
.getSingleResult();
Assert.assertEquals( Integer.valueOf( 2 ), maxId );
}
@Test
@TestForIssue(jiraKey = "HHH-8036")
public void testEntityIdRestriction() {
List<IntTestEntity> list = getAuditReader().createQuery().forRevisionsOfEntity(
IntTestEntity.class,
true,
true
)
.add( AuditEntity.id().between( 2, 3 ) )
.getResultList();
Assert.assertTrue(
TestTools.checkCollection(
list,
new IntTestEntity( 10, 2 ), new IntTestEntity( 8, 3 ), new IntTestEntity( 52, 2 )
)
);
}
@Test
@TestForIssue(jiraKey = "HHH-8036")
public void testEntityIdOrdering() {
List<IntTestEntity> list = getAuditReader().createQuery().forRevisionsOfEntity(
IntTestEntity.class,
true,
true
)
.add( AuditEntity.revisionNumber().lt( 2 ) )
.addOrder( AuditEntity.id().desc() )
.getResultList();
Assert.assertEquals( Arrays.asList( new IntTestEntity( 10, 2 ), new IntTestEntity( 2, 1 ) ), list );
}
@Test
@TestForIssue(jiraKey = "HHH-8036")
public void testUnusualIdFieldName() {
UnusualIdNamingEntity entity = (UnusualIdNamingEntity) getAuditReader().createQuery()
.forRevisionsOfEntity( UnusualIdNamingEntity.class, true, true )
.add( AuditEntity.id().like( "id1" ) )
.getSingleResult();
Assert.assertEquals( new UnusualIdNamingEntity( "id1", "data1" ), entity );
}
@Test
@TestForIssue(jiraKey = "HHH-8036")
public void testEntityIdModifiedFlagNotSupported() {
try {
getAuditReader().createQuery().forRevisionsOfEntity( IntTestEntity.class, true, true )
.add( AuditEntity.id().hasChanged() )
.getResultList();
}
catch (UnsupportedOperationException e1) {
try {
getAuditReader().createQuery().forRevisionsOfEntity( IntTestEntity.class, true, true )
.add( AuditEntity.id().hasNotChanged() )
.getResultList();
}
catch (UnsupportedOperationException e2) {
return;
}
Assert.fail();
}
Assert.fail();
}
}