/** * Create a {@code left in right or...} expression for each list * * @param <D> element type * @param left * @param lists * @return a {@code left in right or...} expression */ public static <D> Predicate inAny(Expression<D> left, Iterable<? extends Collection<? extends D>> lists) { BooleanBuilder rv = new BooleanBuilder(); for (Collection<? extends D> list : lists) { rv.or(in(left, list)); } return rv; }
@Test public void in() { assertEquals("str in [a, b, c]", ExpressionUtils.in(str, Arrays.asList("a","b","c")).toString()); }
@SuppressWarnings("unchecked") @Nullable protected Predicate createJoinFilter(QueryMetadata metadata) { Multimap<Expression<?>, Predicate> predicates = HashMultimap.create(); List<JoinExpression> joins = metadata.getJoins(); for (int i = joins.size() - 1; i >= 0; i--) { JoinExpression join = joins.get(i); Path<?> source = (Path) ((Operation<?>) join.getTarget()).getArg(0); Path<?> target = (Path) ((Operation<?>) join.getTarget()).getArg(1); Collection<Predicate> extraFilters = predicates.get(target.getRoot()); Predicate filter = ExpressionUtils.allOf(join.getCondition(), allOf(extraFilters)); List<? extends Object> ids = getIds(target.getType(), filter); if (ids.isEmpty()) { throw new NoResults(); } Path<?> path = ExpressionUtils.path(String.class, source, "$id"); predicates.put(source.getRoot(), ExpressionUtils.in((Path<Object>) path, ids)); } Path<?> source = (Path) ((Operation) joins.get(0).getTarget()).getArg(0); return allOf(predicates.get(source.getRoot())); }
@Test public void in_subQuery() { String s = ExpressionUtils.in(str, new SubQueryExpressionImpl<String>(String.class, new DefaultQueryMetadata())).toString(); assertTrue(s.startsWith("str in com.querydsl.core.DefaultQueryMetadata@c")); }
@SuppressWarnings("unchecked") @Nullable protected Predicate createJoinFilter(QueryMetadata metadata) { LinkedMultiValueMap<Expression<?>, Predicate> predicates = new LinkedMultiValueMap<>(); List<JoinExpression> joins = metadata.getJoins(); for (int i = joins.size() - 1; i >= 0; i--) { JoinExpression join = joins.get(i); Path<?> source = (Path) ((Operation<?>) join.getTarget()).getArg(0); Path<?> target = (Path) ((Operation<?>) join.getTarget()).getArg(1); Collection<Predicate> extraFilters = predicates.get(target.getRoot()); Predicate filter = ExpressionUtils.allOf(join.getCondition(), allOf(extraFilters)); List<? extends Object> ids = getIds(target.getType(), filter); if (ids.isEmpty()) { return ExpressionUtils.predicate(QuerydslMongoOps.NO_MATCH, source); } Path<?> path = ExpressionUtils.path(String.class, source, "$id"); predicates.add(source.getRoot(), ExpressionUtils.in((Path<Object>) path, ids)); } Path<?> source = (Path) ((Operation) joins.get(0).getTarget()).getArg(0); return allOf(predicates.get(source.getRoot())); }
sink.next(ExpressionUtils.in((Path<Object>) path, it)); });
@SuppressWarnings("unchecked") @Nullable protected Predicate createJoinFilter(QueryMetadata metadata) { LinkedMultiValueMap<Expression<?>, Predicate> predicates = new LinkedMultiValueMap<>(); List<JoinExpression> joins = metadata.getJoins(); for (int i = joins.size() - 1; i >= 0; i--) { JoinExpression join = joins.get(i); Path<?> source = (Path) ((Operation<?>) join.getTarget()).getArg(0); Path<?> target = (Path) ((Operation<?>) join.getTarget()).getArg(1); Collection<Predicate> extraFilters = predicates.get(target.getRoot()); Predicate filter = ExpressionUtils.allOf(join.getCondition(), allOf(extraFilters)); List<? extends Object> ids = getIds(target.getType(), filter); if (ids.isEmpty()) { return ExpressionUtils.predicate(QuerydslMongoOps.NO_MATCH, source); } Path<?> path = ExpressionUtils.path(String.class, source, "$id"); predicates.add(source.getRoot(), ExpressionUtils.in((Path<Object>) path, ids)); } Path<?> source = (Path) ((Operation) joins.get(0).getTarget()).getArg(0); return allOf(predicates.get(source.getRoot())); }
/** * Create a {@code left in right or...} expression for each list * * @param <D> element type * @param left * @param lists * @return a {@code left in right or...} expression */ public static <D> Predicate inAny(Expression<D> left, Iterable<? extends Collection<? extends D>> lists) { BooleanBuilder rv = new BooleanBuilder(); for (Collection<? extends D> list : lists) { rv.or(in(left, list)); } return rv; }
@Test public void or_in() { StringPath path = Expressions.stringPath("str"); Expression<?> expr = ExpressionUtils.anyOf( ExpressionUtils.in(path, Arrays.asList("1", "2", "3")), ExpressionUtils.in(path, Arrays.asList("4", "5", "6"))); SQLSerializer serializer = new SQLSerializer(Configuration.DEFAULT); serializer.handle(expr); assertEquals(Arrays.asList(path, path, path, path, path, path), serializer.getConstantPaths()); assertEquals(6, serializer.getConstants().size()); }
@Test public void in() { StringPath path = Expressions.stringPath("str"); Expression<?> expr = ExpressionUtils.in(path, Arrays.asList("1", "2", "3")); SQLSerializer serializer = new SQLSerializer(Configuration.DEFAULT); serializer.handle(expr); assertEquals(Arrays.asList(path, path, path), serializer.getConstantPaths()); assertEquals(3, serializer.getConstants().size()); }