Hi Vlad,

I had a look at pojoutils. It can cater for getter method taking a single
pojo object as param.
What I need is atleast 2 pojo objects from which final result will be
derived as per expression.
Hence I wrote getter using janino which can takes 'n' number of pojo
objects as params as work off the expression.
This might possibly be a extension to pojoutils.

Please correct me if I'm wrong.

- Chinmay.
On 2 Dec 2015 22:07, "Vlad Rozov" <[email protected]> wrote:

> The use case is already fully covered by PojoUtils that is part of Malhar.
> Please take a look and let me know if you have any questions how to use it.
>
> Thank you,
>
> Vlad
>
> On 12/2/15 02:50, Chinmay Kolhatkar wrote:
>
>>
>> Hi All,
>>
>> We’re evaluating a expression evaluator for our use case.
>>
>> *Example Use Case:*
>> The expressions needs to contain Java specific code for evaluating once
>> and running the same for every tuple.
>> For e.g. a POJO has following definition:
>>
>> |public class POJO { String firstname; // Firstname String lastname; //
>> Lastname Date dob; // Date of birth } |
>>
>> From this POJO, we need to generate fullname as concatenation of
>> firstname & lastname and age which will be derived from dob field.
>> The expressions for those might look like following:
>> For full name : ${inp.firstname} + “ “ + ${inp.lastname}
>> For Age : new Date().getYear() - ${inp.dob}.getYear()
>>
>> Currently, I have a implementation using Janino library for expression
>> evaluation. Code (ExpressionEvaluator.java) and Test code (Main.java)
>> attached.
>> As performance is an important concern, we chose a custom evaluator using
>> Janino’s fast script evaluator.
>>
>> *Design of the custom expression evaluator:*
>>
>>     /ExpressionEvaluator class is used for evaluating expressions
>>     which takes multiple parameter object and the result is returned
>>     for that expression./
>>     /
>>     /
>>     /The way to reference a variable in an object is
>>     ${placeholder.varname}./
>>     /The variable will be resolved to its accessible variable or
>>     getter method in order. After this the variable can be used as if
>>     its a Java variable./
>>     /
>>     /
>>     /ExpressionEvaluator also allows you to set extra imports that
>>     needs to be added over default is java.lang.*/
>>     /
>>     /
>>     /ExpressionEvaluator needs to be configured with following
>>     configurations as minimal configuration:/
>>     /1. Mapping of input object place holders to it corresponding types./
>>     /    This can be done with setInputObjectPlaceholders method./
>>     /2. Return type of of expression eveluation./
>>     /3. Expression to be evaluated. This is a standard java expression
>>     except for referencing the variable inside object JEL syntax needs
>>     to be used i.e. ${objectPlaceHolder.varName}/
>>
>> *Example Use of custom expression evaluator:*
>>
>> |ExpressionEveluator ee = new ExpressionEvaluator(); // Let expression
>> evaluator know what are the object mappings present in expressions and
>> their class types. ee.setInputObjectPlaceholders(new String[]{"input"}, new
>> Class[]{Test.class}); // Generate expression for finding age from Date
>> object. String expression = "${input.firstname} + \" \" +
>> ${input.lastname}"; ExpressionEvaluator.DataGetter<String> getter4 =
>> ee.createGetter(expression, String.class); inp1.firstname = "ABC";
>> inp1.lastname = "XYZ"; String fullname = getter4.get(inp1);
>> System.out.println("Fullname is: " + fullname); |
>>
>> *Output:*
>>
>> |Fullname is: ABC XYZ |
>>
>>
>> Can you please suggest for any improvements in this OR is there a better
>> option to achieve expression evaluation?
>>
>> Can this code possibly go into Malhar library?
>>
>> ~ Chinmay.
>>
>> ​
>>
>
>

Reply via email to