/** * Create restrictions, projections and specify order for the revision number, corresponding to an * audited entity. */ public static AuditProperty<Number> revisionNumber() { return revisionNumber( null ); }
@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 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 ); }
@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 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 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 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 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 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 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 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 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 @TestForIssue(jiraKey = "HHH-7800") public void testMaximizeInDisjunction() { List<Integer> idsToQuery = Arrays.asList( id1, id3 ); AuditDisjunction disjunction = AuditEntity.disjunction(); for ( Integer id : idsToQuery ) { disjunction.add( AuditEntity.revisionNumber().maximize().add( AuditEntity.id().eq( id ) ) ); } List result = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, true, true ) .add( disjunction ) .getResultList(); Set<Integer> idsSeen = new HashSet<Integer>(); for ( Object o : result ) { StrIntTestEntity entity = (StrIntTestEntity) o; Integer id = entity.getId(); Assert.assertTrue( "Entity with ID " + id + " returned but not queried for.", idsToQuery.contains( id ) ); if ( !idsSeen.add( id ) ) { Assert.fail( "Multiple revisions returned with ID " + id + "; expected only one." ); } } }
@Test @TestForIssue(jiraKey = "HHH-7827") public void testAllLatestRevisionsOfEntityType() { List result = getAuditReader().createQuery() .forRevisionsOfEntity( StrIntTestEntity.class, false, true ) .add( AuditEntity.revisionNumber().maximize().computeAggregationInInstanceContext() ) .addOrder( AuditEntity.property( "id" ).asc() ) .getResultList(); Assert.assertEquals( 4, result.size() ); Object[] result1 = (Object[]) result.get( 0 ); Object[] result2 = (Object[]) result.get( 1 ); Object[] result3 = (Object[]) result.get( 2 ); Object[] result4 = (Object[]) result.get( 3 ); checkRevisionData( result1, 4, RevisionType.MOD, new StrIntTestEntity( "d", 5, id1 ) ); checkRevisionData( result2, 4, RevisionType.MOD, new StrIntTestEntity( "a", 20, id2 ) ); checkRevisionData( result3, 1, RevisionType.ADD, new StrIntTestEntity( "c", 42, id3 ) ); checkRevisionData( result4, 5, RevisionType.DEL, new StrIntTestEntity( null, null, id4 ) ); }
@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 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 public void testOwning1History() { // objects final OneToManyOwned oneToMany = new OneToManyOwned( 1L, "data", null ); final ManyToOneOwned manyToOne = new ManyToOneOwned( 2L, "data1" ); // insert revision final ManyToManyCompositeKey rev1 = getAuditReader().find( ManyToManyCompositeKey.class, owning1Id, 1 ); assertEquals( rev1.getOneToMany(), oneToMany ); assertEquals( rev1.getManyToOne(), manyToOne ); // removal revision - find returns null for deleted assertNull( getAuditReader().find( ManyToManyCompositeKey.class, owning1Id, 2 ) ); // fetch revision 2 using 'select deletions' api and verify. final ManyToManyCompositeKey rev2 = (ManyToManyCompositeKey) getAuditReader() .createQuery() .forRevisionsOfEntity( ManyToManyCompositeKey.class, true, true ) .add( AuditEntity.id().eq( owning1Id ) ) .add( AuditEntity.revisionNumber().eq( 2 ) ) .getSingleResult(); assertEquals( rev2.getOneToMany(), oneToMany ); assertEquals( rev2.getManyToOne(), manyToOne ); }