@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 ScrollResult<String> scroll(QueryBuilder builder, int batchSize, int keepAliveSeconds) { // as we're using pages to scroll audit, we need to add an order to make results across pages deterministic builder.orders(OrderByExprs.asc(LOG_ID), builder.orders().toArray(new OrderByExpr[0])); String scrollId = cursorService.registerCursorResult( new SQLAuditCursorResult(builder, batchSize, keepAliveSeconds)); return scroll(scrollId); }
/** * 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; }
@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); }
@Override public ScrollResult<String> scroll(org.nuxeo.ecm.core.query.sql.model.QueryBuilder builder, int batchSize, int keepAliveSeconds) { // prepare parameters MultiExpression predicate = builder.predicate(); OrderByList orders = builder.orders(); // create source SearchSourceBuilder source = createSearchRequestSource(predicate, orders); source.size(batchSize); // create request SearchRequest request = createSearchRequest(); request.source(source).scroll(TimeValue.timeValueSeconds(keepAliveSeconds)); SearchResponse response = runRequest(request); // register cursor String scrollId = cursorService.registerCursorResult(new ESCursorResult(response, batchSize, keepAliveSeconds)); return scroll(scrollId); }
QueryBuilder queryBuilder = new QueryBuilder(); if (predicate instanceof MultiExpression) { queryBuilder.filter((MultiExpression) predicate); } else { queryBuilder.predicate(predicate);
@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); }
return new DocumentModelListImpl(); if (FieldDetector.hasField(queryBuilder.predicate(), getPasswordField())) { throw new DirectoryException("Cannot filter on password"); Set<String> ids = evaluator.eval(queryBuilder.predicate()); int limit = Math.max(0, (int) queryBuilder.limit()); int offset = Math.max(0, (int) queryBuilder.offset()); boolean countTotal = queryBuilder.countTotal(); OrderByList orders = queryBuilder.orders(); Map<String, String> orderBy = AbstractDirectory.makeOrderBy(orders); if (!orderBy.isEmpty()) {
@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); }
return Collections.emptyList(); if (FieldDetector.hasField(queryBuilder.predicate(), getPasswordField())) { throw new DirectoryException("Cannot filter on password"); List<String> ids = new ArrayList<>(); int limit = Math.max(0, (int) queryBuilder.limit()); int offset = Math.max(0, (int) queryBuilder.offset()); OrderByList orders = queryBuilder.orders(); boolean order = !orders.isEmpty(); Set<String> sourceIds = evaluator.eval(queryBuilder.predicate());
return Collections.emptyList(); if (FieldDetector.hasField(queryBuilder.predicate(), getPasswordField()) || FieldDetector.hasField(queryBuilder.predicate(), getPrefixedPasswordField())) { throw new DirectoryException("Cannot filter on password"); MongoDBDirectoryQueryBuilder builder = new MongoDBDirectoryQueryBuilder(converter, queryBuilder.predicate()); builder.walk(); Document filter = builder.getQuery(); String idFieldName = getPrefixedIdField(); Document projection = new Document(idFieldName, 1L); int limit = Math.max(0, (int) queryBuilder.limit()); int offset = Math.max(0, (int) queryBuilder.offset()); Document sort = builder.walkOrderBy(queryBuilder.orders());
return Collections.emptyList(); if (FieldDetector.hasField(queryBuilder.predicate(), getPasswordField())) { throw new DirectoryException("Cannot filter on password"); builder.walk(queryBuilder.predicate()); String filter = builder.filter.toString(); List<Serializable> filterParams = builder.params; int limit = Math.max(0, (int) queryBuilder.limit()); int offset = Math.max(0, (int) queryBuilder.offset()); OrderByList orders = queryBuilder.orders(); boolean order = !orders.isEmpty(); SearchControls scts = order ? getDirectory().getSearchControls(true) : getDirectory().getIdSearchControls();
return new DocumentModelListImpl(); if (FieldDetector.hasField(queryBuilder.predicate(), getPasswordField())) { throw new DirectoryException("Cannot filter on password"); builder.walk(queryBuilder.predicate()); String filter = builder.filter.toString(); List<Serializable> filterParams = builder.params; int limit = Math.max(0, (int) queryBuilder.limit()); int offset = Math.max(0, (int) queryBuilder.offset()); boolean countTotal = queryBuilder.countTotal(); OrderByList orders = queryBuilder.orders(); Map<String, String> orderBy = AbstractDirectory.makeOrderBy(orders); SearchControls scts = getDirectory().getSearchControls(true);
return Collections.emptyList(); if (FieldDetector.hasField(queryBuilder.predicate(), getPasswordField())) { throw new DirectoryException("Cannot filter on password"); builder.visitMultiExpression(queryBuilder.predicate()); int limit = Math.max(0, (int) queryBuilder.limit()); int offset = Math.max(0, (int) queryBuilder.offset()); OrderByList orders = queryBuilder.orders(); if (!orders.isEmpty()) { for (OrderByExpr ob : orders) {
if (FieldDetector.hasField(queryBuilder.predicate(), getPasswordField()) || FieldDetector.hasField(queryBuilder.predicate(), passwordFieldName)) { throw new DirectoryException("Cannot filter on password"); MongoDBDirectoryQueryBuilder builder = new MongoDBDirectoryQueryBuilder(converter, queryBuilder.predicate()); builder.walk(); Document filter = builder.getQuery(); int limit = Math.max(0, (int) queryBuilder.limit()); int offset = Math.max(0, (int) queryBuilder.offset()); boolean countTotal = queryBuilder.countTotal(); Document sort = builder.walkOrderBy(queryBuilder.orders());
return new DocumentModelListImpl(); if (FieldDetector.hasField(queryBuilder.predicate(), getPasswordField())) { throw new DirectoryException("Cannot filter on password"); builder.visitMultiExpression(queryBuilder.predicate()); int limit = Math.max(0, (int) queryBuilder.limit()); int offset = Math.max(0, (int) queryBuilder.offset()); boolean countTotal = queryBuilder.countTotal(); OrderByList orders = queryBuilder.orders(); if (!orders.isEmpty()) { for (OrderByExpr ob : orders) {