use of org.hibernate.envers.query.criteria.AuditCriterion in project hibernate-orm by hibernate.
the class StoreDeletedData method testMaximizeInDisjunction.
@Test
@TestForIssue(jiraKey = "HHH-7800")
public void testMaximizeInDisjunction() {
List<Integer> queryIds = Arrays.asList(id2, id3);
AuditDisjunction disjunction = AuditEntity.disjunction();
for (Integer id : queryIds) {
AuditCriterion crit = AuditEntity.revisionNumber().maximize().add(AuditEntity.id().eq(id)).add(AuditEntity.revisionType().ne(RevisionType.DEL));
disjunction.add(crit);
// Workaround: using this line instead works correctly:
// disjunction.add(AuditEntity.conjunction().add(crit));
}
List<?> beforeDeletionRevisions = getAuditReader().createQuery().forRevisionsOfEntity(StrIntTestEntity.class, false, false).add(disjunction).addOrder(AuditEntity.property("id").asc()).getResultList();
Assert.assertEquals(2, beforeDeletionRevisions.size());
Object[] result1 = (Object[]) beforeDeletionRevisions.get(0);
Object[] result2 = (Object[]) beforeDeletionRevisions.get(1);
Assert.assertEquals(new StrIntTestEntity("b", 20, id2), result1[0]);
// Making sure that we have received an entity added at revision 3.
Assert.assertEquals(3, ((SequenceIdRevisionEntity) result1[1]).getId());
Assert.assertEquals(RevisionType.ADD, result1[2]);
Assert.assertEquals(new StrIntTestEntity("c", 30, id3), result2[0]);
// Making sure that we have received an entity added at revision 3.
Assert.assertEquals(3, ((SequenceIdRevisionEntity) result2[1]).getId());
Assert.assertEquals(RevisionType.ADD, result2[2]);
}
use of org.hibernate.envers.query.criteria.AuditCriterion in project hibernate-orm by hibernate.
the class EntitiesModifiedAtRevisionQuery method list.
@Override
public List list() {
/*
* The query that we need to create:
* SELECT new list(e) FROM versionsReferencedEntity e
* WHERE
* (all specified conditions, transformed, on the "e" entity) AND
* e.revision = :revision
*/
AuditEntitiesConfiguration verEntCfg = enversService.getAuditEntitiesConfiguration();
String revisionPropertyPath = verEntCfg.getRevisionNumberPath();
qb.getRootParameters().addWhereWithParam(revisionPropertyPath, "=", revision);
// all specified conditions
for (AuditCriterion criterion : criterions) {
criterion.addToQuery(enversService, versionsReader, aliasToEntityNameMap, QueryConstants.REFERENCED_ENTITY_ALIAS, qb, qb.getRootParameters());
}
for (final AuditAssociationQueryImpl<?> associationQuery : associationQueries) {
associationQuery.addCriterionsToQuery(versionsReader);
}
Query query = buildQuery();
// add named parameter (used for ValidityAuditStrategy and association queries)
Collection<String> params = query.getParameterMetadata().getNamedParameterNames();
if (params.contains(REVISION_PARAMETER)) {
query.setParameter(REVISION_PARAMETER, revision);
}
List queryResult = query.list();
return applyProjections(queryResult, revision);
}
use of org.hibernate.envers.query.criteria.AuditCriterion in project hibernate-orm by hibernate.
the class AuditAssociationQueryImpl method addCriterionsToQuery.
protected void addCriterionsToQuery(AuditReaderImplementor versionsReader) {
if (enversService.getEntitiesConfigurations().isVersioned(entityName)) {
String auditEntityName = enversService.getAuditEntitiesConfiguration().getAuditEntityName(entityName);
Parameters joinConditionParameters = queryBuilder.addJoin(joinType, auditEntityName, alias, false);
// owner.reference_id = target.originalId.id
AuditEntitiesConfiguration verEntCfg = enversService.getAuditEntitiesConfiguration();
String originalIdPropertyName = verEntCfg.getOriginalIdPropName();
IdMapper idMapperTarget = enversService.getEntitiesConfigurations().get(entityName).getIdMapper();
final String prefix = alias.concat(".").concat(originalIdPropertyName);
ownerAssociationIdMapper.addIdsEqualToQuery(joinConditionParameters, ownerAlias, idMapperTarget, prefix);
// filter revision of target entity
Parameters parametersToUse = parameters;
String revisionPropertyPath = verEntCfg.getRevisionNumberPath();
if (joinType == JoinType.LEFT) {
parametersToUse = parameters.addSubParameters(Parameters.OR);
parametersToUse.addNullRestriction(revisionPropertyPath, true);
parametersToUse = parametersToUse.addSubParameters(Parameters.AND);
}
MiddleIdData referencedIdData = new MiddleIdData(verEntCfg, enversService.getEntitiesConfigurations().get(entityName).getIdMappingData(), null, entityName, enversService.getEntitiesConfigurations().isVersioned(entityName));
enversService.getAuditStrategy().addEntityAtRevisionRestriction(enversService.getGlobalConfiguration(), queryBuilder, parametersToUse, revisionPropertyPath, verEntCfg.getRevisionEndFieldName(), true, referencedIdData, revisionPropertyPath, originalIdPropertyName, alias, queryBuilder.generateAlias(), true);
} else {
Parameters joinConditionParameters = queryBuilder.addJoin(joinType, entityName, alias, false);
// owner.reference_id = target.id
final IdMapper idMapperTarget = enversService.getEntitiesConfigurations().getNotVersionEntityConfiguration(entityName).getIdMapper();
ownerAssociationIdMapper.addIdsEqualToQuery(joinConditionParameters, ownerAlias, idMapperTarget, alias);
}
for (AuditCriterion criterion : criterions) {
criterion.addToQuery(enversService, versionsReader, aliasToEntityNameMap, alias, queryBuilder, parameters);
}
for (final AuditAssociationQueryImpl<?> sub : associationQueries) {
sub.addCriterionsToQuery(versionsReader);
}
}
use of org.hibernate.envers.query.criteria.AuditCriterion in project hibernate-orm by hibernate.
the class EntitiesAtRevisionQuery method list.
public List list() {
/*
* The query that we need to create:
* SELECT new list(e) FROM versionsReferencedEntity e
* WHERE
* (all specified conditions, transformed, on the "e" entity) AND
* (selecting e entities at revision :revision)
* --> for DefaultAuditStrategy:
* e.revision = (SELECT max(e2.revision) FROM versionsReferencedEntity e2
* WHERE e2.revision <= :revision AND e2.id = e.id)
*
* --> for ValidityAuditStrategy:
* e.revision <= :revision and (e.endRevision > :revision or e.endRevision is null)
*
* AND
* (only non-deleted entities)
* e.revision_type != DEL
*/
AuditEntitiesConfiguration verEntCfg = enversService.getAuditEntitiesConfiguration();
String revisionPropertyPath = verEntCfg.getRevisionNumberPath();
String originalIdPropertyName = verEntCfg.getOriginalIdPropName();
MiddleIdData referencedIdData = new MiddleIdData(verEntCfg, enversService.getEntitiesConfigurations().get(entityName).getIdMappingData(), null, entityName, enversService.getEntitiesConfigurations().isVersioned(entityName));
// (selecting e entities at revision :revision)
// --> based on auditStrategy (see above)
enversService.getAuditStrategy().addEntityAtRevisionRestriction(enversService.getGlobalConfiguration(), qb, qb.getRootParameters(), revisionPropertyPath, verEntCfg.getRevisionEndFieldName(), true, referencedIdData, revisionPropertyPath, originalIdPropertyName, REFERENCED_ENTITY_ALIAS, REFERENCED_ENTITY_ALIAS_DEF_AUD_STR, true);
if (!includeDeletions) {
// e.revision_type != DEL
qb.getRootParameters().addWhereWithParam(verEntCfg.getRevisionTypePropName(), "<>", RevisionType.DEL);
}
// all specified conditions
for (AuditCriterion criterion : criterions) {
criterion.addToQuery(enversService, versionsReader, aliasToEntityNameMap, QueryConstants.REFERENCED_ENTITY_ALIAS, qb, qb.getRootParameters());
}
for (final AuditAssociationQueryImpl<?> associationQuery : associationQueries) {
associationQuery.addCriterionsToQuery(versionsReader);
}
Query query = buildQuery();
// add named parameter (used for ValidityAuditStrategy and association queries)
Collection<String> params = query.getParameterMetadata().getNamedParameterNames();
if (params.contains(REVISION_PARAMETER)) {
query.setParameter(REVISION_PARAMETER, revision);
}
List queryResult = query.list();
return applyProjections(queryResult, revision);
}
use of org.hibernate.envers.query.criteria.AuditCriterion in project hibernate-orm by hibernate.
the class RevisionsOfEntityQuery method list.
@SuppressWarnings({ "unchecked" })
public List list() throws AuditException {
AuditEntitiesConfiguration verEntCfg = enversService.getAuditEntitiesConfiguration();
/*
The query that should be executed in the versions table:
SELECT e (unless another projection is specified) FROM ent_ver e, rev_entity r WHERE
e.revision_type != DEL (if selectDeletedEntities == false) AND
e.revision = r.revision AND
(all specified conditions, transformed, on the "e" entity)
ORDER BY e.revision ASC (unless another order or projection is specified)
*/
if (!selectDeletedEntities) {
// e.revision_type != DEL AND
qb.getRootParameters().addWhereWithParam(verEntCfg.getRevisionTypePropName(), "<>", RevisionType.DEL);
}
// all specified conditions, transformed
for (AuditCriterion criterion : criterions) {
criterion.addToQuery(enversService, versionsReader, aliasToEntityNameMap, QueryConstants.REFERENCED_ENTITY_ALIAS, qb, qb.getRootParameters());
}
if (!hasProjection() && !hasOrder) {
String revisionPropertyPath = verEntCfg.getRevisionNumberPath();
qb.addOrder(QueryConstants.REFERENCED_ENTITY_ALIAS, revisionPropertyPath, true);
}
if (!selectEntitiesOnly) {
qb.addFrom(enversService.getAuditEntitiesConfiguration().getRevisionInfoEntityName(), "r", true);
qb.getRootParameters().addWhere(enversService.getAuditEntitiesConfiguration().getRevisionNumberPath(), true, "=", "r.id", false);
}
return getQueryResults();
}
Aggregations