14 — Advanced
Condition Composition
Conditions in rulii support logical composition using and(), or(), not(), and xor(). This lets you build complex boolean expressions from simple conditions without writing nested logic.
Available Operators
and()
Both conditions must be true
or()
At least one condition must be true
not()
Negates the condition
xor()
Exactly one must be true, not both
Basic Composition
import static org.rulii.model.condition.Conditions.condition;
Condition isAdult = condition((Integer age) -> age >= 18);
Condition isActive = condition((String status) -> "active".equals(status));
// AND: both must be true
Condition eligible = isAdult.and(isActive);
// OR: at least one must be true
Condition canView = isAdult.or(isActive);
// NOT: negate a condition
Condition isMinor = isAdult.not();
// XOR: exactly one must be true
Condition exclusive = isAdult.xor(isActive);
Using in Rules
Condition isAdult = condition((Integer age) -> age >= 18);
Condition hasConsent = condition((Boolean consent) -> consent);
// Compose: must be adult AND have consent
Rule rule = Rule.builder()
.name("EligibilityCheck")
.given(isAdult.and(hasConsent))
.then(action(() -> System.out.println("Approved")))
.otherwise(action(() -> System.out.println("Denied")))
.build();
rule.run(age -> 25, consent -> true); // Approved
rule.run(age -> 25, consent -> false); // Denied
rule.run(age -> 15, consent -> true); // Denied
Chaining Multiple Operators
Condition isAdult = condition((Integer age) -> age >= 18);
Condition isVIP = condition((Boolean vip) -> vip);
Condition hasTicket = condition((Boolean ticket) -> ticket);
// Complex: (adult AND hasTicket) OR isVIP
Condition canEnter = isAdult.and(hasTicket).or(isVIP);
CompositeCondition
The result of and(), or(), and xor() is a CompositeCondition that you can inspect:
CompositeCondition composed = isAdult.and(isActive);
composed.getSymbol(); // "&&"
composed.getLeftOperand(); // isAdult
composed.getRightOperand(); // isActive
Built-in Constants
// A condition that always returns true
Condition alwaysTrue = Conditions.TRUE();
// Useful as a default or placeholder
Rule rule = Rule.builder()
.name("AlwaysRun")
.given(Conditions.TRUE())
.then(action(() -> { /* always executes */ }))
.build();