@Test public void testSelectRevisionTypeQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, false, true ) .addProjection( AuditEntity.revisionType() ) .add( AuditEntity.id().eq( id1 ) ) .addOrder( AuditEntity.revisionNumber().asc() ) .getResultList(); assert result.size() == 3; assert result.get( 0 ).equals( RevisionType.ADD ); assert result.get( 1 ).equals( RevisionType.MOD ); assert result.get( 2 ).equals( RevisionType.DEL ); }
@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 testProjectionsInEntitiesAtRevision() { assert getAuditReader().createQuery().forEntitiesAtRevision( StrIntTestEntity.class, 1 ) .getResultList().size() == 2; assert getAuditReader().createQuery().forEntitiesAtRevision( StrIntTestEntity.class, 2 ) .getResultList().size() == 1; assert (Long) getAuditReader().createQuery().forEntitiesAtRevision( StrIntTestEntity.class, 1 ) .addProjection( AuditEntity.id().count() ).getResultList().get( 0 ) == 2; assert (Long) getAuditReader().createQuery().forEntitiesAtRevision( StrIntTestEntity.class, 2 ) .addProjection( AuditEntity.id().count() ).getResultList().get( 0 ) == 1; }
@Test public void testMinimizeWithPropertyEq() { List result = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, false, true ) .addProjection( AuditEntity.revisionNumber() ) .add( AuditEntity.property( "number" ).minimize() .add( AuditEntity.property( "str1" ).eq( "a" ) ) ) .getResultList(); assert Arrays.asList( 1 ).equals( result ); }
@Test public void testMaximizeRevision() { List result = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, false, true ) .addProjection( AuditEntity.revisionNumber() ) .add( AuditEntity.revisionNumber().maximize() .add( AuditEntity.property( "number" ).eq( 10 ) ) ) .getResultList(); assert Arrays.asList( 2 ).equals( 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 ); }
@Override @SuppressWarnings({"unchecked"}) public List<Number> getRevisions(Class<?> cls, String entityName, Object primaryKey) throws IllegalArgumentException, NotAuditedException, IllegalStateException { // todo: if a class is not versioned from the beginning, there's a missing ADD rev - what then? cls = getTargetClassIfProxied( cls ); checkNotNull( cls, "Entity class" ); checkNotNull( entityName, "Entity name" ); checkNotNull( primaryKey, "Primary key" ); checkSession(); return createQuery().forRevisionsOfEntity( cls, entityName, false, true ) .addProjection( AuditEntity.revisionNumber() ) .addOrder( AuditEntity.revisionNumber().asc() ) .add( AuditEntity.id().eq( primaryKey ) ) .getResultList(); }
@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 public void testAuditQueryWithJoinedInheritanceSubclassPropertyProjectionWithRelationTraversal() { // HHH-11383 // This test was requested by the reporter so that we have a test that shows Hibernate is // automatically adding "INNER JOIN EntityA_AUD" despite the fact whether the query uses // the traverseRelation API or not. This test makes sure that if the SQL generation is // changed in the future, Envers would properly fail if so. List results = getAuditReader().createQuery().forEntitiesAtRevision( EntityB.class, 1 ) .addProjection( property( "name" ) ) .traverseRelation( "relationToC", JoinType.INNER ) .add( property( "foo" ).like( "bar" ) ) .getResultList(); assertEquals( 2, results.size() ); }
@Test public void testMaximizeWithIdEq() { List revs_id1 = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, false, true ) .addProjection( AuditEntity.revisionNumber() ) .add( AuditEntity.property( "number" ).maximize() .add( AuditEntity.id().eq( id2 ) ) ) .addOrder( AuditEntity.revisionNumber().asc() ) .getResultList(); assert Arrays.asList( 2, 3, 4 ).equals( revs_id1 ); }
@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 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 testModifiedFlagChangesForProjectName() { final List results = getAuditReader().createQuery() .forRevisionsOfEntity( Project.class, false, true ) .add( AuditEntity.property( "name" ).hasChanged() ) .addProjection( AuditEntity.revisionNumber() ) .addOrder( AuditEntity.revisionNumber().asc() ) .getResultList(); assertEquals( Arrays.asList( 1, 2, 3, 4, 5, 6 ), results ); }
@Test public void testModifiedFlagChangesForProjectType() { final List results = getAuditReader().createQuery() .forRevisionsOfEntity( Project.class, false, true ) .add( AuditEntity.property( "type" ).hasChanged() ) .addProjection( AuditEntity.revisionNumber() ) .addOrder( AuditEntity.revisionNumber().asc() ) .getResultList(); assertEquals( Arrays.asList( 1 ), results ); }
@Test public void testRevisionsLtQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, false, true ) .addProjection( AuditEntity.revisionNumber().distinct() ) .add( AuditEntity.revisionNumber().lt( 3 ) ) .addOrder( AuditEntity.revisionNumber().asc() ) .getResultList(); Assert.assertEquals( Arrays.asList( 1, 2 ), 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( TestTools.makeSet( 3, 4 ), new HashSet<>( result ) ); }
@Test public void testRevisionsGeQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, false, true ) .addProjection( AuditEntity.revisionNumber().distinct() ) .add( AuditEntity.revisionNumber().ge( 2 ) ) .addOrder( AuditEntity.revisionNumber().asc() ) .getResultList(); Assert.assertEquals( TestTools.makeSet( 2, 3, 4 ), new HashSet( result ) ); }
@Test public void testEntitiesAddedAtRevision() { StrIntTestEntity site1 = new StrIntTestEntity( "a", 10, id1 ); StrIntTestEntity site2 = new StrIntTestEntity( "a", 10, id2 ); StrIntTestEntity site3 = new StrIntTestEntity( "b", 5, id3 ); List result = getAuditReader().createQuery().forEntitiesModifiedAtRevision( StrIntTestEntity.class, StrIntTestEntity.class.getName(), 1 ).getResultList(); RevisionType revisionType = (RevisionType) getAuditReader().createQuery().forEntitiesModifiedAtRevision( StrIntTestEntity.class, 1 ) .addProjection( AuditEntity.revisionType() ).add( AuditEntity.id().eq( id1 ) ) .getSingleResult(); Assert.assertTrue( TestTools.checkCollection( result, site1, site2, site3 ) ); Assert.assertEquals( revisionType, RevisionType.ADD ); }
@Test public void testEntitiesRemovedAtRevision() { StrIntTestEntity site1 = new StrIntTestEntity( null, null, id1 ); List result = getAuditReader().createQuery() .forEntitiesModifiedAtRevision( StrIntTestEntity.class, 4 ) .getResultList(); RevisionType revisionType = (RevisionType) getAuditReader().createQuery().forEntitiesModifiedAtRevision( StrIntTestEntity.class, 4 ) .addProjection( AuditEntity.revisionType() ).add( AuditEntity.id().eq( id1 ) ) .getSingleResult(); Assert.assertTrue( TestTools.checkCollection( result, site1 ) ); Assert.assertEquals( revisionType, RevisionType.DEL ); }
@Test public void testEntitiesChangedAtRevision() { StrIntTestEntity site1 = new StrIntTestEntity( "aBc", 10, id1 ); StrIntTestEntity site2 = new StrIntTestEntity( "a", 20, id2 ); List result = getAuditReader().createQuery() .forEntitiesModifiedAtRevision( StrIntTestEntity.class, 2 ) .getResultList(); RevisionType revisionType = (RevisionType) getAuditReader().createQuery().forEntitiesModifiedAtRevision( StrIntTestEntity.class, 2 ) .addProjection( AuditEntity.revisionType() ).add( AuditEntity.id().eq( id1 ) ) .getSingleResult(); Assert.assertTrue( TestTools.checkCollection( result, site1, site2 ) ); Assert.assertEquals( revisionType, RevisionType.MOD ); }