|  | 
| 2 | 2 | 
 | 
| 3 | 3 | import static io.github.perplexhub.rsql.RSQLOperators.*; | 
| 4 | 4 | 
 | 
|  | 5 | +import cz.jirutka.rsql.parser.ast.LogicalNode; | 
| 5 | 6 | import java.util.*; | 
|  | 7 | +import java.util.function.BiFunction; | 
| 6 | 8 | import java.util.function.Function; | 
| 7 | 9 | import java.util.stream.Collectors; | 
| 8 | 10 | 
 | 
| @@ -429,14 +431,24 @@ private Predicate equalPredicate(Expression expr, Class type, Object argument) { | 
| 429 | 431 | 	@Override | 
| 430 | 432 | 	public Predicate visit(AndNode node, From root) { | 
| 431 | 433 | 		log.debug("visit(node:{},root:{})", node, root); | 
| 432 |  | - | 
| 433 |  | -		return node.getChildren().stream().map(n -> n.accept(this, root)).collect(Collectors.reducing(builder::and)).get(); | 
|  | 434 | +		return visitChildren(node, root, builder::and); | 
| 434 | 435 | 	} | 
| 435 | 436 | 
 | 
| 436 | 437 | 	@Override | 
| 437 | 438 | 	public Predicate visit(OrNode node, From root) { | 
| 438 | 439 | 		log.debug("visit(node:{},root:{})", node, root); | 
|  | 440 | +		return visitChildren(node, root, builder::or); | 
|  | 441 | +	} | 
|  | 442 | + | 
|  | 443 | +	private Predicate visitChildren(LogicalNode node, From root, BiFunction<Predicate, Predicate, Predicate> reducer) { | 
|  | 444 | +		Predicate result = null; | 
|  | 445 | + | 
|  | 446 | +		for (var child : node) { | 
|  | 447 | +			result = result != null  | 
|  | 448 | +					? reducer.apply(result, child.accept(this, root)) | 
|  | 449 | +					: child.accept(this, root); | 
|  | 450 | +		} | 
| 439 | 451 | 
 | 
| 440 |  | -		return node.getChildren().stream().map(n -> n.accept(this, root)).collect(Collectors.reducing(builder::or)).get(); | 
|  | 452 | +		return result; | 
| 441 | 453 | 	} | 
| 442 | 454 | } | 
0 commit comments