Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
None
-
None
-
None
Description
Currently, when runtime CodeGenerator logic generates class to evaluate an expression, it would put the code in doEval() method, regardless of whether the expression is a constant, or part of the expression is a constant. This means the generated code for the constant expression will be executed once for every record, in stead of once for each record batch.
For a constant expression, we should put the code in doSetup() method, so that it will be executed once per record batch. Doing so would improve runtime code efficiency.
In addition, for some function call expression, if the arguments are constant, we may want to refer to the constant arguments in doSetup(). For instance, given function : regexp_replae(input_string, regex, replace), if regex is a constant (eg : regexp_replace(varcharcol, "a[bc]", "XYZ") ), the implementation of regexp_replace would use the constant to build a java.Pattern in doSetup(), and repeatedly use that java.Pattern object in doEval() for each record. This requires CodeGenerator to make the constant arguments accessible to doSetup() method for function call.