1 package org.wikimedia.search.extra.regex.expression;
2
3 import java.util.List;
4
5 import com.google.common.collect.ImmutableSet;
6
7
8
9
10 public final class Or<T> extends AbstractCompositeExpression<T> {
11 public static <T> Expression<T> fromExpressionSources(List<? extends ExpressionSource<T>> sources) {
12 switch (sources.size()) {
13 case 0:
14 return True.instance();
15 case 1:
16 return sources.get(0).expression();
17 default:
18 ImmutableSet.Builder<Expression<T>> or = ImmutableSet.builder();
19 for (ExpressionSource<T> source : sources) {
20 or.add(source.expression());
21 }
22 return new Or<>(or.build()).simplify();
23 }
24 }
25
26 @SafeVarargs
27 public Or(Expression<T>... components) {
28 this(ImmutableSet.copyOf(components));
29 }
30
31 public Or(ImmutableSet<Expression<T>> components) {
32 super(components);
33 }
34
35 @Override
36 protected boolean doesNotAffectOutcome(Expression<T> expression) {
37 return expression.alwaysFalse();
38 }
39
40 @Override
41 protected Expression<T> componentForcesOutcome(Expression<T> expression) {
42 if (expression.alwaysTrue()) {
43 return expression;
44 }
45 return null;
46 }
47
48 @Override
49 protected AbstractCompositeExpression<T> newFrom(ImmutableSet<Expression<T>> components) {
50 return new Or<>(components);
51 }
52
53 @Override
54 protected String toStringJoiner() {
55 return " OR ";
56 }
57
58 @Override
59 public <J> J transform(Expression.Transformer<T, J> transformer) {
60 return transformer.or(transformComponents(transformer));
61 }
62 }