a fork of EvalEx by ezylang with a handful of breaking changes
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Try using a FAST_PATH in DefaultEvaluationValueConverter for common types.

+57 -12
+57 -12
src/main/java/com/ezylang/evalex/data/conversion/DefaultEvaluationValueConverter.java
··· 18 18 import com.ezylang.evalex.config.ExpressionConfiguration; 19 19 import com.ezylang.evalex.data.EvaluationValue; 20 20 import com.ezylang.evalex.data.types.NullValue; 21 - import java.util.Arrays; 22 - import java.util.List; 21 + import com.ezylang.evalex.parser.ASTNode; 22 + import com.ezylang.evalex.parser.InlinedASTNode; 23 + import java.math.BigDecimal; 24 + import java.time.Duration; 25 + import java.time.Instant; 26 + import java.util.*; 23 27 24 28 /** 25 29 * The default implementation of the {@link EvaluationValueConverterIfc}, used in the standard ··· 56 60 */ 57 61 public class DefaultEvaluationValueConverter implements EvaluationValueConverterIfc { 58 62 63 + public static final NumberConverter NUMBER_CONVERTER = new NumberConverter(); 64 + public static final StringConverter STRING_CONVERTER = new StringConverter(); 65 + public static final BooleanConverter BOOLEAN_CONVERTER = new BooleanConverter(); 66 + public static final DateTimeConverter DATE_TIME_CONVERTER = new DateTimeConverter(); 67 + public static final DurationConverter DURATION_CONVERTER = new DurationConverter(); 68 + public static final ExpressionNodeConverter EXPRESSION_NODE_CONVERTER = 69 + new ExpressionNodeConverter(); 70 + public static final ArrayConverter ARRAY_CONVERTER = new ArrayConverter(); 71 + public static final StructureConverter STRUCTURE_CONVERTER = new StructureConverter(); 72 + 59 73 static final List<ConverterIfc> converters = 60 74 Arrays.asList( 61 - new NumberConverter(), 62 - new StringConverter(), 63 - new BooleanConverter(), 64 - new DateTimeConverter(), 65 - new DurationConverter(), 66 - new ExpressionNodeConverter(), 67 - new ArrayConverter(), 68 - new StructureConverter()); 75 + NUMBER_CONVERTER, 76 + STRING_CONVERTER, 77 + BOOLEAN_CONVERTER, 78 + DATE_TIME_CONVERTER, 79 + DURATION_CONVERTER, 80 + EXPRESSION_NODE_CONVERTER, 81 + ARRAY_CONVERTER, 82 + STRUCTURE_CONVERTER); 83 + 84 + static final Map<Class<?>, ConverterIfc> FAST_PATH; 85 + 86 + static { 87 + IdentityHashMap<Class<?>, ConverterIfc> fastPath = new IdentityHashMap<>(); 88 + fastPath.put(BigDecimal.class, NUMBER_CONVERTER); 89 + fastPath.put(Double.class, NUMBER_CONVERTER); 90 + fastPath.put(Float.class, NUMBER_CONVERTER); 91 + fastPath.put(Integer.class, NUMBER_CONVERTER); 92 + fastPath.put(Long.class, NUMBER_CONVERTER); 93 + 94 + fastPath.put(String.class, STRING_CONVERTER); 95 + fastPath.put(Character.class, STRING_CONVERTER); 96 + 97 + fastPath.put(Boolean.class, BOOLEAN_CONVERTER); 98 + 99 + fastPath.put(Instant.class, DATE_TIME_CONVERTER); 100 + fastPath.put(Date.class, DATE_TIME_CONVERTER); 101 + 102 + fastPath.put(Duration.class, DURATION_CONVERTER); 103 + 104 + fastPath.put(ASTNode.class, EXPRESSION_NODE_CONVERTER); 105 + fastPath.put(InlinedASTNode.class, EXPRESSION_NODE_CONVERTER); 106 + 107 + fastPath.put(List.class, ARRAY_CONVERTER); 108 + fastPath.put(Object[].class, ARRAY_CONVERTER); 109 + 110 + fastPath.put(Map.class, STRUCTURE_CONVERTER); 111 + FAST_PATH = Collections.unmodifiableMap(fastPath); 112 + } 69 113 70 114 @Override 71 115 public EvaluationValue convertObject(Object object, ExpressionConfiguration configuration) { 72 - 73 116 if (object == null) return NullValue.of(); 74 - 75 117 if (object instanceof EvaluationValue value) return value; 118 + 119 + var fastPath = FAST_PATH.get(object.getClass()); 120 + if (fastPath != null) return fastPath.convert(object, configuration); 76 121 77 122 for (ConverterIfc converter : converters) { 78 123 if (converter.canConvert(object)) {