code: public static <T> Expression<T> dnf(Operator operator, Expression<T> existing, Expression<T> newExpression) {
      if (!(operator == Operators.AND || operator == Operators.OR)) {
        throw new IllegalArgumentException(String.format("Expected %s for operator but got %s",
                Arrays.asList(Operators.AND, Operators.OR), operator));
      }
  
      if (isNil(existing)) {
        return DnfExpression.<T>create().and(newExpression);
      }
  
      if (!(existing instanceof DnfExpression)) {
        throw new IllegalStateException(String.format("Expected existing expression to be %s but was %s",
                DnfExpression.class.getName(), existing.getClass().getName()));
      }
  
      @SuppressWarnings("unchecked")
      final DnfExpression<T> conjunction = (DnfExpression<T>) existing;
      return operator == Operators.AND ? conjunction.and(newExpression) : conjunction.or(newExpression);
    }
docs: Combines expressions <a href="https://en.wikipedia.org/wiki/Disjunctive_normal_form">Disjunctive normal form</a>