/** * @throws org.eclipse.ditto.model.base.exceptions.InvalidRqlExpressionException if the filter string cannot be mapped to a * valid criterion */ private Criteria parseCriteria(final String filter, final DittoHeaders dittoHeaders) { return queryFilterCriteriaFactory.filterCriteria(filter, dittoHeaders); }
private Criteria parseCriteriaWithAuthorization(final ThingSearchQueryCommand<?> command) { final Criteria criteria; final DittoHeaders dittoHeaders = command.getDittoHeaders(); final Set<String> namespaces = command.getNamespaces().orElse(null); final String filter = command.getFilter().orElse(null); final List<String> subjectIds = dittoHeaders.getAuthorizationContext().getAuthorizationSubjectIds(); if (V_1 == command.getImplementedSchemaVersion()) { if (namespaces == null) { criteria = queryFilterCriteriaFactory.filterCriteriaRestrictedByAcl(filter, dittoHeaders, subjectIds); } else { criteria = queryFilterCriteriaFactory.filterCriteriaRestrictedByAclAndNamespaces( filter, dittoHeaders, subjectIds, namespaces); } } else { final CriteriaFactory cf = queryFilterCriteriaFactory.getCriteriaFactory(); final Predicate subjectPredicate = cf.in(subjectIds); final Criteria globalReadsCriteria = cf.fieldCriteria(fieldExpressionFactory.filterByGlobalRead(), subjectPredicate); final Criteria aclCriteria = cf.fieldCriteria(fieldExpressionFactory.filterByAcl(), subjectPredicate); final Criteria authorizationCriteria = cf.or(Arrays.asList(globalReadsCriteria, aclCriteria)); final Criteria filterCriteria = namespaces == null ? queryFilterCriteriaFactory.filterCriteria(filter, dittoHeaders) : queryFilterCriteriaFactory.filterCriteriaRestrictedByNamespaces(filter, dittoHeaders, namespaces); criteria = cf.and(Arrays.asList(authorizationCriteria, filterCriteria)); } return criteria; }
private void handleQueryThings(final QueryThings command) { final Criteria filterCriteria; final DittoHeaders dittoHeaders = command.getDittoHeaders(); final Set<String> namespaces = command.getNamespaces().orElse(null); if (namespaces == null) { filterCriteria = queryFilterCriteriaFactory.filterCriteria( command.getFilter().orElse(null), dittoHeaders); } else { filterCriteria = queryFilterCriteriaFactory.filterCriteriaRestrictedByNamespaces( command.getFilter().orElse(null), dittoHeaders, namespaces); } EnsureMonotonicityVisitor.apply(filterCriteria, dittoHeaders); final AggregationBuilder aggregationBuilder = aggregationBuilderFactory.newBuilder(filterCriteria) .authorizationSubjects(dittoHeaders.getAuthorizationContext().getAuthorizationSubjectIds()); command.getOptions() .map(optionStrings -> String.join(",", optionStrings)) .ifPresent(options -> setOptions(options, aggregationBuilder, dittoHeaders)); getSender().tell(aggregationBuilder.build(), getSelf()); }
/** * @throws org.eclipse.ditto.model.base.exceptions.InvalidRqlExpressionException if the filter string cannot be mapped to a * valid criterion */ private Criteria parseCriteria(final String filter, final DittoHeaders dittoHeaders) { return queryFilterCriteriaFactory.filterCriteria(filter, dittoHeaders); }
private void handleCountThings(final CountThings command) { final Criteria filterCriteria; final DittoHeaders dittoHeaders = command.getDittoHeaders(); final Set<String> namespaces = command.getNamespaces().orElse(null); if (namespaces == null) { filterCriteria = queryFilterCriteriaFactory.filterCriteria( command.getFilter().orElse(null), dittoHeaders); } else { filterCriteria = queryFilterCriteriaFactory.filterCriteriaRestrictedByNamespaces( command.getFilter().orElse(null), dittoHeaders, namespaces); } EnsureMonotonicityVisitor.apply(filterCriteria, dittoHeaders); final AggregationBuilder aggregationBuilder = aggregationBuilderFactory.newCountBuilder(filterCriteria) .authorizationSubjects(dittoHeaders.getAuthorizationContext().getAuthorizationSubjectIds()); getSender().tell(aggregationBuilder.build(), getSelf()); }
private Criteria parseCriteriaWithAuthorization(final ThingSearchQueryCommand<?> command) { final Criteria criteria; final DittoHeaders dittoHeaders = command.getDittoHeaders(); final Set<String> namespaces = command.getNamespaces().orElse(null); final String filter = command.getFilter().orElse(null); final List<String> subjectIds = dittoHeaders.getAuthorizationContext().getAuthorizationSubjectIds(); if (V_1 == command.getImplementedSchemaVersion()) { if (namespaces == null) { criteria = queryFilterCriteriaFactory.filterCriteriaRestrictedByAcl(filter, dittoHeaders, subjectIds); } else { criteria = queryFilterCriteriaFactory.filterCriteriaRestrictedByAclAndNamespaces( filter, dittoHeaders, subjectIds, namespaces); } } else { final CriteriaFactory cf = queryFilterCriteriaFactory.getCriteriaFactory(); final Predicate subjectPredicate = cf.in(subjectIds); final Criteria globalReadsCriteria = cf.fieldCriteria(fieldExpressionFactory.filterByGlobalRead(), subjectPredicate); final Criteria aclCriteria = cf.fieldCriteria(fieldExpressionFactory.filterByAcl(), subjectPredicate); final Criteria authorizationCriteria = cf.or(Arrays.asList(globalReadsCriteria, aclCriteria)); final Criteria filterCriteria = namespaces == null ? queryFilterCriteriaFactory.filterCriteria(filter, dittoHeaders) : queryFilterCriteriaFactory.filterCriteriaRestrictedByNamespaces(filter, dittoHeaders, namespaces); criteria = cf.and(Arrays.asList(authorizationCriteria, filterCriteria)); } return criteria; }
/** * Creates a filter criterion based on a filter string which includes only items in the given namespaces * * @param filter the filter string * @param dittoHeaders the corresponding command headers * @param namespaces the namespaces * @return a filter criterion based on the filter string which includes only items related to the given namespaces */ public Criteria filterCriteriaRestrictedByNamespaces(final String filter, final DittoHeaders dittoHeaders, final Set<String> namespaces) { final Criteria filterCriteria = filterCriteria(filter, dittoHeaders); return restrictByNamespace(namespaces, filterCriteria); }
private void handleQueryThings(final QueryThings command) { final Criteria filterCriteria; final DittoHeaders dittoHeaders = command.getDittoHeaders(); final Set<String> namespaces = command.getNamespaces().orElse(null); if (namespaces == null) { filterCriteria = queryFilterCriteriaFactory.filterCriteria( command.getFilter().orElse(null), dittoHeaders); } else { filterCriteria = queryFilterCriteriaFactory.filterCriteriaRestrictedByNamespaces( command.getFilter().orElse(null), dittoHeaders, namespaces); } EnsureMonotonicityVisitor.apply(filterCriteria, dittoHeaders); final AggregationBuilder aggregationBuilder = aggregationBuilderFactory.newBuilder(filterCriteria) .authorizationSubjects(dittoHeaders.getAuthorizationContext().getAuthorizationSubjectIds()); command.getOptions() .map(optionStrings -> String.join(",", optionStrings)) .ifPresent(options -> setOptions(options, aggregationBuilder, dittoHeaders)); getSender().tell(aggregationBuilder.build(), getSelf()); }
/** * Creates a filter criterion based on a filter string which includes only items related to the given auth * subjects * * @param filter the filter string * @param dittoHeaders the corresponding command headers * @param authorisationSubjectIds the auth subjects * @return a filter criterion based on the filter string which includes only items related to the given auth * subjects */ public Criteria filterCriteriaRestrictedByAcl(final String filter, final DittoHeaders dittoHeaders, final List<String> authorisationSubjectIds) { final Criteria filterCriteria = filterCriteria(filter, dittoHeaders); return restrictByAcl(authorisationSubjectIds, filterCriteria); }
private void handleCountThings(final CountThings command) { final Criteria filterCriteria; final DittoHeaders dittoHeaders = command.getDittoHeaders(); final Set<String> namespaces = command.getNamespaces().orElse(null); if (namespaces == null) { filterCriteria = queryFilterCriteriaFactory.filterCriteria( command.getFilter().orElse(null), dittoHeaders); } else { filterCriteria = queryFilterCriteriaFactory.filterCriteriaRestrictedByNamespaces( command.getFilter().orElse(null), dittoHeaders, namespaces); } EnsureMonotonicityVisitor.apply(filterCriteria, dittoHeaders); final AggregationBuilder aggregationBuilder = aggregationBuilderFactory.newCountBuilder(filterCriteria) .authorizationSubjects(dittoHeaders.getAuthorizationContext().getAuthorizationSubjectIds()); getSender().tell(aggregationBuilder.build(), getSelf()); }
/** * Creates a filter criterion based on a filter string which includes items related to the given auth * subjects and namespaces * * @param filter the filter string * @param dittoHeaders the corresponding command headers * @param authorisationSubjectIds the auth subjects * @param namespaces the namespaces * @return a filter criterion based on the filter string which includes only items related elated to the given auth * subjects and namespaces */ public Criteria filterCriteriaRestrictedByAclAndNamespaces(final String filter, final DittoHeaders dittoHeaders, final List<String> authorisationSubjectIds, final Set<String> namespaces) { final Criteria filterCriteria = filterCriteria(filter, dittoHeaders); return restrictByNamespace(namespaces, restrictByAcl(authorisationSubjectIds, filterCriteria)); }
/** * @throws org.eclipse.ditto.model.base.exceptions.InvalidRqlExpressionException if the filter string cannot be mapped to a * valid criterion */ private Criteria parseCriteria(final String filter, final DittoHeaders dittoHeaders) { final CriteriaFactory criteriaFactory = new CriteriaFactoryImpl(); final ThingsFieldExpressionFactory fieldExpressionFactory = new ModelBasedThingsFieldExpressionFactory(); final QueryFilterCriteriaFactory queryFilterCriteriaFactory = new QueryFilterCriteriaFactory(criteriaFactory, fieldExpressionFactory); return queryFilterCriteriaFactory.filterCriteria(filter, dittoHeaders); }
private ActorRef chooseQueryActor(final JsonSchemaVersion version, final Command<?> command) { if (command instanceof ThingSearchQueryCommand<?>) { final String filter = ((ThingSearchQueryCommand<?>) command).getFilter().orElse(null); // useless parsing of command just to choose another actor to "parse" the filter string try { final Criteria criteria = queryFilterCriteriaFactory.filterCriteria(filter, command.getDittoHeaders()); final boolean needToLookupPolicy = JsonSchemaVersion.V_1 != version && criteria.accept(new IsPolicyLookupNeededVisitor()); return needToLookupPolicy ? aggregationQueryActor : findQueryActor; } catch (final DittoRuntimeException e) { // criteria is invalid, let the query actor deal with it return findQueryActor; } } else { // don't bother with aggregation for sudo commands return findQueryActor; } }
private void validateSourceAndTargetAddressesAreNonempty(final Connection connection, final DittoHeaders dittoHeaders) { connection.getSources().forEach(source -> { if (source.getAddresses().isEmpty() || source.getAddresses().contains("")) { final String location = String.format("Source %d of connection <%s>", source.getIndex(), connection.getId()); throw emptyAddressesError(location, dittoHeaders); } }); connection.getTargets().forEach(target -> { if (target.getAddress().isEmpty()) { final String location = String.format("Targets of connection <%s>", connection.getId()); throw emptyAddressesError(location, dittoHeaders); } target.getTopics().forEach(topic -> topic.getFilter().ifPresent(filter -> { // will throw an InvalidRqlExpressionException if the RQL expression was not valid: queryFilterCriteriaFactory.filterCriteria(filter, dittoHeaders); })); }); }
private void validateSourceAndTargetAddressesAreNonempty(final Connection connection, final DittoHeaders dittoHeaders) { connection.getSources().forEach(source -> { if (source.getAddresses().isEmpty() || source.getAddresses().contains("")) { final String location = String.format("Source %d of connection <%s>", source.getIndex(), connection.getId()); throw emptyAddressesError(location, dittoHeaders); } }); connection.getTargets().forEach(target -> { if (target.getAddress().isEmpty()) { final String location = String.format("Targets of connection <%s>", connection.getId()); throw emptyAddressesError(location, dittoHeaders); } target.getTopics().forEach(topic -> topic.getFilter().ifPresent(filter -> { // will throw an InvalidRqlExpressionException if the RQL expression was not valid: queryFilterCriteriaFactory.filterCriteria(filter, dittoHeaders); })); }); }
private void handleSudoCountThings(final SudoCountThings command) { final Criteria filterCriteria = queryFilterCriteriaFactory.filterCriteria( command.getFilter().orElse(null), command.getDittoHeaders()); final QueryBuilder queryBuilder = queryBuilderFactory.newUnlimitedBuilder(filterCriteria); getSender().tell(queryBuilder.build(), getSelf()); }
private void handleSudoCountThings(final SudoCountThings command) { final Criteria filterCriteria = queryFilterCriteriaFactory.filterCriteria( command.getFilter().orElse(null), command.getDittoHeaders()); final QueryBuilder queryBuilder = queryBuilderFactory.newUnlimitedBuilder(filterCriteria); getSender().tell(queryBuilder.build(), getSelf()); }
private void handleSudoCountThings(final SudoCountThings command) { final Criteria criteria = queryFilterCriteriaFactory.filterCriteria( command.getFilter().orElse(null), command.getDittoHeaders()); final AggregationBuilder aggregationBuilder = aggregationBuilderFactory.newCountBuilder(criteria); aggregationBuilder.sudo(true); getSender().tell(aggregationBuilder.build(), getSelf()); }
private void handleSudoCountThings(final SudoCountThings command) { final Criteria criteria = queryFilterCriteriaFactory.filterCriteria( command.getFilter().orElse(null), command.getDittoHeaders()); final AggregationBuilder aggregationBuilder = aggregationBuilderFactory.newCountBuilder(criteria); aggregationBuilder.sudo(true); getSender().tell(aggregationBuilder.build(), getSelf()); }
queryFilterCriteriaFactory.filterCriteria(filterString, dittoHeaders);