I have few concerns regarding the proposal, so my vote is -0 till they are resolved

1. Usage of quasi-Java proprietary language. Even though most of the syntax adheres to Java, usage of ${} invalidates ability to use general IDEs to develop expressions. Debugging and verifying correctness of any complex expression becomes a non trivial task for application developers. 2. What other languages were considered for expressions? Why quasi-Java was selected in favor of for example SQL syntax? 3. Separating imports from expressions seems as inconvenience to expression developers to me. Why imports can't be specified as part of expression definition? 4. Where multiple POJOs come from? If assumption is that different POJOs come from different input ports, how tuples from different ports are synchronized? 5. Are we supporting both POJOUtils and ExpressionEvaluator? If not, what is the plan to deprecate POJOUtils? If yes, syntax of POJOUtils and ExpressionEvaluator don't seem to be compatible. 6. POJOUtils supports both getters and setters, what is the plan to support setters in ExpressionEvaluator?

Thank you,

Vlad

On 1/13/16 22:52, Chinmay Kolhatkar wrote:
Hi All,

I'm working on APEXCORE-1972 which adds support for a quasi-Java Expression
Language and its expression evaluator.

All the detailed functionality and design details along with examples are
present in Jira.

I've summarized the ExpressionEvaluator feature & Expression language below.

The pull request created for this at here:
https://github.com/apache/incubator-apex-malhar/pull/170

Please share your thought on this.

Thanks,
Chinmay.


*Summary of functionality of ExpressionEvaluator:*

    1. Support quasi-Java Expression which defines a single line executable
    expression
    2. Support for quasi-Java expression based function code, which will be
    compiled on the fly and made available for execution.
    3. Should support accessing multiple fields from multiples input POJOs
    while addressing the conversion of private variables to public getter
    method for all levels.
    4. Should support nested field support
    5. quasi-Java expressions should support operands to be mentioned in
    following ways:
       - ${input.fieldName}
          - Access fieldName via a object name.
       - ${fieldName}
          - Accessing fieldName directly when a single object is registered
          for operation.
       - ${input}
          - Accessing object variable directly
       - ${input.fieldName.internalField}
          - Accessing nested fields
       6. There should be some predefined function provided to expression
    writer which one can directly use in expression for invoking certain
    functionality.
    7. These are simple String based, Date time based etc functions.
    8. On-need-basic one should be able to easily update Expression
    Evaluator to easily add new predefined functions to be made available for
    expression writer.
    9. User of ExpressionEvaluator should be able to add a custom method
    externally to be made available to in expression.
    10. Though operands are defined, placeholder for the operand in
    expression should be allowed to be overridden. By default, expression
    language should support bash type syntax for operand - {…}
    11. The library should not introduce any serialization related issues.
    12. All the java operators should be supported.

​

*The examples of quasi-Java Expression:*

    - ${inp.field1}
       - Will return value of field1 from registered input POJO.
    - ${inp.field1} + ${inp.field2}
       - Will return sum of field1 & field2 from given POJO
    - ${field1} + ${field2}
       - Equivalent to above
    - ${inpA.field1} > ${inpA.field2} ? ${inpA.field3} : ${inpB.field3}
       - Executes ternary expression and returns value accordingly. Works on
       2 POJOs. inpA & inpB are two placeholder registered for given POJO with
       ExpressionEvaluator library.
    - pow(${inpA.field1}, ${inpB.field2})
       - Executes pow function coming from java.lang.Math library. This and
       other with lot other basic functions is available to expression
writer out
       of the box to use in expression.
    - ${inpA.field1} > 0 ? ${inpB.innerPOJO.field3} :
    ${inpA.innerPOJO.field3}
       - Shows how nested POJOs can be accessed in expression. The variables
       will evaluate to correct public getter method is required.
    - ${inp.firstname} + “ “ + ${inp.lastname}
       - Generate the full name as per given expression from firstname and
       lastname field.
    - long retVal=1; for (int i=0; ${inpF.value1}; i++) {retVal = retVal *
    ${inpF.value1}; } return retVal;
       - This tells a complete method content to ExpressionEvaluator. The
       library create an executable and compiled method using this expression.

​


Reply via email to