BooleanExpression.java
package com.github.mygreen.sqlmapper.metamodel.expression;
import com.github.mygreen.sqlmapper.metamodel.Predicate;
import com.github.mygreen.sqlmapper.metamodel.operation.BooleanOperation;
import com.github.mygreen.sqlmapper.metamodel.operator.BooleanOp;
import com.github.mygreen.sqlmapper.metamodel.operator.UnaryOp;
/**
* ブーリアンによる式を表現します。
*
* @author T.TSUCHIE
*
*/
public abstract class BooleanExpression extends ComparableExpression<Boolean> implements Predicate {
public BooleanExpression(Expression<Boolean> mixin) {
super(mixin);
}
/**
* {@literal 左辺 == true} として比較する式を作成します。
* @return {@literal 左辺 = TRUE}
*/
public BooleanExpression isTrue() {
return eq(Constant.createBoolean(true));
}
/**
* {@literal 左辺 == false} として比較する式を作成します。
* @return {@literal 左辺 = FALSE}
*/
public BooleanExpression isFalse() {
return eq(Constant.createBoolean(false));
}
@Override
public BooleanExpression not() {
return new BooleanOperation(UnaryOp.NOT, mixin);
}
/**
* 右辺を論理席({@literal 左辺 AND 右辺})で評価します。
* @param right 右辺
* @return {@literal 左辺 AND 右辺}
*/
public BooleanExpression and(final Predicate right) {
if(right == null) {
// 右辺がnullの場合何もしない
return this;
}
return new BooleanOperation(BooleanOp.AND, mixin, right);
}
/**
* 右辺を論理和( {@literal 左辺 OR 右辺}) で評価します。
* @param right 右辺
* @return {@literal 左辺 OR 右辺}
*/
public BooleanExpression or(final Predicate right) {
if(right == null) {
// 右辺がnullの場合何もしない
return this;
}
return new BooleanOperation(BooleanOp.OR, mixin, right);
}
/**
* 引数で指定した全ての和({@literal OR})に対して積({@literal AND})を取ります。
* <p>例:{@literal 左辺 AND (A OR B OR C ...)}
*
* @param predicates 和(OR)を取る対象の式
* @return {@literal 左辺 AND (右辺1 OR 右辺2 OR 右辺3 ...)}
*/
public BooleanExpression andAnyOf(Predicate... predicates) {
if(predicates == null || predicates.length == 0) {
// 右辺がnullの場合何もしない
return this;
}
// 引数の述語をORで繋げる
Predicate right = null;
for(Predicate b : predicates) {
if(b != null) {
right = (right == null) ? b : new BooleanOperation(BooleanOp.OR, right, b);
}
}
return and(right);
}
/**
* 引数で指定した全ての積({@literal AND})に対して和({@literal OR})を取ります。
* <p>例:{@literal 左辺 OR (A AND B AND C ...)}
*
* @param predicates 和(AND)を取る対象の式
* @return {@literal 左辺 OR (右辺1 AND 右辺2 AND 右辺3 ...)}
*/
public BooleanExpression orAllOf(final Predicate... predicates) {
if(predicates == null || predicates.length == 0) {
// 右辺がnullの場合何もしない
return this;
}
// 引数の述語をANDで繋げる
Predicate right = null;
for(Predicate b : predicates) {
if(b != null) {
right = (right == null) ? b : new BooleanOperation(BooleanOp.AND, right, b);
}
}
return or(right);
}
}