├── BooleanEvaluate.cls-meta.xml
├── BooleanEvaluateTest.cls-meta.xml
├── README.md
├── BooleanEvaluateTest.cls
└── BooleanEvaluate.cls
/BooleanEvaluate.cls-meta.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 57.0
4 | Active
5 |
6 |
--------------------------------------------------------------------------------
/BooleanEvaluateTest.cls-meta.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 57.0
4 | Active
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Apex code for boolean expression evaluation
2 |
3 | # Usage:
4 | This class one public static method
5 |
6 | ### First:
7 | ```java
8 | public Boolean BooleanEvaluate.evaluate(String expression, Boolean[] values){ ... }
9 | ```
10 | The parameter 'expression' must be using ordinal numbers according to the parameter 'values' (Examples below)
11 |
12 | # Examples
13 |
14 | ### First:
15 |
16 | ```java
17 | List values = new List{
18 | true, false, true, true, false, true, true, true
19 | };
20 |
21 | String expression = '1 && ( ( 2 || 3 ) && 6 ) && ( 4 && 5 || ( 7 && 8 ) )';
22 |
23 | Boolean result = BooleanEvaluate.evaluate(expression, values);
24 | ```
25 |
--------------------------------------------------------------------------------
/BooleanEvaluateTest.cls:
--------------------------------------------------------------------------------
1 | /**
2 | * @author: Heitor Araujo on 24/10/2017.
3 | */
4 |
5 | @IsTest
6 | private class BooleanEvaluateTest {
7 |
8 | @IsTest
9 | static void evaluateTest(){
10 |
11 | Boolean result1 = BooleanEvaluate.evaluate(
12 | '1 AND 2',
13 | new List { true, true }
14 | );
15 |
16 | Assert.areEqual(true, result1);
17 |
18 | Boolean result2 = BooleanEvaluate.evaluate(
19 | '1 AND 2 AND ( 3 OR 4 )',
20 | new List { true, true, true, false }
21 | );
22 |
23 | Assert.areEqual(true, result2);
24 |
25 | Boolean result3 = BooleanEvaluate.evaluate(
26 | '1 AND 2 AND ( 3 OR 4 )',
27 | new List { false, true, true, false }
28 | );
29 |
30 | Assert.areEqual(false, result3);
31 |
32 | Boolean result4 = BooleanEvaluate.evaluate(
33 | '1 AND ( 2 AND ( 3 OR 4 ) )',
34 | new List { true, true, true, false }
35 | );
36 |
37 | Assert.areEqual(true, result4);
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/BooleanEvaluate.cls:
--------------------------------------------------------------------------------
1 | /**
2 | * @author: Heitor Araujo on 24/10/2017.
3 | */
4 |
5 | public with sharing class BooleanEvaluate {
6 |
7 | private static final String ANDv = 'AND';
8 | private static final String ORv = 'OR';
9 | private static final String OPEN = '(';
10 | private static final String CLOSE = ')';
11 |
12 | /**
13 | * @description Evaluates a boolean expression to a boolean result
14 | * @param expression Expression [eg. `1 || ( 2 && 3 )` ]
15 | * @param values List of boolean values to be evaluated with the expression
16 | * @return final boolean evaluation
17 | */
18 | public static Boolean evaluate(String expression, Boolean[] values){
19 | expression = expression.replaceAll('\\|\\|', 'OR').replaceAll('&&', 'AND');
20 | expression = formatExpression(expression, values);
21 |
22 | if(!expression.contains(OPEN)){
23 | return evaluateExpression(expression);
24 | }
25 |
26 | Integer indexOfOpen = -1;
27 | Integer indexOfClose = -1;
28 |
29 | String[] chars = expression.split('');
30 | for(Integer i = 0; i < chars.size(); i++){
31 |
32 | String singleChar = chars[i];
33 |
34 | if(singleChar == OPEN) {
35 | indexOfOpen = i;
36 | continue;
37 | }
38 |
39 | if(singleChar == CLOSE) {
40 | indexOfClose = i;
41 | break;
42 | }
43 | }
44 |
45 | String replace = expression.substring(indexOfOpen + 1 , indexOfClose);
46 | expression = expression.replace( OPEN + replace + CLOSE, String.valueOf( evaluateExpression(replace) ) );
47 | return evaluate(expression, values);
48 | }
49 |
50 | private static Boolean evaluateExpression(String expression){
51 |
52 | Boolean result = false;
53 | for( String conj : expression.split(ORv) ){
54 |
55 | Boolean b = true;
56 | for( String single : conj.split(ANDv) ){
57 | b &= Boolean.valueOf(single.trim());
58 | }
59 |
60 | result |= b;
61 | }
62 |
63 | return result;
64 |
65 | }
66 |
67 | private static String formatExpression(String originalExpression, Boolean[] values){
68 |
69 | String formattedExpression = originalExpression;
70 | String[] arguments = formattedExpression.split(' ');
71 | for(String arg : arguments){
72 | try{
73 | Integer index = Integer.valueOf(arg);
74 | formattedExpression = formattedExpression.replace(arg, String.valueOf(values[index - 1]));
75 | }catch(Exception e){
76 | continue;
77 | }
78 | }
79 | return formattedExpression;
80 | }
81 | }
82 |
--------------------------------------------------------------------------------