@Override public FilterExpression visit(AndNode node, Class entityType) { List<Node> children = node.getChildren(); if (children.size() < 2) { throw new RSQLParseException("Logical AND requires two arguments"); } FilterExpression left = children.get(0).accept(this, entityType); FilterExpression right = children.get(1).accept(this, entityType); AndFilterExpression andFilterExpression = new AndFilterExpression(left, right); for (int idx = 2; idx < children.size(); idx++) { right = children.get(idx).accept(this, entityType); andFilterExpression = new AndFilterExpression(andFilterExpression, right); } return andFilterExpression; }
@Override public FilterExpression visitAndExpression(AndFilterExpression expression) { return new AndFilterExpression( expression.getLeft().accept(this), expression.getRight().accept(this)); }
@Override public FilterExpression visit(AndNode node, Class entityType) { List<Node> children = node.getChildren(); if (children.size() < 2) { throw new RSQLParseException("Logical AND requires two arguments"); } FilterExpression left = children.get(0).accept(this, entityType); FilterExpression right = children.get(1).accept(this, entityType); AndFilterExpression andFilterExpression = new AndFilterExpression(left, right); for (int idx = 2; idx < children.size(); idx++) { right = children.get(idx).accept(this, entityType); andFilterExpression = new AndFilterExpression(andFilterExpression, right); } return andFilterExpression; }
@Override public FilterExpression visitAndExpression(AndFilterExpression expression) { FilterExpression left = expression.getLeft(); FilterExpression right = expression.getRight(); return new AndFilterExpression(left.accept(this), right.accept(this)); }
/** * Get the global/cross-type filter expression. * @param loadClass Entity class * @return The global filter expression evaluated at the first load */ public Optional<FilterExpression> getLoadFilterExpression(Class<?> loadClass) { Optional<FilterExpression> permissionFilter; permissionFilter = getPermissionExecutor().getReadPermissionFilter(loadClass); Optional<FilterExpression> globalFilterExpressionOptional = null; if (globalFilterExpression == null) { String typeName = dictionary.getJsonAliasFor(loadClass); globalFilterExpressionOptional = getFilterExpressionByType(typeName); } else { globalFilterExpressionOptional = Optional.of(globalFilterExpression); } if (globalFilterExpressionOptional.isPresent() && permissionFilter.isPresent()) { return Optional.of(new AndFilterExpression(globalFilterExpressionOptional.get(), permissionFilter.get())); } if (globalFilterExpressionOptional.isPresent()) { return globalFilterExpressionOptional; } if (permissionFilter.isPresent()) { return permissionFilter; } return Optional.empty(); }
@Override public FilterExpression visitAndExpression(AndFilterExpression expression) { FilterExpression left = expression.getLeft(); FilterExpression right = expression.getRight(); return new AndFilterExpression(left.accept(this), right.accept(this)); }
/** * Get the global/cross-type filter expression. * @param loadClass Entity class * @return The global filter expression evaluated at the first load */ public Optional<FilterExpression> getLoadFilterExpression(Class<?> loadClass) { Optional<FilterExpression> permissionFilter; permissionFilter = getPermissionExecutor().getReadPermissionFilter(loadClass); Optional<FilterExpression> globalFilterExpressionOptional = null; if (globalFilterExpression == null) { String typeName = dictionary.getJsonAliasFor(loadClass); globalFilterExpressionOptional = getFilterExpressionByType(typeName); } else { globalFilterExpressionOptional = Optional.of(globalFilterExpression); } if (globalFilterExpressionOptional.isPresent() && permissionFilter.isPresent()) { return Optional.of(new AndFilterExpression(globalFilterExpressionOptional.get(), permissionFilter.get())); } if (globalFilterExpressionOptional.isPresent()) { return globalFilterExpressionOptional; } if (permissionFilter.isPresent()) { return permissionFilter; } return Optional.empty(); }
@Override public FilterExpression visitAndExpression(AndFilterExpression expression) { return new AndFilterExpression( expression.getLeft().accept(this), expression.getRight().accept(this)); }
@Override public Object loadObject(Class<?> entityClass, Serializable id, Optional<FilterExpression> filterExpression, RequestScope scope) { Class idType = dictionary.getIdType(entityClass); String idField = dictionary.getIdFieldName(entityClass); FilterExpression idFilter = new InPredicate( new Path.PathElement(entityClass, idType, idField), id ); FilterExpression joinedFilterExpression = filterExpression .map(fe -> (FilterExpression) new AndFilterExpression(idFilter, fe)) .orElse(idFilter); Iterable<Object> results = loadObjects(entityClass, Optional.of(joinedFilterExpression), Optional.empty(), Optional.empty(), scope); Iterator<Object> it = results == null ? null : results.iterator(); if (it != null && it.hasNext()) { return it.next(); } return null; }
@Override public FilterExpression visitNotExpression(NotFilterExpression fe) { FilterExpression inner = fe.getNegated(); if (inner instanceof AndFilterExpression) { AndFilterExpression and = (AndFilterExpression) inner; FilterExpression left = new NotFilterExpression(and.getLeft()).accept(this); FilterExpression right = new NotFilterExpression(and.getRight()).accept(this); return new OrFilterExpression(left, right); } if (inner instanceof OrFilterExpression) { OrFilterExpression or = (OrFilterExpression) inner; FilterExpression left = new NotFilterExpression(or.getLeft()).accept(this); FilterExpression right = new NotFilterExpression(or.getRight()).accept(this); return new AndFilterExpression(left, right); } if (inner instanceof NotFilterExpression) { NotFilterExpression not = (NotFilterExpression) inner; return (not.getNegated()).accept(this); } if (inner instanceof FilterPredicate) { FilterPredicate filter = (FilterPredicate) inner; return filter.negate(); } return inner; } }
@Override public Object loadObject(Class<?> entityClass, Serializable id, Optional<FilterExpression> filterExpression, RequestScope scope) { Class idType = dictionary.getIdType(entityClass); String idField = dictionary.getIdFieldName(entityClass); FilterExpression idFilter = new InPredicate( new Path.PathElement(entityClass, idType, idField), id ); FilterExpression joinedFilterExpression = filterExpression .map(fe -> (FilterExpression) new AndFilterExpression(idFilter, fe)) .orElse(idFilter); Iterable<Object> results = loadObjects(entityClass, Optional.of(joinedFilterExpression), Optional.empty(), Optional.empty(), scope); Iterator<Object> it = results == null ? null : results.iterator(); if (it != null && it.hasNext()) { return it.next(); } return null; }
@Override public FilterExpression visitNotExpression(NotFilterExpression fe) { FilterExpression inner = fe.getNegated(); if (inner instanceof AndFilterExpression) { AndFilterExpression and = (AndFilterExpression) inner; FilterExpression left = new NotFilterExpression(and.getLeft()).accept(this); FilterExpression right = new NotFilterExpression(and.getRight()).accept(this); return new OrFilterExpression(left, right); } if (inner instanceof OrFilterExpression) { OrFilterExpression or = (OrFilterExpression) inner; FilterExpression left = new NotFilterExpression(or.getLeft()).accept(this); FilterExpression right = new NotFilterExpression(or.getRight()).accept(this); return new AndFilterExpression(left, right); } if (inner instanceof NotFilterExpression) { NotFilterExpression not = (NotFilterExpression) inner; return (not.getNegated()).accept(this); } if (inner instanceof FilterPredicate) { FilterPredicate filter = (FilterPredicate) inner; return filter.negate(); } return inner; } }
@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; }