protected Predicate convert(FilterMapEntry entry) { String name = entry.getColumnName(); String operator = entry.getOperator(); Object value = entry.getObject(); if (Operator.EQ.toString().equals(operator)) { return Predicates.eq(name, value); } else if (Operator.LT.toString().equals(operator)) { return Predicates.lt(name, value); } else if (Operator.LTEQ.toString().equals(operator)) { return Predicates.lte(name, value); } else if (Operator.GTEQ.toString().equals(operator)) { return Predicates.gte(name, value); } else if (Operator.GT.toString().equals(operator)) { return Predicates.gt(name, value); } else if (Operator.IN.toString().equals(operator)) { return Predicates.in(name, (List<?>) value); } throw new NuxeoException(String.format("Audit backend search doesn't handle '%s' operator", operator)); }
@Override public List<LogEntry> getLogEntriesAfter(long logIdOffset, int limit, String repositoryId, String... eventIds) { QueryBuilder builder = new AuditQueryBuilder().predicate(Predicates.eq(LOG_REPOSITORY_ID, repositoryId)) .and(Predicates.in(LOG_EVENT_ID, eventIds)) .and(Predicates.gte(LOG_ID, logIdOffset)) .order(OrderByExprs.asc(LOG_ID)) .limit(limit); return queryLogs(builder); }
@Override public List<LogEntry> queryLogsByPage(String[] eventIds, Date limit, String[] categories, String path, int pageNb, int pageSize) { QueryBuilder builder = new AuditQueryBuilder(); if (ArrayUtils.isNotEmpty(eventIds)) { if (eventIds.length == 1) { builder.predicate(Predicates.eq(LOG_EVENT_ID, eventIds[0])); } else { builder.predicate(Predicates.in(LOG_EVENT_ID, eventIds[0])); } } if (ArrayUtils.isNotEmpty(categories)) { if (categories.length == 1) { builder.predicate(Predicates.eq(LOG_CATEGORY, categories[0])); } else { builder.predicate(Predicates.in(LOG_CATEGORY, categories[0])); } } if (path != null) { builder.predicate(Predicates.eq(LOG_DOC_PATH, path)); } if (limit != null) { builder.predicate(Predicates.lt(LOG_EVENT_DATE, limit)); } builder.offset(pageNb * pageSize).limit(pageSize); return queryLogs(builder); }
@Override public long getLatestLogId(String repositoryId, String... eventIds) { QueryBuilder builder = new AuditQueryBuilder().predicate(Predicates.eq(LOG_REPOSITORY_ID, repositoryId)) .and(Predicates.in(LOG_EVENT_ID, eventIds)) .order(OrderByExprs.desc(LOG_ID)) .limit(1); return queryLogs(builder).stream().mapToLong(LogEntry::getId).findFirst().orElse(0L); }
@Override @Deprecated public List<LogEntry> getLogEntriesFor(String uuid, Map<String, FilterMapEntry> filterMap, boolean doDefaultSort) { // create builder QueryBuilder builder = new AuditQueryBuilder(); // create predicates builder.predicate(Predicates.eq(LOG_DOC_UUID, uuid)); filterMap.values().stream().map(this::convert).forEach(builder::and); if (doDefaultSort) { builder.defaultOrder(); } return queryLogs(builder); }
/** * Adds the tenant id to the query if needed. * * @since 10.3 */ protected QueryBuilder addTenantId(QueryBuilder queryBuilder) { if (!isMultiTenant()) { return queryBuilder; } String tenantId = getCurrentTenantId(); if (StringUtils.isEmpty(tenantId)) { return queryBuilder; } // predicate to add Predicate predicate = Predicates.eq(TENANT_ID_FIELD, tenantId); // add to query queryBuilder = new QueryBuilder(queryBuilder); // copy MultiExpression multiExpression = queryBuilder.predicate(); if (multiExpression.predicates.isEmpty()) { queryBuilder.predicate(predicate); } else if (multiExpression.operator == Operator.AND || multiExpression.predicates.size() == 1) { queryBuilder.and(predicate); } else { // query is an OR multiexpression queryBuilder.filter( new MultiExpression(Operator.AND, new ArrayList<>(Arrays.asList(predicate, multiExpression)))); } return queryBuilder; }