Revision 47062

View differences:

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/Interpreter.java
25 25

  
26 26
    public void run(MutableSymbolTable symbolTable, Code code);
27 27

  
28
    public Object runCode(Code arg) throws Exception;
29

  
28 30
    public void link(Code code);
29 31

  
30 32
    public Double getAccuracy();
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/AbstractFunction.java
467 467
        if( arg==null ) {
468 468
            return null;
469 469
        }
470
        Object value = interpreter.run(arg);
470
        Object value = null;
471
        try {
472
            value = interpreter.runCode(arg);
473
        } catch(RuntimeException ex) {
474
            throw ex;
475
        } catch(Exception ex) {
476
            throw new ExpressionRuntimeException(arg, "", ex);
477
        }
478

  
471 479
        return value;
472 480
    }
473 481
    
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/formatter/value/Cast.java
1
package org.gvsig.expressionevaluator.spi.formatter.value;
2

  
3
import java.util.List;
4
import org.apache.commons.lang3.StringUtils;
5
import org.gvsig.expressionevaluator.ExpressionBuilder;
6
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_CAST;
7
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
8
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
9
import org.gvsig.expressionevaluator.Formatter;
10

  
11
/**
12
 *
13
 * @author jjdelcerro
14
 */
15
public class Cast implements Formatter<Value> {
16
    
17
    private final Formatter<Value> formatter;
18
    
19
    public Cast(Formatter<Value> formatter) {
20
        this.formatter = formatter;
21
    }
22
    @Override
23
    public boolean canApply(ExpressionBuilder.Value value) {
24
        if (value instanceof ExpressionBuilder.Function) {
25
            return StringUtils.equalsIgnoreCase(FUNCTION_CAST, ((Function) value).name());
26
        }
27
        return false;
28
    }
29

  
30
    @Override
31
    public String format(Value function0) {
32
        Function function = (Function) function0;
33
        StringBuilder builder = new StringBuilder();
34
        List<Value> args = function.parameters();
35
        builder.append("CAST(");
36
        builder.append(args.get(0).toString(formatter));
37
        builder.append(" AS ");
38
        builder.append(((ExpressionBuilder.Constant)args.get(1)).value());
39
        builder.append(")");
40
        return builder.toString();
41
    }
42
    
43
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/test/java/org/gvsig/expresionevaluator/impl/TestScript1.java
46 46
        assertEquals(true, r);
47 47

  
48 48
        r = sc.invokeFunction("form_isReadOnly", new Object[]{"form"});
49
        assertEquals(false, r);
49
        assertEquals(true, r);
50 50
    }
51 51

  
52 52
    public void testScript2() throws Exception {
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/DefaultInterpreter.java
278 278
        code.link(this.getSymbolTable());
279 279
    }
280 280

  
281
    @Override
281 282
    public Object runCode(Code code) throws Exception {
282 283
        RecursionControlSupport recursionControl = null;
283 284
        if( code instanceof RecursionControlSupport ) {
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/DefaultCodeBuilder.java
301 301
            BaseCodes x = (BaseCodes)super.clone();
302 302
            x.codes = new ArrayList<>();
303 303
            for (int i = 0; i < this.codes.size(); i++) {
304
                x.add(this.codes.get(i).clone());
304
                Code code = this.codes.get(i);
305
                if(code != null){
306
                    x.add(code.clone());
307
                } else {
308
                    x.add(null);
309
                }
305 310
            }
306 311
            return x;
307 312
        }
......
662 667
        @Override
663 668
        public Code clone() throws CloneNotSupportedException {
664 669
            BaseMethod x = (BaseMethod) super.clone();
665
            x.args = this.args.clone();
670
            if(this.args != null){
671
                x.args = this.args.clone();
672
            } else {
673
                x.args = null;
674
            }
666 675
            return x;
667 676
        }
668 677
        
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.geometry/org.gvsig.expressionevaluator.geometry.lib/org.gvsig.expressionevaluator.geometry.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/repr/ReprGeometry.java
3 3
import org.gvsig.expressionevaluator.ReprMethod;
4 4
import java.util.Date;
5 5
import org.apache.commons.lang3.StringUtils;
6
import org.cresques.cts.IProjection;
6 7
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
7 8
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
8 9
import org.gvsig.fmap.geom.Geometry;
......
30 31
    @Override
31 32
    public String repr(Object value) {
32 33
        StringBuilder builder = new StringBuilder();
34
        //ST_GEOMFROMTEXT
33 35
        try {
34
            builder.append("'");
35
            builder.append(((Geometry) value).convertToWKT());
36
            builder.append("'::geometry");
36
            if(value == null){
37
                return "CAST(NULL AS geometry)";
38
            }
39
            Geometry geom = (Geometry) value;
40
            IProjection proj = geom.getProjection();
41
            if(proj == null){
42
                builder.append("ST_GEOMFROMTEXT('");
43
                builder.append(geom.convertToWKT());
44
                builder.append("')");
45
                
46
            } else {
47
                String abrev = geom.getProjection().getAbrev();
48
                String srid = abrev.split(":")[1];
49
                builder.append("ST_SETSRID(ST_GEOMFROMTEXT('");
50
                builder.append(geom.convertToWKT());
51
                builder.append("'),");
52
                builder.append(srid);
53
                builder.append(")");
54
            }
37 55
        } catch (Exception ex) {
38
            builder.append("'UNKNOW'::geometry");
56
            builder.append("CAST('UNKNOW' AS geometry)");
39 57
        }
40 58
        return builder.toString();
41 59
    }
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.geometry/org.gvsig.expressionevaluator.geometry.lib/org.gvsig.expressionevaluator.geometry.lib.impl/src/test/java/org/gvsig/expresionevaluator/impl/TestOptimizer.java
151 151
//        System.out.println("Tiempo de optimizacion: " + (System.currentTimeMillis() - t1));
152 152
        System.out.println(code2.toString());
153 153
        assertEquals(
154
                "((\"campo1\" > 10) AND ST_Intersects('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))'::geometry, \"GEOMETRY\"))",
154
                "((\"campo1\" > 10) AND ST_Intersects(ST_SETSRID(ST_GEOMFROMTEXT('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))'),4326), \"GEOMETRY\"))",
155 155
                code2.toString()
156 156
        );
157 157

  
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/AbstractSelectFunction.java
162 162
        }
163 163
    }
164 164

  
165
    protected Code replaceLocalVariables(Interpreter interpreter, Code expression, FeatureType currentType) {
166
        try {
167
            SymbolTable symbolTable = interpreter.getSymbolTable();
168
            TableAttributeHandler table = (TableAttributeHandler) symbolTable.value(SYMBOL_CURRENT_TABLE);
169
            List<Pair<Code, Code>> replaces = new ArrayList<>();
170
            CodeBuilder codeBuilder = ExpressionUtils.createCodeBuilder();
171
            Code expression2 = expression.clone();
172
            expression2.accept((Object o) -> {
173
                if (o == null) {
174
                    return;
175
                }
176
                Code code = (Code) o;
177
                switch (code.code()) {
178
                    case Code.IDENTIFIER:
179
                        Code.Identifier id = (Code.Identifier) code;
180
                        if (currentType.getAttributeDescriptor(id.name()) == null && symbolTable.exists(id.name())) {
181
                            Object value = symbolTable.value(id.name());
182
                            replaces.add(
183
                                    new ImmutablePair<>(
184
                                            id,
185
                                            codeBuilder.constant(value)
186
                                    )
187
                            );
188
                        }
189
                        break;
190
                }
191
            });
192
            if (replaces.isEmpty()) {
193
                return expression;
194
            }
195
            for (Pair<Code, Code> replace : replaces) {
196
                if (replace != null) {
197
                    expression2.replace(replace.getLeft(), replace.getRight());
198
                }
199
            }
200
            return expression2;
201
        } catch (Exception ex) {
202
            throw new ExpressionRuntimeException("Can't remove references to outer tables.", ex);
203
        }
204
    }
205

  
165 206
    protected DataStore getStore(String storeName) {
166 207
        DataManager dataManager = DALLocator.getDataManager();
167 208
        DataStore store = dataManager.getStoresRepository().getStore(storeName);
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
127 127
        Callable order = getTupleOrNull(args, ORDER);
128 128
        Callable order_mode = getTupleOrNull(args, ORDER_MODE);
129 129
        FeatureQueryOrder queryOrder = null;
130
        if (order != null || order_mode != null) {
131
            for (int n = 0; n < order.parameters().size(); n++) {
132
                if (queryOrder == null) {
133
                    queryOrder = new DefaultFeatureQueryOrder();
134
                }
135
                Boolean mode = (Boolean) ((Code.Constant)order_mode.parameters().get(n)).value();
136
                Code memberCode = order.parameters().get(n);
137
                if(memberCode.code() == Code.IDENTIFIER) {
138
                    queryOrder.add(((Code.Identifier)memberCode).name(), mode);
139
                } else {
140
                    Expression exp = ExpressionUtils.createExpression(memberCode.toString());
141
                    queryOrder.add(exp, mode);
142
                }
143
            }
144
        }
145
        String intovar = null;
146
        if( args.size()>INTOVAR ) {
147
            intovar = this.getIdentifier(args, INTOVAR);
148
        }
149 130
        FeatureStore featureStore;
150 131
        try {
151 132
            featureStore = this.getFeatureStore(storeName);
152 133
            if (featureStore == null) {
153 134
                throw new ExpressionRuntimeException("Cant locate the feature store '" + storeName + "' in function '" + this.name() + "'.");
154 135
            }
136
            if (order != null || order_mode != null) {
137
                for (int n = 0; n < order.parameters().size(); n++) {
138
                    if (queryOrder == null) {
139
                        queryOrder = new DefaultFeatureQueryOrder();
140
                    }
141
                    Boolean mode = (Boolean) ((Code.Constant)order_mode.parameters().get(n)).value();
142
                    Code memberCode = order.parameters().get(n);
143
                    if(memberCode.code() == Code.IDENTIFIER) {
144
                        queryOrder.add(((Code.Identifier)memberCode).name(), mode);
145
                    } else {
146
                        Code memberCode2 = replaceLocalVariables(interpreter, memberCode, featureStore.getDefaultFeatureTypeQuietly());
147
                        Expression exp = ExpressionUtils.createExpression(memberCode2.toString());
148
                        queryOrder.add(exp, mode);
149
                    }
150
                }
151
            }
152
            String intovar = null;
153
            if( args.size()>INTOVAR ) {
154
                intovar = this.getIdentifier(args, INTOVAR);
155
            }
155 156
            List<Feature> features;
156 157
            FeatureQuery query = featureStore.createFeatureQuery();
157 158
            if (where != null) {
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/JDBCHelperBase.java
519 519
        switch (column.getType()) {
520 520
          case DataTypes.GEOMETRY:
521 521
            value = this.getGeometryFromColumn(rs, rsIndex++);
522
            if (value != null){
523
                ((Geometry)value).setProjection(column.getSRS());
524
            }
522 525
            break;
523 526
          default:
524 527
            value = rs.getObject(rsIndex++);
trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.h2spatial/org.gvsig.h2spatial.h2gis132/org.gvsig.h2spatial.h2gis132.provider/src/main/java/org/gvsig/fmap/dal/store/h2/expressionbuilderformatter/H2SpatialFormatter.java
3 3
import org.gvsig.expressionevaluator.ExpressionBuilder;
4 4
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
5 5
import org.gvsig.expressionevaluator.Formatter;
6
import org.gvsig.expressionevaluator.spi.formatter.value.Cast;
6 7
import org.gvsig.fmap.dal.DALLocator;
7 8
import org.gvsig.fmap.dal.SQLBuilder;
8 9
import org.gvsig.fmap.dal.store.jdbc2.spi.expressionbuilder.formatters.$Constant;
......
50 51
            new ToDouble(this.builder, this),
51 52
            new ToLong(this.builder, this),
52 53
            new ToString(this.builder, this),
54
            new Cast(this),
53 55
            DALLocator.getDataManager().createDALExpressionBuilder().formatter(this),
54 56
        };
55 57
    }

Also available in: Unified diff