BooleanExpression.java

  1. package com.github.mygreen.sqlmapper.metamodel.expression;

  2. import com.github.mygreen.sqlmapper.metamodel.Predicate;
  3. import com.github.mygreen.sqlmapper.metamodel.operation.BooleanOperation;
  4. import com.github.mygreen.sqlmapper.metamodel.operator.BooleanOp;
  5. import com.github.mygreen.sqlmapper.metamodel.operator.UnaryOp;

  6. /**
  7.  * ブーリアンによる式を表現します。
  8.  *
  9.  * @author T.TSUCHIE
  10.  *
  11.  */
  12. public abstract class BooleanExpression extends ComparableExpression<Boolean> implements Predicate {

  13.     public BooleanExpression(Expression<Boolean> mixin) {
  14.         super(mixin);
  15.     }

  16.     /**
  17.      * {@literal 左辺 == true} として比較する式を作成します。
  18.      * @return {@literal 左辺 = TRUE}
  19.      */
  20.     public BooleanExpression isTrue() {
  21.         return eq(Constant.createBoolean(true));
  22.     }

  23.     /**
  24.      * {@literal 左辺 == false} として比較する式を作成します。
  25.      * @return {@literal 左辺 = FALSE}
  26.      */
  27.     public BooleanExpression isFalse() {
  28.         return eq(Constant.createBoolean(false));
  29.     }

  30.     @Override
  31.     public BooleanExpression not() {
  32.         return new BooleanOperation(UnaryOp.NOT, mixin);
  33.     }

  34.     /**
  35.      * 右辺を論理席({@literal 左辺 AND 右辺})で評価します。
  36.      * @param right 右辺
  37.      * @return {@literal 左辺 AND 右辺}
  38.      */
  39.     public BooleanExpression and(final Predicate right) {
  40.         if(right == null) {
  41.             // 右辺がnullの場合何もしない
  42.             return this;
  43.         }
  44.         return new BooleanOperation(BooleanOp.AND, mixin, right);
  45.     }

  46.     /**
  47.      * 右辺を論理和( {@literal 左辺 OR 右辺}) で評価します。
  48.      * @param right 右辺
  49.      * @return {@literal 左辺 OR 右辺}
  50.      */
  51.     public BooleanExpression or(final Predicate right) {
  52.         if(right == null) {
  53.             // 右辺がnullの場合何もしない
  54.             return this;
  55.         }
  56.         return new BooleanOperation(BooleanOp.OR, mixin, right);
  57.     }

  58.     /**
  59.      * 引数で指定した全ての和({@literal OR})に対して積({@literal AND})を取ります。
  60.      * <p>例:{@literal 左辺 AND (A OR B OR C ...)}
  61.      *
  62.      * @param predicates 和(OR)を取る対象の式
  63.      * @return {@literal 左辺 AND (右辺1 OR 右辺2 OR 右辺3 ...)}
  64.      */
  65.     public BooleanExpression andAnyOf(Predicate... predicates) {
  66.         if(predicates == null || predicates.length == 0) {
  67.             // 右辺がnullの場合何もしない
  68.             return this;

  69.         }

  70.         // 引数の述語をORで繋げる
  71.         Predicate right = null;
  72.         for(Predicate b : predicates) {
  73.             if(b != null) {
  74.                 right = (right == null) ? b : new BooleanOperation(BooleanOp.OR, right, b);
  75.             }
  76.         }

  77.         return and(right);
  78.     }

  79.     /**
  80.      * 引数で指定した全ての積({@literal AND})に対して和({@literal OR})を取ります。
  81.      * <p>例:{@literal 左辺 OR (A AND B AND C ...)}
  82.      *
  83.      * @param predicates 和(AND)を取る対象の式
  84.      * @return {@literal 左辺 OR (右辺1 AND 右辺2 AND 右辺3 ...)}
  85.      */
  86.     public BooleanExpression orAllOf(final Predicate... predicates) {
  87.         if(predicates == null || predicates.length == 0) {
  88.             // 右辺がnullの場合何もしない
  89.             return this;
  90.         }

  91.         // 引数の述語をANDで繋げる
  92.         Predicate right = null;
  93.         for(Predicate b : predicates) {
  94.             if(b != null) {
  95.                 right = (right == null) ? b : new BooleanOperation(BooleanOp.AND, right, b);
  96.             }
  97.         }

  98.         return or(right);
  99.     }

  100. }