├── 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 | --------------------------------------------------------------------------------