In the example there is only one Pojo object. Can you please provide an
example/use case with two Pojo objects?
Thank you,
Vlad
On 12/2/15 10:00, Chinmay Kolhatkar wrote:
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.