Revision 45366

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/dataaccess/SelectCountFunction.java
34 34
import org.gvsig.fmap.dal.DataManager;
35 35
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT_COUNT;
36 36
import org.gvsig.fmap.dal.DataStore;
37
import org.gvsig.fmap.dal.expressionevaluator.ExpressionEvaluator;
37
import org.gvsig.expressionevaluator.ExpressionEvaluator;
38 38
import org.gvsig.fmap.dal.feature.FeatureQuery;
39 39
import org.gvsig.fmap.dal.feature.FeatureSet;
40 40
import org.gvsig.fmap.dal.feature.FeatureStore;
41
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
41
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureExpressionEvaluator;
42 42
import org.gvsig.tools.dispose.DisposeUtils;
43 43

  
44 44
/**
......
114 114
      } else {
115 115
          FeatureQuery query = featureStore.createFeatureQuery();
116 116
          Code where2 = removeOuterTablesReferences(interpreter, where);
117
          ExpressionEvaluator filter = new DefaultExpressionEvaluator(where2.toString());
118
          filter.getSymbolTable().addSymbolTable(interpreter.getSymbolTable());
117
          ExpressionEvaluator filter = new DefaultFeatureExpressionEvaluator(where2.toString());
118
          filter.toSymbolTable().addSymbolTable(interpreter.getSymbolTable());
119 119
          query.addFilter(filter);
120 120
          query.retrievesAllAttributes();
121 121
          set = featureStore.getFeatureSet(query);
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/dataaccess/InsertIntoTableFunction.java
46 46
import org.gvsig.fmap.dal.DataManager;
47 47
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT;
48 48
import org.gvsig.fmap.dal.DataStore;
49
import org.gvsig.fmap.dal.expressionevaluator.ExpressionEvaluator;
49
import org.gvsig.expressionevaluator.ExpressionEvaluator;
50 50
import static org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable.SYMBOL_CURRENT_TABLE;
51 51
import org.gvsig.fmap.dal.expressionevaluator.TableAttributeHandler;
52 52
import org.gvsig.fmap.dal.feature.EditableFeature;
......
56 56
import org.gvsig.fmap.dal.feature.FeatureSet;
57 57
import org.gvsig.fmap.dal.feature.FeatureStore;
58 58
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureQueryOrder;
59
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
59
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureExpressionEvaluator;
60 60
import org.gvsig.tools.dispose.DisposeUtils;
61 61
import org.gvsig.tools.exception.BaseException;
62 62

  
......
185 185
        FeatureQuery query = sourceStore.createFeatureQuery();
186 186
        if (where != null) {
187 187
          removeOuterTablesReferences(interpreter, where);
188
          ExpressionEvaluator filter = new DefaultExpressionEvaluator(where.toString());
189
          filter.getSymbolTable().addSymbolTable(interpreter.getSymbolTable());
188
          ExpressionEvaluator filter = new DefaultFeatureExpressionEvaluator(where.toString());
189
          filter.toSymbolTable().addSymbolTable(interpreter.getSymbolTable());
190 190
          query.addFilter(filter);
191 191
        }
192 192
        if (queryOrder != null) {
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/dataaccess/SelectFunction.java
47 47
import org.gvsig.fmap.dal.DataManager;
48 48
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT;
49 49
import org.gvsig.fmap.dal.DataStore;
50
import org.gvsig.fmap.dal.expressionevaluator.ExpressionEvaluator;
50
import org.gvsig.expressionevaluator.ExpressionEvaluator;
51 51
import static org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable.SYMBOL_CURRENT_TABLE;
52 52
import org.gvsig.fmap.dal.expressionevaluator.TableAttributeHandler;
53 53
import org.gvsig.fmap.dal.feature.Feature;
54 54
import org.gvsig.fmap.dal.feature.FeatureQuery;
55 55
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
56 56
import org.gvsig.fmap.dal.feature.FeatureStore;
57
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
57
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureExpressionEvaluator;
58 58
import org.gvsig.expressionevaluator.Code.Callable;
59 59
import org.gvsig.expressionevaluator.spi.AbstractFunction;
60 60
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureQueryOrder;
......
181 181
        FeatureQuery query = featureStore.createFeatureQuery();
182 182
        if (where != null) {
183 183
          Code where2 = removeOuterTablesReferences(interpreter, where);
184
          ExpressionEvaluator filter = new DefaultExpressionEvaluator(where2.toString());
185
          filter.getSymbolTable().addSymbolTable(interpreter.getSymbolTable());
184
          ExpressionEvaluator filter = new DefaultFeatureExpressionEvaluator(where2.toString());
185
          filter.toSymbolTable().addSymbolTable(interpreter.getSymbolTable());
186 186
          query.addFilter(filter);
187 187
        }
188 188
        if (queryOrder != null) {
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/DefaultFeatureQueryOrder.java
30 30
import java.util.NoSuchElementException;
31 31
import org.apache.commons.lang3.StringUtils;
32 32
import org.gvsig.expressionevaluator.Expression;
33
import org.gvsig.expressionevaluator.ExpressionEvaluator;
33 34
import org.gvsig.fmap.dal.exception.DataEvaluatorRuntimeException;
34 35
import org.gvsig.fmap.dal.feature.Feature;
35 36
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
36
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
37
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureExpressionEvaluator;
37 38
import org.gvsig.tools.ToolsLocator;
38 39
import org.gvsig.tools.dynobject.DynStruct;
39 40
import org.gvsig.tools.evaluator.Evaluator;
......
107 108
                throws PersistenceException {
108 109
            state.set("attributeName", this.attributeName);
109 110
            state.set("ascending", this.ascending);
110
            if(evaluator instanceof Persistent){
111
            if(evaluator instanceof ExpressionEvaluator){
111 112
                state.set("evaluator", evaluator);
112 113
            } else {
113 114
                state.setNull("evaluator");
......
198 199

  
199 200
    public Object add(Expression expr, boolean ascending) {
200 201
        
201
        Evaluator evaluator = new DefaultExpressionEvaluator(expr);
202
        Evaluator evaluator = new DefaultFeatureExpressionEvaluator(expr);
202 203
        FeatureQueryOrderMember member = new FeatureQueryOrderMemberImpl(
203 204
                evaluator,
204 205
                ascending);
......
354 355
    public static void registerPersistent() {
355 356
        DynStruct definitionMember
356 357
                = ToolsLocator.getPersistenceManager()
357
                        .addDefinition(FeatureQueryOrderMember.class,
358
                        .addDefinition(FeatureQueryOrderMemberImpl.class,
358 359
                                "FeatureQueryOrderMember",
359 360
                                "FeatureQueryOrderMember Persistent definition",
360 361
                                null,
361 362
                                null);
362 363

  
363 364
        definitionMember.addDynFieldString("attributeName").setClassOfValue(String.class).setMandatory(false);
364
        definitionMember.addDynFieldObject("expression").setClassOfValue(Expression.class).setMandatory(false);
365
        definitionMember.addDynFieldObject("evaluator").setClassOfValue(ExpressionEvaluator.class).setMandatory(false);
365 366
        definitionMember.addDynFieldBoolean("ascending").setMandatory(false);
366 367

  
367 368
        DynStruct definition
......
372 373
                                null,
373 374
                                null);
374 375

  
375
        definition.addDynFieldList("members").setClassOfItems(FeatureQueryOrderMember.class);
376
        definition.addDynFieldList("members").setClassOfItems(FeatureQueryOrderMemberImpl.class);
376 377

  
377 378
    }
378 379

  
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/DefaultFeatureQuery.java
36 36
import org.gvsig.fmap.dal.DataTypes;
37 37
import org.gvsig.fmap.dal.exception.DataException;
38 38
import org.gvsig.fmap.dal.exception.InitializeException;
39
import org.gvsig.fmap.dal.expressionevaluator.ExpressionEvaluator;
39
import org.gvsig.expressionevaluator.ExpressionEvaluator;
40 40
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
41 41
import org.gvsig.fmap.dal.feature.FeatureQuery;
42 42
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
43 43
import org.gvsig.fmap.dal.feature.FeatureStore;
44 44
import org.gvsig.fmap.dal.feature.FeatureType;
45
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
45
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureExpressionEvaluator;
46 46
import org.gvsig.tools.ToolsLocator;
47 47
import org.gvsig.tools.dynobject.DynStruct;
48 48
import org.gvsig.tools.evaluator.AndEvaluator;
......
356 356
    @Override
357 357
    public Expression getExpressionFilter() {
358 358
      if( this.filter instanceof ExpressionEvaluator ) {
359
        return ((ExpressionEvaluator)this.filter).getExpression();
359
        return ((ExpressionEvaluator)this.filter).toExpression();
360 360
      }
361 361
      return null;
362 362
    }
......
367 367
            this.clearFilter();
368 368
            return;
369 369
        }
370
        Evaluator x = new DefaultExpressionEvaluator(filter);
370
        Evaluator x = new DefaultFeatureExpressionEvaluator(filter);
371 371
        this.setFilter(x);
372 372
    }
373 373

  
......
404 404

  
405 405
    @Override
406 406
    public void addFilter(Expression filter) {
407
        Evaluator x = new DefaultExpressionEvaluator(filter);
407
        Evaluator x = new DefaultFeatureExpressionEvaluator(filter);
408 408
        this.addFilter(x);
409 409
    }
410 410

  
......
494 494
        clone.extraColumn = extraColumn.getCopy();
495 495
        
496 496
        if( this.filter instanceof ExpressionEvaluator ) {
497
            Expression exp = ((ExpressionEvaluator)this.filter).getExpression();
498
            clone.filter =  new DefaultExpressionEvaluator(exp);
497
            Expression exp = ((ExpressionEvaluator)this.filter).toExpression();
498
            clone.filter =  new DefaultFeatureExpressionEvaluator(exp);
499 499
        }
500 500
        
501 501
        if (groupByColumns!=null) {
......
566 566
        state.set("attributeNames", this.attributeNames);
567 567
        
568 568
        ArrayList<Expression> filterList = new ArrayList<>();
569
        if (this.filter instanceof DefaultExpressionEvaluator) {
570
            DefaultExpressionEvaluator filterExpression = (DefaultExpressionEvaluator) this.filter;
571
           filterList.add(filterExpression.getExpression());
569
        if (this.filter instanceof DefaultFeatureExpressionEvaluator) {
570
            DefaultFeatureExpressionEvaluator filterExpression = (DefaultFeatureExpressionEvaluator) this.filter;
571
           filterList.add(filterExpression.toExpression());
572 572
        } else if (this.filter instanceof AndEvaluator) {
573 573
            AndEvaluator filterAnd = (AndEvaluator) this.filter;
574 574
            List<Evaluator> evaluators = filterAnd.getEvaluators();
575 575
            for (Evaluator evaluator : evaluators) {
576
                if (evaluator instanceof DefaultExpressionEvaluator) {
577
                    DefaultExpressionEvaluator expressionEvaluator = (DefaultExpressionEvaluator) evaluator;
578
                    filterList.add(expressionEvaluator.getExpression());
576
                if (evaluator instanceof DefaultFeatureExpressionEvaluator) {
577
                    DefaultFeatureExpressionEvaluator expressionEvaluator = (DefaultFeatureExpressionEvaluator) evaluator;
578
                    filterList.add(expressionEvaluator.toExpression());
579 579
                } else {
580 580
                    filterList.clear();
581 581
                    LOGGER.warn(StringUtils.join("Filters in this FeatureQuery will not persist:", this.toString()));
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/impl/expressionevaluator/DefaultExpressionEvaluator.java
1
package org.gvsig.fmap.dal.impl.expressionevaluator;
2

  
3
import java.util.ArrayList;
4
import java.util.HashSet;
5
import java.util.List;
6
import java.util.Set;
7
import org.gvsig.expressionevaluator.Code;
8
import org.gvsig.expressionevaluator.SymbolTable;
9
import org.gvsig.expressionevaluator.Expression;
10
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
11
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
12
import org.gvsig.expressionevaluator.Function;
13
import org.gvsig.expressionevaluator.impl.symboltable.FeatureSymbolTableImpl;
14
import org.gvsig.fmap.dal.expressionevaluator.ExpressionEvaluator;
15
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
16
import org.gvsig.fmap.dal.feature.Feature;
17
import org.gvsig.tools.evaluator.AbstractEvaluator;
18
import org.gvsig.tools.evaluator.Evaluator;
19
import org.gvsig.tools.evaluator.EvaluatorData;
20
import org.gvsig.tools.evaluator.EvaluatorException;
21
import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
22
import org.gvsig.tools.exception.BaseException;
23
import org.gvsig.tools.lang.Cloneable;
24
import org.slf4j.Logger;
25
import org.slf4j.LoggerFactory;
26

  
27
@SuppressWarnings("UseSpecificCatch")
28
public class DefaultExpressionEvaluator 
29
        extends AbstractEvaluator 
30
        implements ExpressionEvaluator, Cloneable 
31
    {
32

  
33
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultExpressionEvaluator.class);
34
    
35
    private static class DescriptionAdapter implements Description {
36

  
37
        Function function;
38

  
39
        public DescriptionAdapter(Function function) {
40
            this.function = function;
41
        }
42

  
43
        @Override
44
        public String getName() {
45
            return this.function.name();
46
        }
47

  
48
        @Override
49
        public String getDescription() {
50
            return this.function.description();
51
        }
52

  
53
        @Override
54
        public String getTemplate() {
55
            return this.function.template();
56
        }
57

  
58
        @Override
59
        public int getDataTypeCategories() {
60
            switch (this.function.group()) {
61
                case Function.GROUP_STRING:
62
                    return Description.DATATYPE_CATEGORY_STRING;
63
                case Function.GROUP_BOOLEAN:
64
                    return Description.DATATYPE_CATEGORY_BOOLEAN;
65
                case Function.GROUP_DATETIME:
66
                    return Description.DATATYPE_CATEGORY_DATETIME;
67
                case Function.GROUP_NUMERIC:
68
                    return Description.DATATYPE_CATEGORY_NUMBER;
69
                case Function.GROUP_OGC:
70
                    return Description.DATATYPE_CATEGORY_ALL;
71
                default:
72
                    return Description.DATATYPE_CATEGORY_ALL;
73
            }
74
        }
75

  
76
    }
77

  
78
    private FeatureSymbolTable featureSymbolTable;
79
    private SymbolTable symbolTable;
80
    private Expression expression;
81
    private Description[] availableOperators;
82
    private Description[] availableFunctions;
83

  
84
    public DefaultExpressionEvaluator(String source) {
85
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
86
        this.symbolTable = manager.createSymbolTable();
87
        this.featureSymbolTable = new FeatureSymbolTableImpl();
88
        this.symbolTable.addSymbolTable(this.featureSymbolTable);
89
        
90
        this.expression = manager.createExpression();
91
        this.expression.setPhrase(source);
92
    }
93

  
94
    public DefaultExpressionEvaluator(Expression expression) {
95
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
96
        this.symbolTable = manager.createSymbolTable();
97
        this.featureSymbolTable = new FeatureSymbolTableImpl();
98
        this.symbolTable.addSymbolTable(this.featureSymbolTable);
99

  
100
        this.expression = expression;
101
    }
102

  
103
    @Override
104
    public String getName() {
105
        return "Genereric expression";
106
    }
107

  
108
    @Override
109
    public String getDescription() {
110
        return this.expression.getPhrase();
111
    }
112

  
113
    @Override
114
    public String getSQL() {
115
        return this.expression.getPhrase();
116
    }
117

  
118
    @Override
119
    public Expression getExpression() {
120
        return expression;
121
    }
122

  
123
    @Override
124
    public SymbolTable getSymbolTable() {
125
        return this.symbolTable;
126
    }
127
    
128
    @Override
129
    public Object evaluate(EvaluatorData data) throws EvaluatorException {
130
        this.featureSymbolTable.setFeature((Feature) data);
131
        Object v = this.expression.execute(this.symbolTable);
132
        return v;
133
    }
134

  
135
    @Override
136
    public EvaluatorFieldsInfo getFieldsInfo() {
137
        final Set<String> names = new HashSet<>();
138
        try {
139
            this.expression.getCode().accept((Object code) -> {
140
              if (code instanceof Code.Identifier) {
141
                Code.Identifier identifier = (Code.Identifier) code;
142
                names.add(identifier.name());
143
              }
144
            });
145
            EvaluatorFieldsInfo info = new EvaluatorFieldsInfo();
146
            for (String name : names) {
147
                info.addFieldValue(name);
148
            }
149
            return info;
150
        } catch (BaseException ex) {
151
            throw new RuntimeException("Can't calculate fields information.", ex);
152
        }
153
    }
154

  
155
    @Override
156
    public Description[] getAvailableOperators() {
157
        if (availableOperators == null) {
158
            List<Description> l = new ArrayList<>();
159
            for (Function function : getSymbolTable()) {
160
                if (function.isOperator()) {
161
                    l.add(new DescriptionAdapter(function));
162
                }
163
            }
164
            this.availableOperators = l.toArray(new Description[l.size()]);
165
        }
166
        return availableOperators;
167
    }
168

  
169
    @Override
170
    public Description[] getAvailableFunctions() {
171
        if (availableFunctions == null) {
172
            List<Description> l = new ArrayList<>();
173
            for (Function function : getSymbolTable()) {
174
                if (!function.isOperator()) {
175
                    l.add(new DescriptionAdapter(function));
176
                }
177
            }
178
            this.availableFunctions = l.toArray(new Description[l.size()]);
179
        }
180
        return availableFunctions;
181
    }
182

  
183
    @Override
184
    public Evaluator clone() throws CloneNotSupportedException {
185
        DefaultExpressionEvaluator other = (DefaultExpressionEvaluator) super.clone();
186
        other.expression = this.expression.clone();
187
        other.availableFunctions = null;
188
        other.availableOperators = null;
189

  
190
        if (this.featureSymbolTable != null) {
191
            other.featureSymbolTable = this.featureSymbolTable.clone();
192
        }
193
        if (this.symbolTable != null) {
194
            other.symbolTable = this.symbolTable.clone();
195
        }
196
        return other;
197
    }
198

  
199
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/impl/expressionevaluator/DefaultEvaluatorFactory.java
11 11

  
12 12
    @Override
13 13
    public Evaluator createEvaluator(String phrase) {
14
        Evaluator e = new DefaultExpressionEvaluator(phrase);
14
        Evaluator e = new DefaultFeatureExpressionEvaluator(phrase);
15 15
        return e;
16 16
    }
17 17

  
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/impl/expressionevaluator/DefaultFeatureExpressionEvaluator.java
1
package org.gvsig.fmap.dal.impl.expressionevaluator;
2

  
3
import java.util.ArrayList;
4
import java.util.HashSet;
5
import java.util.List;
6
import java.util.Set;
7
import org.gvsig.expressionevaluator.Code;
8
import org.gvsig.expressionevaluator.SymbolTable;
9
import org.gvsig.expressionevaluator.Expression;
10
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
11
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
12
import org.gvsig.expressionevaluator.Function;
13
import org.gvsig.expressionevaluator.impl.symboltable.FeatureSymbolTableImpl;
14
import org.gvsig.expressionevaluator.ExpressionEvaluator;
15
import org.gvsig.expressionevaluator.impl.DefaultExpression;
16
import org.gvsig.expressionevaluator.spi.BaseExpressionEvaluator;
17
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
18
import org.gvsig.fmap.dal.feature.Feature;
19
import org.gvsig.tools.ToolsLocator;
20
import org.gvsig.tools.dynobject.DynStruct;
21
import org.gvsig.tools.evaluator.AbstractEvaluator;
22
import org.gvsig.tools.evaluator.Evaluator;
23
import org.gvsig.tools.evaluator.EvaluatorData;
24
import org.gvsig.tools.evaluator.EvaluatorException;
25
import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
26
import org.gvsig.tools.exception.BaseException;
27
import org.gvsig.tools.lang.Cloneable;
28
import org.gvsig.tools.persistence.PersistenceManager;
29
import org.gvsig.tools.persistence.PersistentState;
30
import org.gvsig.tools.persistence.exception.PersistenceException;
31
import org.slf4j.Logger;
32
import org.slf4j.LoggerFactory;
33

  
34
@SuppressWarnings("UseSpecificCatch")
35
public class DefaultFeatureExpressionEvaluator 
36
        extends AbstractEvaluator 
37
        implements ExpressionEvaluator, Cloneable 
38
    {
39

  
40
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureExpressionEvaluator.class);
41

  
42
    private static class DescriptionAdapter implements Description {
43

  
44
        Function function;
45

  
46
        public DescriptionAdapter(Function function) {
47
            this.function = function;
48
        }
49

  
50
        @Override
51
        public String getName() {
52
            return this.function.name();
53
        }
54

  
55
        @Override
56
        public String getDescription() {
57
            return this.function.description();
58
        }
59

  
60
        @Override
61
        public String getTemplate() {
62
            return this.function.template();
63
        }
64

  
65
        @Override
66
        public int getDataTypeCategories() {
67
            switch (this.function.group()) {
68
                case Function.GROUP_STRING:
69
                    return Description.DATATYPE_CATEGORY_STRING;
70
                case Function.GROUP_BOOLEAN:
71
                    return Description.DATATYPE_CATEGORY_BOOLEAN;
72
                case Function.GROUP_DATETIME:
73
                    return Description.DATATYPE_CATEGORY_DATETIME;
74
                case Function.GROUP_NUMERIC:
75
                    return Description.DATATYPE_CATEGORY_NUMBER;
76
                case Function.GROUP_OGC:
77
                    return Description.DATATYPE_CATEGORY_ALL;
78
                default:
79
                    return Description.DATATYPE_CATEGORY_ALL;
80
            }
81
        }
82

  
83
    }
84

  
85
    private FeatureSymbolTable featureSymbolTable;
86
    private SymbolTable symbolTable;
87
    private Expression expression;
88
    private Description[] availableOperators;
89
    private Description[] availableFunctions;
90
    
91
    public DefaultFeatureExpressionEvaluator() {
92
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
93
        this.symbolTable = manager.createSymbolTable();
94
        this.featureSymbolTable = new FeatureSymbolTableImpl();
95
        this.symbolTable.addSymbolTable(this.featureSymbolTable);
96
        this.availableOperators = null;
97
        this.availableFunctions = null;
98
    }
99

  
100
    public DefaultFeatureExpressionEvaluator(String source) {
101
        this();
102
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
103
        this.expression = manager.createExpression();
104
        this.expression.setPhrase(source);
105
    }
106

  
107
    public DefaultFeatureExpressionEvaluator(Expression expression) {
108
        this();
109
        this.expression = expression;
110
    }
111

  
112
    @Override
113
    public String getName() {
114
        return "Genereric expression";
115
    }
116

  
117
    @Override
118
    public String getDescription() {
119
        return this.expression.getPhrase();
120
    }
121

  
122
    @Override
123
    public String getSQL() {
124
        return this.expression.getPhrase();
125
    }
126

  
127
    @Override
128
    public Expression toExpression() {
129
        return expression;
130
    }
131

  
132
    @Override
133
    public SymbolTable toSymbolTable() {
134
        return this.symbolTable;
135
    }
136
    
137
    @Override
138
    public Object evaluate(EvaluatorData data) throws EvaluatorException {
139
        this.featureSymbolTable.setFeature((Feature) data);
140
        Object v = this.expression.execute(this.symbolTable);
141
        return v;
142
    }
143

  
144
    @Override
145
    public EvaluatorFieldsInfo getFieldsInfo() {
146
        final Set<String> names = new HashSet<>();
147
        try {
148
            this.expression.getCode().accept((Object code) -> {
149
              if (code instanceof Code.Identifier) {
150
                Code.Identifier identifier = (Code.Identifier) code;
151
                names.add(identifier.name());
152
              }
153
            });
154
            EvaluatorFieldsInfo info = new EvaluatorFieldsInfo();
155
            for (String name : names) {
156
                info.addFieldValue(name);
157
            }
158
            return info;
159
        } catch (BaseException ex) {
160
            throw new RuntimeException("Can't calculate fields information.", ex);
161
        }
162
    }
163

  
164
    @Override
165
    public Description[] getAvailableOperators() {
166
        if (availableOperators == null) {
167
            List<Description> l = new ArrayList<>();
168
            for (Function function : toSymbolTable()) {
169
                if (function.isOperator()) {
170
                    l.add(new DescriptionAdapter(function));
171
                }
172
            }
173
            this.availableOperators = l.toArray(new Description[l.size()]);
174
        }
175
        return availableOperators;
176
    }
177

  
178
    @Override
179
    public Description[] getAvailableFunctions() {
180
        if (availableFunctions == null) {
181
            List<Description> l = new ArrayList<>();
182
            for (Function function : toSymbolTable()) {
183
                if (!function.isOperator()) {
184
                    l.add(new DescriptionAdapter(function));
185
                }
186
            }
187
            this.availableFunctions = l.toArray(new Description[l.size()]);
188
        }
189
        return availableFunctions;
190
    }
191

  
192
    @Override
193
    public Evaluator clone() throws CloneNotSupportedException {
194
        DefaultFeatureExpressionEvaluator other = (DefaultFeatureExpressionEvaluator) super.clone();
195
        other.expression = this.expression.clone();
196
        other.availableFunctions = null;
197
        other.availableOperators = null;
198

  
199
        if (this.featureSymbolTable != null) {
200
            other.featureSymbolTable = this.featureSymbolTable.clone();
201
        }
202
        if (this.symbolTable != null) {
203
            other.symbolTable = this.symbolTable.clone();
204
        }
205
        return other;
206
    }
207
    
208
    @Override
209
    public void saveToState(PersistentState ps) throws PersistenceException {
210
        ps.set("expression", expression);
211
    }
212

  
213
    @Override
214
    public void loadFromState(PersistentState state) throws PersistenceException {
215
        this.expression = (Expression) state.get("expression");
216
    }
217
    
218
    public static void registerPersistence() {
219
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
220
        if (manager.getDefinition("DefaultFeatureExpressionEvaluator") == null) {
221
            DynStruct definition = manager.addDefinition(DefaultFeatureExpressionEvaluator.class,
222
                    "DefaultFeatureExpressionEvaluator", "DefaultFeatureExpressionEvaluator persistence definition", null, null);
223
            definition.addDynFieldObject("expression").setClassOfValue(DefaultExpression.class).setMandatory(false);
224
        }
225
    }
226

  
227
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/impl/DefaultDataManager.java
79 79
import org.gvsig.fmap.dal.feature.spi.cache.FeatureCacheProviderFactory;
80 80
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProvider;
81 81
import org.gvsig.fmap.dal.feature.spi.index.FeatureIndexProviderServices;
82
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
82
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureExpressionEvaluator;
83 83
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureAttributeEmulatorExpression;
84 84
import org.gvsig.fmap.dal.raster.impl.RasterStoreFactory;
85 85
import org.gvsig.fmap.dal.raster.impl.RasterStoreOldFactory;
......
841 841
    @Override
842 842
    @Deprecated
843 843
    public Evaluator createExpresion(Expression expression) throws InitializeException {
844
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
844
        DefaultFeatureExpressionEvaluator exp = new DefaultFeatureExpressionEvaluator(expression);
845 845
        return exp;        
846 846
    }
847 847

  
......
855 855

  
856 856
    @Override
857 857
    public Evaluator createFilter(Expression expression) throws InitializeException {
858
        DefaultExpressionEvaluator exp = new DefaultExpressionEvaluator(expression);
858
        DefaultFeatureExpressionEvaluator exp = new DefaultFeatureExpressionEvaluator(expression);
859 859
        return exp;        
860 860
    }
861 861

  
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/impl/DALDefaultImplLibrary.java
62 62
import org.gvsig.fmap.dal.feature.spi.memory.MemoryResource;
63 63
import org.gvsig.fmap.dal.feature.spi.memory.MemoryResourceParameters;
64 64
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureAttributeEmulatorExpression;
65
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureExpressionEvaluator;
65 66
import org.gvsig.fmap.dal.resource.impl.DefaultResourceManager;
66 67
import org.gvsig.fmap.dal.resource.spi.MultiResource;
67 68
import org.gvsig.fmap.dal.resource.spi.MultiResourceParameters;
......
132 133
        DefaultFeatureSelection.registerPersistent();
133 134
        DefaultForeingKey.registerPersistenceDefinition();
134 135
        DefaultFeatureExtraColumns.registerPersistent();
136
        DefaultFeatureExpressionEvaluator.registerPersistence();
135 137

  
136 138
        DefaultFeatureStore.registerPersistenceDefinition();
137 139
        DefaultDataServerExplorerPool.registerPersistenceDefinition();
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.impl/src/main/java/org/gvsig/fmap/dal/swing/impl/searchpanel/DefaultSearchParameters.java
136 136

  
137 137
    @Override
138 138
    public String toString() {
139
        if (this.query != null && this.query.getExpressionFilter() != null) {
139
        if (this.query != null) { // && this.query.getExpressionFilter() != null) {
140 140
            try {
141 141
                StringBuilder builder = new StringBuilder();
142
                builder.append(this.query.getExpressionFilter().getPhrase());
142
                if (this.query.getExpressionFilter() != null) {
143
                    builder.append(this.query.getExpressionFilter().getPhrase());
144
                }
143 145
                boolean has = true;
144 146
                for (EditableFeatureAttributeDescriptor col : this.query.getExtraColumn().getColumns()) {
145 147
                    if (has) {
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.impl/src/main/java/org/gvsig/featureform/swing/impl/DefaultJFeaturesForm.java
54 54
import org.gvsig.fmap.dal.DataStore;
55 55
import org.gvsig.fmap.dal.StoresRepository;
56 56
import org.gvsig.fmap.dal.exception.DataException;
57
import org.gvsig.fmap.dal.expressionevaluator.ExpressionEvaluator;
57
import org.gvsig.expressionevaluator.ExpressionEvaluator;
58 58
import org.gvsig.fmap.dal.feature.EditableFeature;
59 59
import org.gvsig.fmap.dal.feature.Feature;
60 60
import org.gvsig.fmap.dal.feature.FacadeOfAFeature;
......
810 810
            if( currentQuery!=null ) {
811 811
                Evaluator filter = currentQuery.getFilter();
812 812
                if( filter instanceof ExpressionEvaluator ) {
813
                    Expression expression = ((ExpressionEvaluator)filter).getExpression();
813
                    Expression expression = ((ExpressionEvaluator)filter).toExpression();
814 814
                    searchPanel.setFilter(expression);
815 815
                    searchPanel.search();
816 816
                }
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/expressionevaluator/ExpressionEvaluator.java
1
package org.gvsig.fmap.dal.expressionevaluator;
2

  
3
import org.gvsig.expressionevaluator.Expression;
4
import org.gvsig.expressionevaluator.SymbolTable;
5
import org.gvsig.tools.evaluator.EvaluatorWithDescriptions;
6

  
7
/**
8
 *
9
 * @author jjdelcerro
10
 */
11
public interface ExpressionEvaluator extends EvaluatorWithDescriptions {
12

  
13
    /**
14
     * Get a SQL representation of the evaluator.
15
     *
16
     * This funcion can return a non-sql compatible expression.
17
     * 
18
     * @return the SQL string.
19
     */
20
    @Override
21
    public String getSQL();
22
    
23
    public Expression getExpression();
24
    
25
    public SymbolTable getSymbolTable();
26
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultExpressionEvaluator.java
1
package org.gvsig.expressionevaluator.impl;
2

  
3
import java.util.ArrayList;
4
import java.util.Collection;
5
import java.util.HashSet;
6
import java.util.List;
7
import java.util.Set;
8
import org.gvsig.expressionevaluator.Code;
9
import org.gvsig.expressionevaluator.Expression;
10
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
11
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
12
import org.gvsig.expressionevaluator.Function;
13
import org.gvsig.expressionevaluator.SupportToExpression;
14
import org.gvsig.expressionevaluator.SupportToSymbolTable;
15
import org.gvsig.expressionevaluator.SymbolTable;
16
import org.gvsig.expressionevaluator.spi.AbstractSymbolTable;
17
import org.gvsig.tools.ToolsLocator;
18
import org.gvsig.tools.dynobject.DynStruct;
19
import org.gvsig.tools.evaluator.AbstractEvaluator;
20
import org.gvsig.tools.evaluator.Evaluator;
21
import org.gvsig.tools.evaluator.EvaluatorData;
22
import org.gvsig.tools.evaluator.EvaluatorException;
23
import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
24
import org.gvsig.tools.evaluator.EvaluatorWithDescriptions;
25
import org.gvsig.tools.exception.BaseException;
26
import org.gvsig.tools.lang.Cloneable;
27
import org.gvsig.tools.persistence.PersistenceManager;
28
import org.gvsig.tools.persistence.Persistent;
29
import org.gvsig.tools.persistence.PersistentState;
30
import org.gvsig.tools.persistence.exception.PersistenceException;
31
import org.gvsig.tools.util.ListBuilder;
32
import org.slf4j.Logger;
33
import org.slf4j.LoggerFactory;
34

  
35
@SuppressWarnings("UseSpecificCatch")
36
public class DefaultExpressionEvaluator 
37
        extends AbstractEvaluator 
38
        implements EvaluatorWithDescriptions, Cloneable, SupportToExpression, Persistent, SupportToSymbolTable
39
    {
40

  
41
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultExpressionEvaluator.class);
42

  
43
    private static class DescriptionAdapter implements Description {
44

  
45
        Function function;
46

  
47
        public DescriptionAdapter(Function function) {
48
            this.function = function;
49
        }
50

  
51
        @Override
52
        public String getName() {
53
            return this.function.name();
54
        }
55

  
56
        @Override
57
        public String getDescription() {
58
            return this.function.description();
59
        }
60

  
61
        @Override
62
        public String getTemplate() {
63
            return this.function.template();
64
        }
65

  
66
        @Override
67
        public int getDataTypeCategories() {
68
            switch (this.function.group()) {
69
                case Function.GROUP_STRING:
70
                    return Description.DATATYPE_CATEGORY_STRING;
71
                case Function.GROUP_BOOLEAN:
72
                    return Description.DATATYPE_CATEGORY_BOOLEAN;
73
                case Function.GROUP_DATETIME:
74
                    return Description.DATATYPE_CATEGORY_DATETIME;
75
                case Function.GROUP_NUMERIC:
76
                    return Description.DATATYPE_CATEGORY_NUMBER;
77
                case Function.GROUP_OGC:
78
                    return Description.DATATYPE_CATEGORY_ALL;
79
                default:
80
                    return Description.DATATYPE_CATEGORY_ALL;
81
            }
82
        }
83

  
84
    }
85

  
86
    private static class DataSymbolTable extends AbstractSymbolTable {
87

  
88
        EvaluatorData data;
89
        
90
        public DataSymbolTable() {
91
            super();
92
        }
93

  
94
        public void setData(EvaluatorData data) {
95
            this.data = data;
96
        }
97

  
98
        @Override
99
        public boolean exists(String name) {
100
            return data.hasDataValue(name);
101
        }
102

  
103
        @Override
104
        public Object value(String name) {
105
            return data.getDataValue(name);
106
        }
107

  
108
        @Override
109
        public Collection<String> localvariables() {
110
            List<String> names = ListBuilder.create(data.getDataNames());
111
            return names;
112
        }
113

  
114
        @Override
115
        public DataSymbolTable clone() throws CloneNotSupportedException {
116
            SymbolTable other = super.clone();
117
            return (DataSymbolTable) other;
118
        }
119
        
120
    }
121
            
122
    private DataSymbolTable dataSymbolTable;
123
    private SymbolTable symbolTable;
124
    private Expression expression;
125
    private Description[] availableOperators;
126
    private Description[] availableFunctions;
127

  
128
    public DefaultExpressionEvaluator(String source) {
129
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
130
        this.symbolTable = manager.createSymbolTable();
131
        this.dataSymbolTable = new DataSymbolTable();
132
        this.symbolTable.addSymbolTable(this.dataSymbolTable);
133
        
134
        this.expression = manager.createExpression();
135
        this.expression.setPhrase(source);
136
    }
137

  
138
    public DefaultExpressionEvaluator(Expression expression) {
139
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
140
        this.symbolTable = manager.createSymbolTable();
141
        this.dataSymbolTable = new DataSymbolTable();
142
        this.symbolTable.addSymbolTable(this.dataSymbolTable);
143

  
144
        this.expression = expression;
145
    }
146

  
147
    @Override
148
    public String getName() {
149
        return "Genereric expression";
150
    }
151

  
152
    @Override
153
    public String getDescription() {
154
        return this.expression.getPhrase();
155
    }
156

  
157
    @Override
158
    public String getSQL() {
159
        return this.expression.getPhrase();
160
    }
161

  
162
    @Override
163
    public Expression toExpression() {
164
        return expression;
165
    }
166

  
167
    @Override
168
    public SymbolTable toSymbolTable() {
169
        return this.symbolTable;
170
    }
171
    
172
    @Override
173
    public Object evaluate(EvaluatorData data) throws EvaluatorException {
174
        this.dataSymbolTable.setData(data);
175
        Object v = this.expression.execute(this.symbolTable);
176
        return v;
177
    }
178

  
179
    @Override
180
    public EvaluatorFieldsInfo getFieldsInfo() {
181
        final Set<String> names = new HashSet<>();
182
        try {
183
            this.expression.getCode().accept((Object code) -> {
184
              if (code instanceof Code.Identifier) {
185
                Code.Identifier identifier = (Code.Identifier) code;
186
                names.add(identifier.name());
187
              }
188
            });
189
            EvaluatorFieldsInfo info = new EvaluatorFieldsInfo();
190
            for (String name : names) {
191
                info.addFieldValue(name);
192
            }
193
            return info;
194
        } catch (BaseException ex) {
195
            throw new RuntimeException("Can't calculate fields information.", ex);
196
        }
197
    }
198

  
199
    @Override
200
    public Description[] getAvailableOperators() {
201
        if (availableOperators == null) {
202
            List<Description> l = new ArrayList<>();
203
            for (Function function : toSymbolTable()) {
204
                if (function.isOperator()) {
205
                    l.add(new DescriptionAdapter(function));
206
                }
207
            }
208
            this.availableOperators = l.toArray(new Description[l.size()]);
209
        }
210
        return availableOperators;
211
    }
212

  
213
    @Override
214
    public Description[] getAvailableFunctions() {
215
        if (availableFunctions == null) {
216
            List<Description> l = new ArrayList<>();
217
            for (Function function : toSymbolTable()) {
218
                if (!function.isOperator()) {
219
                    l.add(new DescriptionAdapter(function));
220
                }
221
            }
222
            this.availableFunctions = l.toArray(new Description[l.size()]);
223
        }
224
        return availableFunctions;
225
    }
226

  
227
    @Override
228
    public Evaluator clone() throws CloneNotSupportedException {
229
        DefaultExpressionEvaluator other = (DefaultExpressionEvaluator) super.clone();
230
        other.expression = this.expression.clone();
231
        other.availableFunctions = null;
232
        other.availableOperators = null;
233

  
234
        if (this.dataSymbolTable != null) {
235
            other.dataSymbolTable = this.dataSymbolTable.clone();
236
        }
237
        if (this.symbolTable != null) {
238
            other.symbolTable = this.symbolTable.clone();
239
        }
240
        return other;
241
    }
242

  
243
    @Override
244
    public void saveToState(PersistentState state) throws PersistenceException {
245

  
246
        state.set("expression", expression);
247
    }
248

  
249
    @Override
250
    public void loadFromState(PersistentState state) throws PersistenceException {
251
        expression = (Expression) state.get("expression");
252
        availableFunctions = null;
253
        availableOperators = null;
254
        
255
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
256
        this.symbolTable = manager.createSymbolTable();
257
        this.dataSymbolTable = new DataSymbolTable();
258
        this.symbolTable.addSymbolTable(this.dataSymbolTable);
259

  
260
    }
261
    
262
    
263
    public static void registerPersistence() {
264
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
265
        if (manager.getDefinition("DefaultExpressionEvaluator") == null) {
266
            DynStruct definition = manager.addDefinition(DefaultExpressionEvaluator.class,
267
                    "DefaultExpressionEvaluator", "DefaultExpressionEvaluator persistence definition", null, null);
268
            definition.addDynFieldObject("expression").setClassOfValue(DefaultExpression.class).setMandatory(false);
269
        }
270
    }
271

  
272
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultExpression.java
6 6
import org.gvsig.expressionevaluator.Code;
7 7
import org.gvsig.expressionevaluator.Compiler;
8 8
import org.gvsig.expressionevaluator.Expression;
9
import org.gvsig.expressionevaluator.ExpressionEvaluator;
9 10
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
10 11
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
11 12
import org.gvsig.expressionevaluator.ExpressionUtils;
......
351 352

  
352 353
    @Override
353 354
    public Evaluator toEvaluator() {
354
        DefaultExpressionEvaluator evaluator = new DefaultExpressionEvaluator(this);
355
        ExpressionEvaluator evaluator = this.manager.createExpressionEvaluator(this);
355 356
        return evaluator;
356 357
    }
357 358
    
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultExpressionEvaluatorManager.java
1 1
package org.gvsig.expressionevaluator.impl;
2 2

  
3
import org.gvsig.expressionevaluator.spi.BaseExpressionEvaluator;
3 4
import java.io.InputStream;
4 5
import java.io.StringWriter;
5 6
import java.net.URI;
......
30 31
import org.gvsig.expressionevaluator.SymbolTable;
31 32
import org.gvsig.expressionevaluator.SymbolTableFactory;
32 33
import org.gvsig.expressionevaluator.Compiler;
34
import org.gvsig.expressionevaluator.ExpressionEvaluator;
33 35
import org.gvsig.expressionevaluator.Formatter;
34 36
import org.gvsig.expressionevaluator.GrammarSet;
35 37
import org.gvsig.expressionevaluator.ReprMethod;
......
480 482
    public void registerExpressionBuilderFormatter(Formatter<ExpressionBuilder.Value> formatter) {
481 483
      this.expressionBuilderFormatter = formatter;
482 484
    }
485

  
486
    @Override
487
    public ExpressionEvaluator createExpressionEvaluator(Expression expression) {
488
        return new BaseExpressionEvaluator(expression);
489
    }
483 490
    
484 491
}
485 492

  
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/ExpressionEvaluatorImplLibrary.java
1 1
package org.gvsig.expressionevaluator.impl;
2 2

  
3
import org.gvsig.expressionevaluator.spi.BaseExpressionEvaluator;
3 4
import org.gvsig.expressionevaluator.DataTypes;
4 5
import org.gvsig.expressionevaluator.ExpressionEvaluatorLibrary;
5 6
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
......
57 58
        manager.registerGrammar(new BasicGrammarFactory());
58 59
        
59 60
        DefaultExpression.registerPersistence();
60
        DefaultExpressionEvaluator.registerPersistence();
61
        BaseExpressionEvaluator.registerPersistence();
61 62

  
62 63
        DataTypesManager dataTypesManager = ToolsLocator.getDataTypesManager();
63 64

  
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/ExpressionEvaluatorManager.java
87 87
    public List<ClassLoader> getClassLoaders();
88 88
    
89 89
    public void populateSymbolTable(SymbolTable aSymbolTable);    
90
    
91
    public ExpressionEvaluator createExpressionEvaluator(Expression expression);
90 92
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/spi/BaseExpressionEvaluator.java
1
package org.gvsig.expressionevaluator.spi;
2

  
3
import java.util.ArrayList;
4
import java.util.Collection;
5
import java.util.HashSet;
6
import java.util.List;
7
import java.util.Set;
8
import org.gvsig.expressionevaluator.Code;
9
import org.gvsig.expressionevaluator.Expression;
10
import org.gvsig.expressionevaluator.ExpressionEvaluator;
11
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
12
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
13
import org.gvsig.expressionevaluator.Function;
14
import org.gvsig.expressionevaluator.SupportToExpression;
15
import org.gvsig.expressionevaluator.SupportToSymbolTable;
16
import org.gvsig.expressionevaluator.SymbolTable;
17
import org.gvsig.tools.ToolsLocator;
18
import org.gvsig.tools.dynobject.DynStruct;
19
import org.gvsig.tools.evaluator.AbstractEvaluator;
20
import org.gvsig.tools.evaluator.Evaluator;
21
import org.gvsig.tools.evaluator.EvaluatorData;
22
import org.gvsig.tools.evaluator.EvaluatorException;
23
import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
24
import org.gvsig.tools.exception.BaseException;
25
import org.gvsig.tools.lang.Cloneable;
26
import org.gvsig.tools.persistence.PersistenceManager;
27
import org.gvsig.tools.persistence.PersistentState;
28
import org.gvsig.tools.persistence.exception.PersistenceException;
29
import org.gvsig.tools.util.ListBuilder;
30
import org.slf4j.Logger;
31
import org.slf4j.LoggerFactory;
32

  
33
@SuppressWarnings("UseSpecificCatch")
34
public class BaseExpressionEvaluator 
35
        extends AbstractEvaluator 
36
        implements ExpressionEvaluator, Cloneable, SupportToExpression, SupportToSymbolTable
37
    {
38

  
39
    private static final Logger LOGGER = LoggerFactory.getLogger(BaseExpressionEvaluator.class);
40

  
41
    private static class DescriptionAdapter implements Description {
42

  
43
        Function function;
44

  
45
        public DescriptionAdapter(Function function) {
46
            this.function = function;
47
        }
48

  
49
        @Override
50
        public String getName() {
51
            return this.function.name();
52
        }
53

  
54
        @Override
55
        public String getDescription() {
56
            return this.function.description();
57
        }
58

  
59
        @Override
60
        public String getTemplate() {
61
            return this.function.template();
62
        }
63

  
64
        @Override
65
        public int getDataTypeCategories() {
66
            switch (this.function.group()) {
67
                case Function.GROUP_STRING:
68
                    return Description.DATATYPE_CATEGORY_STRING;
69
                case Function.GROUP_BOOLEAN:
70
                    return Description.DATATYPE_CATEGORY_BOOLEAN;
71
                case Function.GROUP_DATETIME:
72
                    return Description.DATATYPE_CATEGORY_DATETIME;
73
                case Function.GROUP_NUMERIC:
74
                    return Description.DATATYPE_CATEGORY_NUMBER;
75
                case Function.GROUP_OGC:
76
                    return Description.DATATYPE_CATEGORY_ALL;
77
                default:
78
                    return Description.DATATYPE_CATEGORY_ALL;
79
            }
80
        }
81

  
82
    }
83

  
84
    private static class DataSymbolTable extends AbstractSymbolTable {
85

  
86
        EvaluatorData data;
87
        
88
        public DataSymbolTable() {
89
            super();
90
        }
91

  
92
        public void setData(EvaluatorData data) {
93
            this.data = data;
94
        }
95

  
96
        @Override
97
        public boolean exists(String name) {
98
            return data.hasDataValue(name);
99
        }
100

  
101
        @Override
102
        public Object value(String name) {
103
            return data.getDataValue(name);
104
        }
105

  
106
        @Override
107
        public Collection<String> localvariables() {
108
            List<String> names = ListBuilder.create(data.getDataNames());
109
            return names;
110
        }
111

  
112
        @Override
113
        public DataSymbolTable clone() throws CloneNotSupportedException {
114
            SymbolTable other = super.clone();
115
            return (DataSymbolTable) other;
116
        }
117
        
118
    }
119
            
120
    private DataSymbolTable dataSymbolTable;
121
    private SymbolTable symbolTable;
122
    private Expression expression;
123
    private Description[] availableOperators;
124
    private Description[] availableFunctions;
125

  
126
    public BaseExpressionEvaluator(String source) {
127
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
128
        this.symbolTable = manager.createSymbolTable();
129
        this.dataSymbolTable = new DataSymbolTable();
130
        this.symbolTable.addSymbolTable(this.dataSymbolTable);
131
        
132
        this.expression = manager.createExpression();
133
        this.expression.setPhrase(source);
134
    }
135

  
136
    public BaseExpressionEvaluator(Expression expression) {
137
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
138
        this.symbolTable = manager.createSymbolTable();
139
        this.dataSymbolTable = new DataSymbolTable();
140
        this.symbolTable.addSymbolTable(this.dataSymbolTable);
141

  
142
        this.expression = expression;
143
    }
144

  
145
    @Override
146
    public String getName() {
147
        return "Genereric expression";
148
    }
149

  
150
    @Override
151
    public String getDescription() {
152
        return this.expression.getPhrase();
153
    }
154

  
155
    @Override
156
    public String getSQL() {
157
        return this.expression.getPhrase();
158
    }
159

  
160
    @Override
161
    public Expression toExpression() {
162
        return expression;
163
    }
164

  
165
    @Override
166
    public SymbolTable toSymbolTable() {
167
        return this.symbolTable;
168
    }
169
    
170
    @Override
171
    public Object evaluate(EvaluatorData data) throws EvaluatorException {
172
        this.dataSymbolTable.setData(data);
173
        Object v = this.expression.execute(this.symbolTable);
174
        return v;
175
    }
176

  
177
    @Override
178
    public EvaluatorFieldsInfo getFieldsInfo() {
179
        final Set<String> names = new HashSet<>();
180
        try {
181
            this.expression.getCode().accept((Object code) -> {
182
              if (code instanceof Code.Identifier) {
183
                Code.Identifier identifier = (Code.Identifier) code;
184
                names.add(identifier.name());
185
              }
186
            });
187
            EvaluatorFieldsInfo info = new EvaluatorFieldsInfo();
188
            for (String name : names) {
189
                info.addFieldValue(name);
190
            }
191
            return info;
192
        } catch (BaseException ex) {
193
            throw new RuntimeException("Can't calculate fields information.", ex);
194
        }
195
    }
196

  
197
    @Override
198
    public Description[] getAvailableOperators() {
199
        if (availableOperators == null) {
200
            List<Description> l = new ArrayList<>();
201
            for (Function function : toSymbolTable()) {
202
                if (function.isOperator()) {
203
                    l.add(new DescriptionAdapter(function));
204
                }
205
            }
206
            this.availableOperators = l.toArray(new Description[l.size()]);
207
        }
208
        return availableOperators;
209
    }
210

  
211
    @Override
212
    public Description[] getAvailableFunctions() {
213
        if (availableFunctions == null) {
214
            List<Description> l = new ArrayList<>();
215
            for (Function function : toSymbolTable()) {
216
                if (!function.isOperator()) {
217
                    l.add(new DescriptionAdapter(function));
218
                }
219
            }
220
            this.availableFunctions = l.toArray(new Description[l.size()]);
221
        }
222
        return availableFunctions;
223
    }
224

  
225
    @Override
226
    public Evaluator clone() throws CloneNotSupportedException {
227
        BaseExpressionEvaluator other = (BaseExpressionEvaluator) super.clone();
228
        other.expression = this.expression.clone();
229
        other.availableFunctions = null;
230
        other.availableOperators = null;
231

  
232
        if (this.dataSymbolTable != null) {
233
            other.dataSymbolTable = this.dataSymbolTable.clone();
234
        }
235
        if (this.symbolTable != null) {
236
            other.symbolTable = this.symbolTable.clone();
237
        }
238
        return other;
239
    }
240

  
241
    @Override
242
    public void saveToState(PersistentState state) throws PersistenceException {
243
        
244
        state.set("expression", expression);
245
    }
246

  
247
    @Override
248
    public void loadFromState(PersistentState state) throws PersistenceException {
249
        expression = (Expression) state.get("expression");
250
        availableFunctions = null;
251
        availableOperators = null;
252
        
253
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
254
        this.symbolTable = manager.createSymbolTable();
255
        this.dataSymbolTable = new DataSymbolTable();
256
        this.symbolTable.addSymbolTable(this.dataSymbolTable);
257

  
258
    }
259
    
260
    
261
    public static void registerPersistence() {
262
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
263
        if (manager.getDefinition("DefaultExpressionEvaluator") == null) {
264
            DynStruct definition = manager.addDefinition(BaseExpressionEvaluator.class,
265
                    "DefaultExpressionEvaluator", "DefaultExpressionEvaluator persistence definition", null, null);
266
            definition.addDynFieldObject("expression").setClassOfValue(Expression.class).setMandatory(false);
267
        }
268
    }
269

  
270
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/ExpressionEvaluator.java
1
package org.gvsig.expressionevaluator;
2

  
3
import org.gvsig.tools.evaluator.EvaluatorWithDescriptions;
4
import org.gvsig.tools.persistence.Persistent;
5

  
6
/**
7
 *
8
 * @author jjdelcerro
9
 */
10
public interface ExpressionEvaluator extends EvaluatorWithDescriptions, Persistent, SupportToExpression, SupportToSymbolTable {
11

  
12
    /**
13
     * Get a SQL representation of the evaluator.
14
     *
15
     * This funcion can return a non-sql compatible expression.
16
     * 
17
     * @return the SQL string.
18
     */
19
    @Override
20
    public String getSQL();
21

  
22
}

Also available in: Unified diff