Revision 47168

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/GetattrFunction.java
6 6
package org.gvsig.expressionevaluator.impl.function.dataaccess;
7 7

  
8 8
import java.util.Objects;
9
import java.util.function.Function;
9 10
import org.apache.commons.lang3.StringUtils;
10 11
import org.gvsig.expressionevaluator.Code;
11 12
import org.gvsig.expressionevaluator.Codes;
12 13
import org.gvsig.expressionevaluator.ExpressionBuilder;
14
import static org.gvsig.expressionevaluator.impl.function.dataaccess.SelectFunction.PROP_FEATURETYPESUPPLIER;
13 15
import org.gvsig.fmap.dal.DALLocator;
14 16
import org.gvsig.fmap.dal.DataManager;
15 17
import org.gvsig.fmap.dal.SQLBuilder;
......
38 40
            if(!(args.get(1) instanceof Code.Constant)){
39 41
                return super.toValue(builder, args);
40 42
            }
43
            
44
            Function<String, FeatureType> featureTypeSupplier = (Function<String, FeatureType>) builder.getProperty(PROP_FEATURETYPESUPPLIER);
45
            if (featureTypeSupplier == null) {
46
                featureTypeSupplier = (String tableName) -> {
47
                    DataManager dataManager = DALLocator.getDataManager();
48
                    FeatureType featureType = dataManager.getStoresRepository().getFeatureType(tableName);
49
                    return featureType;
50
                };
51
            }
52
            
41 53
            String tableName = ((Code.Identifier)args.get(0)).name();
42 54
            String columnName = Objects.toString(((Code.Constant)args.get(1)).value(), null);
43 55
            if(StringUtils.isBlank(tableName) || StringUtils.isBlank(columnName)){
......
54 66
                if (StringUtils.equalsIgnoreCase(builderTableName, tableName)) {
55 67
                    featureType = (FeatureType) builder.getProperty(SQLBuilder.PROP_FEATURE_TYPE);
56 68
                } else {
57
                    DataManager dataManager = DALLocator.getDataManager();
58
                    featureType = dataManager.getStoresRepository().getFeatureType(tableName);
69
                    featureType = featureTypeSupplier.apply(tableName);
59 70
                }
60 71
                if (featureType == null) {
61 72
                    return super.toValue(builder, args);
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
25 25

  
26 26
import java.util.Iterator;
27 27
import java.util.List;
28
import java.util.function.Function;
28 29
import java.util.function.Predicate;
29 30
import org.apache.commons.lang3.Range;
30 31
import org.apache.commons.lang3.StringUtils;
......
77 78
    public static final int MODE_FROM_STORE = 0;
78 79
    public static final int MODE_FROM_SELECTION = 1;
79 80
    public static final int MODE_FROM_SELECTION_IF_NOT_EMPTY = 2;
81
    
82
    public static final String PROP_FEATURETYPESUPPLIER = "FEATURETYPESUPPLIER";
80 83

  
81 84
    private static final int COLUMNS = 0;
82 85
    private static final int TABLE = 1;
......
86 89
    private static final int LIMIT = 5;
87 90
    private static final int INTOVAR = 6;
88 91
    private static final int MODE_FROM = 7;
92
    
89 93

  
90
                    
91 94
    public SelectFunction() {
92 95
        super(DALFunctions.GROUP_DATA_ACCESS,
93 96
                FUNCTION_SELECT,
......
312 315
    public Code optimize(Optimizer optimizer, Callable caller) {
313 316
        return caller; // Don't optimize SELECT
314 317
    }
315

  
316
    @Override
318
    
317 319
    public ExpressionBuilder.Value toValue(ExpressionBuilder builder, Codes args) {
318 320
        try {
319 321
            SQLBuilder sqlBuilder = (SQLBuilder) builder.getProperty(PROP_SQLBUILDER);
320
            if(sqlBuilder == null){
322
            if (sqlBuilder == null) {
321 323
                return super.toValue(builder, args);
322 324
            }
325
            Function<String, FeatureType> featureTypeSupplier = (Function<String, FeatureType>) builder.getProperty(PROP_FEATURETYPESUPPLIER);
326
            if (featureTypeSupplier == null) {
327
                featureTypeSupplier = (String tableName) -> {
328
                    DataManager dataManager = DALLocator.getDataManager();
329
                    FeatureType featureType = dataManager.getStoresRepository().getFeatureType(tableName);
330
                    return featureType;
331
                };
332
            }
323 333
            FeatureType featureType = null;
324 334
            SQLBuilder.SelectBuilder select = sqlBuilder.createSelectBuilder();
325 335
            String builderTableName = (String) builder.getProperty(SQLBuilder.PROP_TABLENAME);
......
393 403
                            if(StringUtils.equalsIgnoreCase(builderTableName, tableName)){
394 404
                                featureType = (FeatureType) builder.getProperty(SQLBuilder.PROP_FEATURE_TYPE);
395 405
                            } else {
396
                                DataManager dataManager = DALLocator.getDataManager();
397
                                featureType = dataManager.getStoresRepository().getFeatureType(tableName);
406
                                featureType = featureTypeSupplier.apply(tableName);
398 407
                            }
399 408
                        }
400 409
                        if(featureType == null){
......
434 443
                if (StringUtils.equalsIgnoreCase(builderTableName, tableName)) {
435 444
                    featureType = (FeatureType) builder.getProperty(SQLBuilder.PROP_FEATURE_TYPE);
436 445
                } else {
437
                    DataManager dataManager = DALLocator.getDataManager();
438
                    featureType = dataManager.getStoresRepository().getFeatureType(tableName);
446
                    featureType = featureTypeSupplier.apply(tableName);
439 447
                }
440 448
            }
441 449

  
......
458 466
        ExpressionEvaluatorManager expressionManager = ExpressionEvaluatorLocator.getExpressionEvaluatorManager();
459 467
        ExpressionBuilder expressionBuilder = expressionManager.createExpressionBuilder();
460 468
        expressionBuilder.setProperty(PROP_SQLBUILDER, sqlbuilder);
469
        expressionBuilder.setProperty(PROP_FEATURETYPESUPPLIER, new Function<String, FeatureType>() {
470
            @Override
471
            public FeatureType apply(String t) {
472
                return null;
473
            }
474
        });
461 475
        
462 476
        ExpressionBuilder.Value values = this.toValue(expressionBuilder, args);
463
                
477
        
464 478
        return values.toString();
465 479
    }
466 480
    
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/test/java/org/gvsig/expressionevaluator/TestGrammarCompiler.java
451 451
        checkEquals("testSelectWhereOrderLimit", "( SELECT * FROM \"countries\" WHERE (\"LASTCENSUS\" > 0) ORDER BY \"LASTCENSUS\" DESC NULLS LAST LIMIT 3 )", code.toString());
452 452
    }
453 453

  
454
    public void testSelectWhereOrderLimit2() {
455
        try {
456
            StringBuilder source = new StringBuilder();
457
            source.append("((((GETATTR(\"ARENA2_ACCIDENTES\", 'TITULARIDAD_VIA') = 2) AND (GETATTR(\"ARENA2_ACCIDENTES\", 'FECHA_ACCIDENTE') >= DATE('2020-01-01'))) AND (GETATTR(\"ARENA2_ACCIDENTES\", 'FECHA_ACCIDENTE') <= DATE('2020-12-31'))) AND (EXISTS(SELECT(\"LID_ACCIDENTE\", \"ARENA2_VEHICULOS\", ((GETATTR(\"ARENA2_VEHICULOS\", 'ID_ACCIDENTE') = GETATTR(\"ARENA2_ACCIDENTES\", 'LID_ACCIDENTE')) AND (GETATTR(\"ARENA2_VEHICULOS\", 'TIPO_VEHICULO') = 4)), TUPLE(), TUPLE(), 1), 'EXISTSaa58b804d9094968ba04664f0c4c8553') OR EXISTS(SELECT(\"LID_ACCIDENTE\", \"ARENA2_VEHICULOS\", ((GETATTR(\"ARENA2_VEHICULOS\", 'ID_ACCIDENTE') = GETATTR(\"ARENA2_ACCIDENTES\", 'LID_ACCIDENTE')) AND (GETATTR(\"ARENA2_VEHICULOS\", 'TIPO_VEHICULO') = 30)), TUPLE(), TUPLE(), 1), 'EXISTSb67e753993c54d1da722ff25a00c2a02')))");
458

  
459
            Compiler compiler = createCompiler();
460

  
461
            Code code = compiler.compileExpression(source.toString());
462
            link(code);
463
            checkEquals("((((\"ARENA2_ACCIDENTES\".\"TITULARIDAD_VIA\" = 2) AND (\"ARENA2_ACCIDENTES\".\"FECHA_ACCIDENTE\" >= DATE('2020-01-01'))) AND (\"ARENA2_ACCIDENTES\".\"FECHA_ACCIDENTE\" <= DATE('2020-12-31'))) AND (EXISTS((SELECT \"LID_ACCIDENTE\"  FROM \"ARENA2_VEHICULOS\" WHERE ((\"ARENA2_VEHICULOS\".\"ID_ACCIDENTE\" = \"ARENA2_ACCIDENTES\".\"LID_ACCIDENTE\") AND (\"ARENA2_VEHICULOS\".\"TIPO_VEHICULO\" = 4)) LIMIT 1), 'EXISTSaa58b804d9094968ba04664f0c4c8553') OR EXISTS((SELECT \"LID_ACCIDENTE\"  FROM \"ARENA2_VEHICULOS\" WHERE ((\"ARENA2_VEHICULOS\".\"ID_ACCIDENTE\" = \"ARENA2_ACCIDENTES\".\"LID_ACCIDENTE\") AND (\"ARENA2_VEHICULOS\".\"TIPO_VEHICULO\" = 30)) LIMIT 1), 'EXISTSb67e753993c54d1da722ff25a00c2a02')))", code.toString());
464
        } catch (Exception ex) {
465
            ex.printStackTrace();
466
            throw ex;
467
        }
468
    }
469
    
454 470
    public void testSelectLimit() {
455 471
        StringBuilder source = new StringBuilder();
456 472
        source.append("SELECT * FROM countries  ");
trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.h2spatial/org.gvsig.h2spatial.h2gis132/org.gvsig.h2spatial.h2gis132.provider/src/test/java/org/gvsig/fmap/dal/store/h2/operations/usecases/arena2/TestSelectArena2A.java
1
package org.gvsig.fmap.dal.store.h2.operations.usecases.arena2;
2

  
3
import java.util.Objects;
4
import junit.framework.TestCase;
5
import static junit.framework.TestCase.assertEquals;
6
import org.gvsig.expressionevaluator.Code;
7
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
8
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
9
import org.gvsig.expressionevaluator.Interpreter;
10
import org.gvsig.expressionevaluator.LexicalAnalyzer;
11
import org.gvsig.expressionevaluator.MutableSymbolTable;
12
import org.gvsig.expressionevaluator.SymbolTable;
13
import org.gvsig.fmap.dal.DALLocator;
14
import org.gvsig.fmap.dal.DataManager;
15
import org.gvsig.fmap.dal.feature.FeatureStore;
16
import org.gvsig.fmap.dal.store.h2.TestUtilsH2Spatial;
17
import org.gvsig.fmap.dal.store.jdbc2.AbstractTestUtils;
18
import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer;
19
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
20
import org.slf4j.Logger;
21
import org.slf4j.LoggerFactory;
22

  
23
@SuppressWarnings("UseSpecificCatch")
24
public class TestSelectArena2A extends TestCase {
25

  
26
    private static final Logger LOGGER = LoggerFactory.getLogger(TestSelectArena2A.class);
27

  
28
    public TestSelectArena2A(String testName) {
29
        super(testName);
30
    }
31

  
32
    @Override
33
    protected void setUp() throws Exception {
34
        super.setUp();
35
        new DefaultLibrariesInitializer().fullInitialize();
36
    }
37

  
38
    @Override
39
    protected void tearDown() throws Exception {
40
        super.tearDown();
41
    }
42

  
43
    protected AbstractTestUtils utils;
44

  
45
    public AbstractTestUtils utils() {
46
        if (this.utils == null) {
47
            this.utils = this.createUtils();
48
        }
49
        return this.utils;
50
    }
51

  
52
    protected AbstractTestUtils createUtils() {
53
        return new TestUtilsH2Spatial();
54
    }
55
    
56
    protected LexicalAnalyzer createLexicalAnalyzer() {
57
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
58
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
59
        return lexer;
60
    }
61

  
62
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
63
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
64
        org.gvsig.expressionevaluator.Compiler compiler = manager.createCompiler();
65
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
66
        return compiler;
67
    }
68

  
69
    protected SymbolTable createSymbolTable() {
70
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
71
        MutableSymbolTable symbolTable = manager.createSymbolTable();
72
        symbolTable.setVar("precio", 200);
73
        symbolTable.setVar("1990", 0.168873933773767);
74
        return symbolTable;
75
    }
76

  
77
    protected Interpreter createInterpreter(SymbolTable symbolTable) {
78
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
79
        Interpreter interpreter = manager.createInterpreter();
80
        interpreter.setSymbolTable(symbolTable);
81
        return interpreter;
82
    }
83
    
84
    private void dump(String testname, Object expected, Object actual) {
85
        System.out.println("### ---------------------");
86
        System.out.println("### "+testname);
87
        System.out.println("### expected: ["+Objects.toString(expected)+"]");
88
        System.out.println("### actual  : ["+Objects.toString(actual)+"]");
89
    }
90
    
91
    private void checkEquals(String testname, Object expected, Object actual) {
92
        dump(testname,expected,actual);
93
        assertEquals(expected, actual);
94
    }
95

  
96
    private void checkEquals(Object expected, Object actual) {
97
        try {
98
            throw new RuntimeException();
99
        } catch(Throwable t) {
100
            String testname = t.getStackTrace()[1].getMethodName();
101
            dump(testname,expected,actual);
102
            assertEquals(expected, actual);
103
        }
104
    }
105

  
106
    
107
    private void link(Code code) {
108
      code.link(createSymbolTable());
109
    }
110

  
111
    public void testSelectArena2A() throws Exception {
112
        try {
113
            FeatureStore sourceStoreConductores = utils().openCSVStore("usecases/arena2/ARENA2_CONDUCTORES.csv");
114
            FeatureStore sourceStoreVehiculos = utils().openCSVStore("usecases/arena2/ARENA2_VEHICULOS.csv");
115
            
116
            JDBCServerExplorer explorer = utils().openServerExplorer("testSelectArena2A");
117

  
118
            utils().info_jdbc(explorer);
119
            utils().drop_tables(explorer, sourceStoreConductores.getName());
120
            utils().drop_tables(explorer, sourceStoreVehiculos.getName());
121

  
122
            utils().create_table_from(explorer, sourceStoreConductores.getName(), sourceStoreConductores);
123
            utils().create_table_from(explorer, sourceStoreVehiculos.getName(), sourceStoreVehiculos);
124
            utils().insert_into_from(explorer, sourceStoreConductores.getName(), sourceStoreConductores, FeatureStore.MODE_APPEND);
125
            utils().insert_into_from(explorer, sourceStoreVehiculos.getName(), sourceStoreVehiculos, FeatureStore.MODE_APPEND);
126
            
127
            DataManager dataManager = DALLocator.getDataManager();
128
            dataManager.getStoresRepository().add(sourceStoreConductores.getName(), explorer.get(sourceStoreConductores.getName()));
129
            dataManager.getStoresRepository().add(sourceStoreVehiculos.getName(), explorer.get(sourceStoreVehiculos.getName()));
130
            
131
            StringBuilder source = new StringBuilder();
132
            source.append("SELECT * FROM ARENA2_CONDUCTORES  WHERE ARENA2_CONDUCTORES.LID_VEHICULO = ARENA2_VEHICULOS.LID_VEHICULO");
133

  
134
            MutableSymbolTable symbolTable = (MutableSymbolTable) createSymbolTable();
135
            org.gvsig.expressionevaluator.Compiler compiler = createCompiler();
136
            Interpreter interpreter = createInterpreter(symbolTable);
137

  
138
            Code code = compiler.compileExpression(source.toString());
139
            link(code);       
140
            checkEquals("( SELECT * FROM \"ARENA2_CONDUCTORES\" WHERE (\"ARENA2_CONDUCTORES\".\"LID_VEHICULO\" = \"ARENA2_VEHICULOS\".\"LID_VEHICULO\") )", code.toString());
141

  
142

  
143
        } catch (Throwable th) {
144
            LOGGER.warn("", th);
145
            throw th;
146
        }
147
    }
148
}

Also available in: Unified diff