2020package fr .jmmc .oitools .model ;
2121
2222import fr .jmmc .oitools .meta .ColumnMeta ;
23+ import fr .jmmc .oitools .meta .WaveColumnMeta ;
2324import static fr .jmmc .oitools .model .ModelBase .UNDEFINED_DBL ;
2425import gnu .jel .CompilationException ;
2526import gnu .jel .CompiledExpression ;
2627import gnu .jel .DVMap ;
2728import gnu .jel .Evaluator ;
2829import gnu .jel .Library ;
30+ import java .util .ArrayList ;
2931import java .util .Arrays ;
3032import java .util .HashSet ;
31- import java .util .List ;
3233import java .util .Set ;
3334import java .util .logging .Level ;
3435import java .util .logging .Logger ;
3738 * ExpressionEvaluator implementation based on gnu JEL
3839 * @author grosje
3940 */
40- public class JELEval extends ExpressionEvaluator {
41+ public final class JELEval extends ExpressionEvaluator {
4142
4243 /** logger */
4344 private final static Logger _logger = Logger .getLogger (JELEval .class .getName ());
@@ -56,8 +57,7 @@ public JELEval() {
5657 */
5758 @ Override
5859 public double [][] eval (final OIData oiData , final String colNameEval ,
59- final String expression , final boolean testOnly )
60- throws RuntimeException {
60+ final String expression , final boolean testOnly ) throws RuntimeException {
6161
6262 if (_logger .isLoggable (Level .FINE )) {
6363 _logger .log (Level .FINE , "eval: column= {0} expression= {1}" , new Object []{colNameEval , expression });
@@ -73,7 +73,7 @@ public double[][] eval(final OIData oiData, final String colNameEval,
7373
7474 // Prepare inputs:
7575 // all numerical names (original + derived):
76- final List <ColumnMeta > columnsDescCollection = oiData .getNumericalColumnsDescs ();
76+ final ArrayList <ColumnMeta > columnsDescCollection = oiData .getNumericalColumnsDescs (new ArrayList < ColumnMeta >() );
7777
7878 // Create input column names:
7979 int n = 0 ;
@@ -111,11 +111,13 @@ public double[][] eval(final OIData oiData, final String colNameEval,
111111 final Library lib = new Library (staticLib , dynamicLib , null , resolver , null );
112112
113113 // Math.random():
114+ // may throw CompilationException or Throwable:
114115 lib .markStateDependent ("random" , null );
115116
116117 // Compile expression
117- _logger .fine ("Compilation ..." );
118+ _logger .fine ("Compiling expression ..." );
118119
120+ // may throw CompilationException or Throwable:
119121 final CompiledExpression expr_c = Evaluator .compile (expression , lib );
120122
121123 // Retrieve values:
@@ -126,6 +128,22 @@ public double[][] eval(final OIData oiData, final String colNameEval,
126128 _logger .log (Level .FINE , "usedNames: {0}" , usedNames );
127129 }
128130
131+ // Update related column names for the dynamic column:
132+ final ColumnMeta colMetaExpr = oiData .getColumnDerivedDesc (colNameEval );
133+
134+ if (colMetaExpr instanceof WaveColumnMeta ) {
135+ if (_logger .isLoggable (Level .FINE )) {
136+ _logger .log (Level .FINE , "colMetaExpr: {0}" , colMetaExpr );
137+ }
138+ final Set <String > relatedColumnNames = ((WaveColumnMeta ) colMetaExpr ).getRelatedColumnNames ();
139+ relatedColumnNames .clear ();
140+ relatedColumnNames .addAll (usedNames );
141+
142+ if (_logger .isLoggable (Level .FINE )) {
143+ _logger .log (Level .FINE , "relatedColumnNames: {0}" , relatedColumnNames );
144+ }
145+ }
146+
129147 // Create the input column array:
130148 // warning: array must have the same size and indices as the input column names (jelNames):
131149 n = 0 ;
@@ -181,6 +199,7 @@ public double[][] eval(final OIData oiData, final String colNameEval,
181199 for (int j = 0 ; j < nWaves ; j ++) {
182200 varProvider .j = j ;
183201
202+ // may throw Throwable:
184203 row [j ] = expr_c .evaluate_double (context );
185204 }
186205 }
0 commit comments