@Override public FilterExpression parseGlobalExpression(String path, MultivaluedMap<String, String> queryParams) throws ParseException { if (joinDialects.isEmpty()) { throw new ParseException("Heterogeneous type filtering not supported"); } return parseExpression(joinDialects, (dialect) -> dialect.parseGlobalExpression(path, queryParams)); }
public RSQLFilterDialect(EntityDictionary dictionary) { this(dictionary, new CaseSensitivityStrategy.FIQLCompliant()); }
@Override public Map<String, FilterExpression> parseTypedExpression(String path, MultivaluedMap<String, String> queryParams) throws ParseException { if (subqueryDialects.isEmpty()) { throw new ParseException("Type filtering not supported"); } return parseExpression(subqueryDialects, (dialect) -> dialect.parseTypedExpression(path, queryParams)); }
@Override public Elide provide() { EntityDictionary dictionary = new EntityDictionary(TestCheckMappings.MAPPINGS); DefaultFilterDialect defaultFilterStrategy = new DefaultFilterDialect(dictionary); RSQLFilterDialect rsqlFilterStrategy = new RSQLFilterDialect(dictionary); MultipleFilterDialect multipleFilterStrategy = new MultipleFilterDialect( Arrays.asList(rsqlFilterStrategy, defaultFilterStrategy), Arrays.asList(rsqlFilterStrategy, defaultFilterStrategy) ); return new Elide(new ElideSettingsBuilder(AbstractIntegrationTestInitializer.getDatabaseManager()) .withAuditLogger(auditLogger) .withJoinFilterDialect(multipleFilterStrategy) .withSubqueryFilterDialect(multipleFilterStrategy) .withEntityDictionary(dictionary) .build()); }
private static <T, R> R parseExpression(List<T> dialects, ParseFunction<T, R> parseFunction) throws ParseException { ParseException lastFailure = null; for (T dialect : dialects) { try { return parseFunction.apply(dialect); } catch (ParseException e) { if (log.isTraceEnabled()) { log.trace("Parse Failure: {}", e.getMessage()); } if (lastFailure != null) { lastFailure = new ParseException(e.getMessage() + "\n" + lastFailure.getMessage()); } else { lastFailure = e; } } } if (lastFailure == null) { lastFailure = new ParseException("No dialects"); } throw lastFailure; }
public MultipleFilterDialect(EntityDictionary dictionary) { DefaultFilterDialect defaultDialect = new DefaultFilterDialect(dictionary); joinDialects = new ArrayList<>(); joinDialects.add(defaultDialect); subqueryDialects = new ArrayList<>(); subqueryDialects.add(defaultDialect); }
@Override public Map<String, FilterExpression> parseTypedExpression(String path, MultivaluedMap<String, String> filterParams) throws ParseException { Map<String, FilterExpression> expressionMap = new HashMap<>(); List<FilterPredicate> filterPredicates = extractPredicates(filterParams); for (FilterPredicate filterPredicate : filterPredicates) { if (FilterPredicate.toManyInPath(dictionary, filterPredicate.getPath())) { throw new ParseException("Invalid toMany join: " + filterPredicate); } String entityType = dictionary.getJsonAliasFor(filterPredicate.getEntityType()); FilterExpression filterExpression = expressionMap.get(entityType); if (filterExpression != null) { expressionMap.put(entityType, new AndFilterExpression(filterExpression, filterPredicate)); } else { expressionMap.put(entityType, filterPredicate); } } return expressionMap; }
public RSQLFilterDialect(EntityDictionary dictionary, CaseSensitivityStrategy caseSensitivityStrategy) { parser = new RSQLParser(getDefaultOperatorsWithIsnull()); this.dictionary = dictionary; this.caseSensitivityStrategy = caseSensitivityStrategy; }
@Override public FilterExpression visit(OrNode node, Class entityType) { List<Node> children = node.getChildren(); if (children.size() < 2) { throw new RSQLParseException("Logical OR requires two arguments"); } FilterExpression left = children.get(0).accept(this, entityType); FilterExpression right = children.get(1).accept(this, entityType); OrFilterExpression orFilterExpression = new OrFilterExpression(left, right); for (int idx = 2; idx < children.size(); idx++) { right = children.get(idx).accept(this, entityType); orFilterExpression = new OrFilterExpression(orFilterExpression, right); } return orFilterExpression; }
@Override public Elide provide() { EntityDictionary dictionary = new EntityDictionary(new HashMap<>()); DefaultFilterDialect defaultFilterStrategy = new DefaultFilterDialect(dictionary); RSQLFilterDialect rsqlFilterStrategy = new RSQLFilterDialect(dictionary); MultipleFilterDialect multipleFilterStrategy = new MultipleFilterDialect( Arrays.asList(rsqlFilterStrategy, defaultFilterStrategy), Arrays.asList(rsqlFilterStrategy, defaultFilterStrategy) ); return new Elide(new ElideSettingsBuilder(AbstractIntegrationTestInitializer.getDatabaseManager()) .withAuditLogger(auditLogger) .withJoinFilterDialect(multipleFilterStrategy) .withSubqueryFilterDialect(multipleFilterStrategy) .withEntityDictionary(dictionary) .withUpdate200Status() .build()); }
@Override public FilterExpression parseGlobalExpression(String path, MultivaluedMap<String, String> queryParams) throws ParseException { if (joinDialects.isEmpty()) { throw new ParseException("Heterogeneous type filtering not supported"); } return parseExpression(joinDialects, (dialect) -> dialect.parseGlobalExpression(path, queryParams)); }
@Override public Map<String, FilterExpression> parseTypedExpression(String path, MultivaluedMap<String, String> queryParams) throws ParseException { if (subqueryDialects.isEmpty()) { throw new ParseException("Type filtering not supported"); } return parseExpression(subqueryDialects, (dialect) -> dialect.parseTypedExpression(path, queryParams)); }
private static <T, R> R parseExpression(List<T> dialects, ParseFunction<T, R> parseFunction) throws ParseException { ParseException lastFailure = null; for (T dialect : dialects) { try { return parseFunction.apply(dialect); } catch (ParseException e) { if (log.isTraceEnabled()) { log.trace("Parse Failure: {}", e.getMessage()); } if (lastFailure != null) { lastFailure = new ParseException(e.getMessage() + "\n" + lastFailure.getMessage()); } else { lastFailure = e; } } } if (lastFailure == null) { lastFailure = new ParseException("No dialects"); } throw lastFailure; }
public MultipleFilterDialect(EntityDictionary dictionary) { DefaultFilterDialect defaultDialect = new DefaultFilterDialect(dictionary); joinDialects = new ArrayList<>(); joinDialects.add(defaultDialect); subqueryDialects = new ArrayList<>(); subqueryDialects.add(defaultDialect); }
@Override public Map<String, FilterExpression> parseTypedExpression(String path, MultivaluedMap<String, String> filterParams) throws ParseException { Map<String, FilterExpression> expressionMap = new HashMap<>(); List<FilterPredicate> filterPredicates = extractPredicates(filterParams); for (FilterPredicate filterPredicate : filterPredicates) { if (FilterPredicate.toManyInPath(dictionary, filterPredicate.getPath())) { throw new ParseException("Invalid toMany join: " + filterPredicate); } String entityType = dictionary.getJsonAliasFor(filterPredicate.getEntityType()); FilterExpression filterExpression = expressionMap.get(entityType); if (filterExpression != null) { expressionMap.put(entityType, new AndFilterExpression(filterExpression, filterPredicate)); } else { expressionMap.put(entityType, filterPredicate); } } return expressionMap; }
public RSQLFilterDialect(EntityDictionary dictionary) { this(dictionary, new CaseSensitivityStrategy.FIQLCompliant()); }
public RSQLFilterDialect(EntityDictionary dictionary, CaseSensitivityStrategy caseSensitivityStrategy) { parser = new RSQLParser(getDefaultOperatorsWithIsnull()); this.dictionary = dictionary; this.caseSensitivityStrategy = caseSensitivityStrategy; }
@Override public Elide provide() { EntityDictionary dictionary = new EntityDictionary(TestCheckMappings.MAPPINGS); DefaultFilterDialect defaultFilterStrategy = new DefaultFilterDialect(dictionary); RSQLFilterDialect rsqlFilterStrategy = new RSQLFilterDialect(dictionary); MultipleFilterDialect multipleFilterStrategy = new MultipleFilterDialect( Arrays.asList(rsqlFilterStrategy, defaultFilterStrategy), Arrays.asList(rsqlFilterStrategy, defaultFilterStrategy) ); return new Elide(new ElideSettingsBuilder(AbstractIntegrationTestInitializer.getDatabaseManager()) .withAuditLogger(auditLogger) .withJoinFilterDialect(multipleFilterStrategy) .withSubqueryFilterDialect(multipleFilterStrategy) .withEntityDictionary(dictionary) .withReturnErrorObjects(true) .build()); }
public ElideSettings build() { if (joinFilterDialects.isEmpty()) { joinFilterDialects.add(new DefaultFilterDialect(entityDictionary)); } if (subqueryFilterDialects.isEmpty()) { subqueryFilterDialects.add(new DefaultFilterDialect(entityDictionary)); } return new ElideSettings( auditLogger, dataStore, entityDictionary, jsonApiMapper, permissionExecutorFunction, joinFilterDialects, subqueryFilterDialects, defaultMaxPageSize, defaultPageSize, useFilterExpressions, updateStatusCode, returnErrorObjects, serdes); }
public ElideSettings build() { if (joinFilterDialects.isEmpty()) { joinFilterDialects.add(new DefaultFilterDialect(entityDictionary)); } if (subqueryFilterDialects.isEmpty()) { subqueryFilterDialects.add(new DefaultFilterDialect(entityDictionary)); } return new ElideSettings( auditLogger, dataStore, entityDictionary, jsonApiMapper, permissionExecutorFunction, joinFilterDialects, subqueryFilterDialects, defaultMaxPageSize, defaultPageSize, useFilterExpressions, updateStatusCode, returnErrorObjects, serdes); }