View Javadoc
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    * Disjunction.
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  }