2

I am wondering how it is possible to add an OR condition to the Envers criteria api:

    public IEnumerable<Guid> GetHistory(object id, params string[] props)
    {
        var auditQuery = AuditReaderFactory.Get(Session).CreateQuery()
            .ForRevisionsOfEntity(typeof(T), false, true);

        foreach (var prop in props)
        {
            auditQuery.Add(AuditEntity.RelatedId(prop).Eq(id)); // <-- adds AND, while OR is required!
        }

        return auditQuery
            .GetResultList<object[]>()
            .Select(i => ((T)i[0]).ID)
            .Distinct();
    }
core
  • 851
  • 1
  • 8
  • 28

2 Answers2

5

Use AuditEntity.Disjunction().

In your example, something like...

[..]
var disjunction = AuditEntity.Disjunction();
foreach (var prop in props)
{
  disjunction.Add(AuditEntity.RelatedId(prop).Eq(id)); 
}
auditQuery.Add(disjunction);
[..]
Roger
  • 1,944
  • 1
  • 11
  • 17
2

I did like this in Java as @Roger mentioned above. (Just in case if anybody needs)

public List<Employee> getAuditHistory(Session session, int id, String property) {
    AuditReader auditReader = AuditReaderFactory.get(session);
    List<Employee> employeeHistory = new ArrayList<>();
    if (auditReader != null) {
        AuditQuery auditQuery = auditReader.createQuery().forRevisionsOfEntity(Employee.class, true, false)
                .add(AuditEntity.property(ResultsConstants.Employee_ID).eq(id));
        AuditDisjunction auditDisjunction = null;
        if (property.equalsIgnoreCase("FULL_NAME")) {
            auditDisjunction = AuditEntity.disjunction().add(AuditEntity.property("FIRST_NAME".toUpperCase()).hasChanged())
                    .add(AuditEntity.property("LAST_NAME".toUpperCase()).hasChanged());
        } else {
            auditQuery = auditQuery.add(AuditEntity.property(property.toUpperCase()).hasChanged());
        }
        auditQuery = auditQuery.addOrder(AuditEntity.property("MODIFIED_DATE").desc());
        if(null != auditDisjunction){
            auditQuery = auditQuery.add(auditDisjunction);
        }
        if (auditQuery != null) {
            if (auditQuery.getResultList().isEmpty()) {
                // Log here or throw it back to caller
            }
            employeeHistory.addAll(auditQuery.getResultList());
        }
    }
    return employeeHistory;
}
Extreme
  • 2,919
  • 1
  • 17
  • 27