Revision 46105

View differences:

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/test/java/org/gvsig/fmap/dal/store/jdbc2/AbstractTestUtils.java
19 19
import org.gvsig.fmap.dal.DataServerExplorerParameters;
20 20
import org.gvsig.fmap.dal.DataStore;
21 21
import static org.gvsig.fmap.dal.DataStore.H2SPATIAL_PROVIDER_NAME;
22
import org.gvsig.fmap.dal.DataStoreParameters;
22 23
import org.gvsig.fmap.dal.DatabaseWorkspaceManager;
23 24
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.FIELD_RESOURCES_NAME;
24 25
import static org.gvsig.fmap.dal.DatabaseWorkspaceManager.TABLE_RESOURCES_NAME;
......
420 421
        return explorer;
421 422
    }
422 423

  
423
    public void drop_tables(JDBCServerExplorer explorer, String...tables) {
424
    public void drop_tables(JDBCServerExplorer explorer, String...tables) throws Exception {
424 425
        for (String table : tables) {
425 426
            String sql = "DROP TABLE IF EXISTS \""+table+"\"";
426 427
            explorer.execute(sql);
428
            removeResource(explorer, table, "dal");
427 429
        }
428 430
    }
429 431
    
432
    public void initWorkspace(String name) throws Exception {
433
        JDBCServerExplorer explorer = this.openServerExplorer(name);
434
        DataManager manager = DALLocator.getDataManager();
435
        DatabaseWorkspaceManager ws = manager.createDatabaseWorkspaceManager(explorer.getParameters());
436
        ws.connect();
437
        if (!ws.existsTable(DatabaseWorkspaceManager.TABLE_CONFIGURATION)) {
438
            ws.createTable(DatabaseWorkspaceManager.TABLE_CONFIGURATION);
439
        }
440
        if (!ws.existsTable(DatabaseWorkspaceManager.TABLE_RESOURCES)) {
441
            ws.createTable(DatabaseWorkspaceManager.TABLE_RESOURCES);
442
        }
443
    }
444
    
430 445
//    public abstract String getExpectedResourcesPrefix(); // Ex. "h2spatial"
431 446

  
432 447
    public abstract String getExpectedsPath();
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/test/java/org/gvsig/fmap/dal/store/jdbc2/AbstractTestComputedAttributes.java
19 19
import org.slf4j.LoggerFactory;
20 20

  
21 21
public abstract class AbstractTestComputedAttributes extends TestCase {
22
    
22

  
23 23
    protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractTestComputedAttributes.class);
24 24

  
25 25
    protected AbstractTestUtils utils;
......
27 27
    public AbstractTestComputedAttributes(String testName) {
28 28
        super(testName);
29 29
    }
30
    
30

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

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

  
42 42
    public AbstractTestUtils utils() {
43 43
        if (this.utils == null) {
44 44
            this.utils = this.createUtils();
......
47 47
    }
48 48

  
49 49
    protected abstract AbstractTestUtils createUtils();
50
    
50

  
51 51
    // TODO add test methods here. The name must begin with 'test'. For example:
52 52
    // public void testHello() {}
53
    
54 53
    public void testComputed1() throws Exception {
55
        if( !utils().isTheDatabaseAvailable() ) {
56
            return;
57
        }
58
        FeatureStore sourceStore = utils().openSourceStore2();
59
        JDBCServerExplorer explorer = utils().openServerExplorer("testCreate");
54
        try {
55
            if (!utils().isTheDatabaseAvailable()) {
56
                return;
57
            }
58
            FeatureStore sourceStore = utils().openSourceStore2();
59
            JDBCServerExplorer explorer = utils().openServerExplorer("testCreate");
60
            utils().initWorkspace("testCreate");
61
            
62
            utils().info_jdbc(explorer);
60 63

  
61
        utils().info_jdbc(explorer);
64
            utils().drop_tables(explorer, "testCreateTarget2");
65
            utils().create_table_from(explorer, "testCreateTarget2", sourceStore);
66
            utils().insert_into_from(explorer, "testCreateTarget2", sourceStore, FeatureStore.MODE_APPEND);
62 67

  
63
        utils().drop_tables(explorer, "testCreateTarget2");
64
        utils().create_table_from(explorer, "testCreateTarget2", sourceStore);
65
        utils().insert_into_from(explorer, "testCreateTarget2", sourceStore, FeatureStore.MODE_APPEND);
66
      
67
        FeatureStore dbstore = utils().openStore(explorer,"testCreateTarget2");
68
        dbstore.edit();
69
        FeatureType featureType = dbstore.getDefaultFeatureType();
70
        EditableFeatureType eFeatureType = featureType.getEditable();
71
        eFeatureType.add("Compu1", 
72
                DataTypes.INTEGER, 
73
                new DefaultFeatureAttributeEmulatorExpression(
74
                        eFeatureType, 
75
                        ExpressionUtils.createExpression("ID*2")
76
                ));
77
        eFeatureType.add("Compu2", 
78
                DataTypes.INTEGER, 
79
                new DefaultFeatureAttributeEmulatorExpression(
80
                        eFeatureType, 
81
                        ExpressionUtils.createExpression("Poblacion+10000+Compu1")
82
                ));
83
        dbstore.update(eFeatureType);
84
        dbstore.finishEditing();
85
        List<Feature> features = dbstore.getFeatures();
86
        for (int i = 0; i < features.size(); i++) {
87
            Feature feature = features.get(i);
88
            assertEquals("Compu1 "+i, feature.getInt("ID") * 2, feature.getInt("Compu1"));
89
            if(feature.get("Poblacion")==null) {
90
                assertEquals("Compu2 "+i, null, feature.get("Compu2"));
91
            } else {
92
                assertEquals("Compu2 "+i, feature.getInt("Poblacion") + 10000 + feature.getInt("Compu1"), feature.getInt("Compu2"));
68
            FeatureStore dbstore = utils().openStore(explorer, "testCreateTarget2");
69
            dbstore.edit();
70
            FeatureType featureType = dbstore.getDefaultFeatureType();
71
            EditableFeatureType eFeatureType = featureType.getEditable();
72
            eFeatureType.add("Compu1",
73
                    DataTypes.INTEGER,
74
                    new DefaultFeatureAttributeEmulatorExpression(
75
                            eFeatureType,
76
                            ExpressionUtils.createExpression("ID*2")
77
                    ));
78
            eFeatureType.add("Compu2",
79
                    DataTypes.INTEGER,
80
                    new DefaultFeatureAttributeEmulatorExpression(
81
                            eFeatureType,
82
                            ExpressionUtils.createExpression("Poblacion+10000+Compu1")
83
                    ));
84
            dbstore.update(eFeatureType);
85
            dbstore.finishEditing();
86
            List<Feature> features = dbstore.getFeatures();
87
            for (int i = 0; i < features.size(); i++) {
88
                Feature feature = features.get(i);
89
                assertEquals("Compu1 " + i, feature.getInt("ID") * 2, feature.getInt("Compu1"));
90
                if (feature.get("Poblacion") == null) {
91
                    assertEquals("Compu2 " + i, null, feature.get("Compu2"));
92
                } else {
93
                    assertEquals("Compu2 " + i, feature.getInt("Poblacion") + 10000 + feature.getInt("Compu1"), feature.getInt("Compu2"));
94
                }
93 95
            }
96
            DisposeUtils.dispose(dbstore);
97
        } catch (Throwable th) {
98
            LOGGER.warn("", th);
99
            throw th;
94 100
        }
95
        DisposeUtils.dispose(dbstore);
96 101
    }
97
    
102

  
98 103
    @SuppressWarnings("UnusedAssignment")
99 104
    public void testComputed2() throws Exception {
100
        if( !utils().isTheDatabaseAvailable() ) {
101
            return;
102
        }
103
        String testTableName = "testComputedAttributes2";
104
        JDBCServerExplorer explorer = utils().openServerExplorer("computedAttr");
105
        try {
106
            if (!utils().isTheDatabaseAvailable()) {
107
                return;
108
            }
109
            String testTableName = "testComputedAttributes2";
110
            JDBCServerExplorer explorer = utils().openServerExplorer("computedAttr");
105 111

  
106
        utils().info_jdbc(explorer);
107
        utils().drop_tables(explorer, testTableName);
108
        
109
        FeatureStore sourceStore = utils().openSourceStore2();
110
        
111
        utils().create_table_from(explorer, testTableName, sourceStore);
112
        utils().insert_into_from(explorer, testTableName, sourceStore, FeatureStore.MODE_APPEND);
113
      
114
        FeatureStore dbstore = utils().openStore(explorer,testTableName);
115
        
116
        dbstore.edit();
117
        FeatureType featureType = dbstore.getDefaultFeatureType();
118
        EditableFeatureType eFeatureType = featureType.getEditable();
119
        FeatureQuery query = sourceStore.createFeatureQuery();
120
        eFeatureType.add("CompuID", 
121
                DataTypes.INTEGER, 
122
                new DefaultFeatureAttributeEmulatorExpression(
123
                        eFeatureType, 
124
                        ExpressionUtils.createExpression("MOD(ID,10)")
125
                ));
126
        eFeatureType.add("CompuPob", 
127
                DataTypes.INTEGER, 
128
                new DefaultFeatureAttributeEmulatorExpression(
129
                        eFeatureType, 
130
                        ExpressionUtils.createExpression("Poblacion+1")
131
                ));
132
        eFeatureType.add("CompuProv", 
133
                DataTypes.STRING, 
134
                new DefaultFeatureAttributeEmulatorExpression(
135
                        eFeatureType, 
136
                        ExpressionUtils.createExpression("UPPER(Provincia)")
137
                ));
138
        EditableFeatureAttributeDescriptor extraColumn1 = 
139
                query.getExtraColumn().add("ExtraID900", DataTypes.INTEGER);
140
        EditableFeatureAttributeDescriptor extraColumn2 = 
141
                query.getExtraColumn().add("ExtraPobDen", DataTypes.INTEGER);
142
        EditableFeatureAttributeDescriptor extraColumn3 = 
143
                query.getExtraColumn().add("ExtraAno", DataTypes.INTEGER);
112
            utils().info_jdbc(explorer);
113
            utils().drop_tables(explorer, testTableName);
144 114

  
145
        extraColumn1.setFeatureAttributeEmulator(
146
                new DefaultFeatureAttributeEmulatorExpression(
147
                        eFeatureType, 
148
                        ExpressionUtils.createExpression("CompuID+900")));
149
        extraColumn2.setFeatureAttributeEmulator(
150
                new DefaultFeatureAttributeEmulatorExpression(
151
                        eFeatureType, 
152
                        ExpressionUtils.createExpression("CompuPob+Densidad")));
153
        extraColumn3.setFeatureAttributeEmulator(
154
                new DefaultFeatureAttributeEmulatorExpression(
155
                        eFeatureType, 
156
                        ExpressionUtils.createExpression("EXTRACT(YEAR FROM Fecha)")));
157
	
158
        query.getGroupByColumns().add("Comunidad");
159
        query.getGroupByColumns().add("CompuProv");
160
        query.getGroupByColumns().add("ExtraAno");
161
        query.getAggregateFunctions().put("ID", "MIN");
162
        query.getAggregateFunctions().put("Poblacion", "MIN");
163
        query.getAggregateFunctions().put("CompuID", "MIN");
164
        query.getAggregateFunctions().put("CompuPob", "SUM");
165
        query.getAggregateFunctions().put("ExtraID900", "SUM");
166
        query.getAggregateFunctions().put("ExtraPobDen", "SUM");
167
        dbstore.update(eFeatureType);
168
        dbstore.finishEditing();
169
        
170
        
171
        List<Feature> features0 = dbstore.getFeatures(query);
172
        ArrayList<Feature> features = new ArrayList<>();
173
        
174
        System.out.println("ID,Comunidad,Provincia,Ciudad,Poblacion,Densidad,Fecha,CompuID,CompuPob,CompuProv,ExtraID900,ExtraPobDen,ExtraAno");
175
        for (int i = 0; i < features0.size(); i++) {
176
            Feature feature = features0.get(i);
177
            features.add(feature.getCopy());
178
	    System.out.print(feature.toString());
179
	    System.out.print(","+feature.get("ExtraID900"));
180
	    System.out.print(","+feature.get("ExtraPobDen"));
181
	    System.out.println(","+feature.get("ExtraAno"));
115
            FeatureStore sourceStore = utils().openSourceStore2();
116

  
117
            utils().create_table_from(explorer, testTableName, sourceStore);
118
            utils().insert_into_from(explorer, testTableName, sourceStore, FeatureStore.MODE_APPEND);
119

  
120
            FeatureStore dbstore = utils().openStore(explorer, testTableName);
121

  
122
            dbstore.edit();
123
            FeatureType featureType = dbstore.getDefaultFeatureType();
124
            EditableFeatureType eFeatureType = featureType.getEditable();
125
            FeatureQuery query = sourceStore.createFeatureQuery();
126
            eFeatureType.add("CompuID",
127
                    DataTypes.INTEGER,
128
                    new DefaultFeatureAttributeEmulatorExpression(
129
                            eFeatureType,
130
                            ExpressionUtils.createExpression("MOD(ID,10)")
131
                    ));
132
            eFeatureType.add("CompuPob",
133
                    DataTypes.INTEGER,
134
                    new DefaultFeatureAttributeEmulatorExpression(
135
                            eFeatureType,
136
                            ExpressionUtils.createExpression("Poblacion+1")
137
                    ));
138
            eFeatureType.add("CompuProv",
139
                    DataTypes.STRING,
140
                    new DefaultFeatureAttributeEmulatorExpression(
141
                            eFeatureType,
142
                            ExpressionUtils.createExpression("UPPER(Provincia)")
143
                    ));
144
            EditableFeatureAttributeDescriptor extraColumn1
145
                    = query.getExtraColumn().add("ExtraID900", DataTypes.INTEGER);
146
            EditableFeatureAttributeDescriptor extraColumn2
147
                    = query.getExtraColumn().add("ExtraPobDen", DataTypes.INTEGER);
148
            EditableFeatureAttributeDescriptor extraColumn3
149
                    = query.getExtraColumn().add("ExtraAno", DataTypes.INTEGER);
150

  
151
            extraColumn1.setFeatureAttributeEmulator(
152
                    new DefaultFeatureAttributeEmulatorExpression(
153
                            eFeatureType,
154
                            ExpressionUtils.createExpression("CompuID+900")));
155
            extraColumn2.setFeatureAttributeEmulator(
156
                    new DefaultFeatureAttributeEmulatorExpression(
157
                            eFeatureType,
158
                            ExpressionUtils.createExpression("CompuPob+Densidad")));
159
            extraColumn3.setFeatureAttributeEmulator(
160
                    new DefaultFeatureAttributeEmulatorExpression(
161
                            eFeatureType,
162
                            ExpressionUtils.createExpression("EXTRACT(YEAR FROM Fecha)")));
163

  
164
            query.getGroupByColumns().add("Comunidad");
165
            query.getGroupByColumns().add("CompuProv");
166
            query.getGroupByColumns().add("ExtraAno");
167
            query.getAggregateFunctions().put("ID", "MIN");
168
            query.getAggregateFunctions().put("Poblacion", "MIN");
169
            query.getAggregateFunctions().put("CompuID", "MIN");
170
            query.getAggregateFunctions().put("CompuPob", "SUM");
171
            query.getAggregateFunctions().put("ExtraID900", "SUM");
172
            query.getAggregateFunctions().put("ExtraPobDen", "SUM");
173
            dbstore.update(eFeatureType);
174
            dbstore.finishEditing();
175

  
176
            List<Feature> features0 = dbstore.getFeatures(query);
177
            ArrayList<Feature> features = new ArrayList<>();
178

  
179
            System.out.println("ID,Comunidad,Provincia,Ciudad,Poblacion,Densidad,Fecha,CompuID,CompuPob,CompuProv,ExtraID900,ExtraPobDen,ExtraAno");
180
            for (int i = 0; i < features0.size(); i++) {
181
                Feature feature = features0.get(i);
182
                features.add(feature.getCopy());
183
                System.out.print(feature.toString());
184
                System.out.print("," + feature.get("ExtraID900"));
185
                System.out.print("," + feature.get("ExtraPobDen"));
186
                System.out.println("," + feature.get("ExtraAno"));
187
            }
188
            System.out.println("ID,Comunidad,Provincia,Ciudad,Poblacion,Densidad,Fecha,CompuID,CompuPob,CompuProv,ExtraID900,ExtraPobDen,ExtraAno");
189

  
190
            features0 = null;
191
            String[] header = new String[]{"ID", "Comunidad", "Provincia", "Ciudad", "Poblacion", "Densidad", "Fecha", "CompuID", "CompuPob", "CompuProv", "ExtraID900", "ExtraPobDen", "ExtraAno"};
192
            ArrayList<Object[]> values = new ArrayList<>();
193
            values.add(new Object[]{0, null, null, null, null, null, null, 0, null, "", 900, null, null});
194
            values.add(new Object[]{5, "GVA", null, null, 200, null, null, 5, 201, "ALICANTE", 905, 206, 2019});
195
            values.add(new Object[]{6, "GVA", null, null, 20, null, null, 6, 422, "ALICANTE", 1813, 1135, 2020});
196
            values.add(new Object[]{8, "GVA", null, null, 100, null, null, 8, 702, "CASTELLON", 1817, 719, 2019});
197
            values.add(new Object[]{1, "GVA", null, null, 500, null, null, 1, 1502, "VALENCIA", 1803, 1505, 2019});
198
            values.add(new Object[]{3, "GVA", null, null, 50, null, null, 3, 352, "VALENCIA", 1807, 359, 2020});
199
            for (int i = 0; i < features.size(); i++) {
200
                for (int j = 0; j < header.length; j++) {
201
                    assertEquals("feature[" + i + "][" + header[j] + "]:", values.get(i)[j], features.get(i).get(header[j]));
202
                }
203
            }
204

  
205
            DisposeUtils.dispose(dbstore);
206
        } catch (Throwable th) {
207
            LOGGER.warn("", th);
208
            throw th;
182 209
        }
183
        System.out.println("ID,Comunidad,Provincia,Ciudad,Poblacion,Densidad,Fecha,CompuID,CompuPob,CompuProv,ExtraID900,ExtraPobDen,ExtraAno");
184
	
185
        features0 = null;
186
	String[] header = new String[]{"ID","Comunidad","Provincia","Ciudad","Poblacion","Densidad","Fecha","CompuID","CompuPob","CompuProv","ExtraID900","ExtraPobDen","ExtraAno"};
187
	ArrayList<Object[]> values = new ArrayList<>();
188
	values.add(new Object[]{0, null, null, null, null, null, null, 0, null,"",900,null,null});
189
	values.add(new Object[]{1, "GVA", null, null, 500, null, null, 1, 1502, "VALENCIA",1803,1505,2019});
190
	values.add(new Object[]{3, "GVA", null, null, 50, null, null, 3, 352, "VALENCIA",1807,359,2020});
191
	values.add(new Object[]{5, "GVA", null, null, 200, null, null, 5, 201, "ALICANTE",905,206,2019});
192
	values.add(new Object[]{6, "GVA", null, null, 20, null, null, 6, 422, "ALICANTE",1813,1135,2020});
193
	values.add(new Object[]{8, "GVA", null, null, 100, null, null, 8, 702, "CASTELLON",1817,719,2019});
194
	for (int i = 0; i < features.size(); i++) {
195
		for (int j = 0; j < header.length; j++) {
196
			assertEquals("feature["+i+"]["+header[j]+"]:", values.get(i)[j],features.get(i).get(header[j]));
197
		}
198
	}
199

  
200
        DisposeUtils.dispose(dbstore);
201 210
    }
202 211

  
203 212
}
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/operations/ResultSetForSetProviderOperation.java
60 60
import org.gvsig.fmap.geom.DataTypes;
61 61
import org.gvsig.tools.dynobject.DynField;
62 62
import org.gvsig.tools.evaluator.Evaluator;
63
import org.gvsig.tools.lang.CloneableUtils;
63 64
import org.gvsig.tools.util.ContainerUtils;
64 65

  
65 66
public class ResultSetForSetProviderOperation extends AbstractConnectionOperation {
......
396 397
        if (!StringUtils.isEmpty(baseOrder)) {
397 398
            select.order_by().custom(baseOrder);
398 399
        }
399
        //Si hay especificado un offset (se esta paginando) siempre deberemos ordenar por un campo con valores unicos.
400
        //Anadiremos la clave primaria siempre en este caso para asegurarnos de que el orden de los registros es siempre el mismo.
401
//        if (!select.has_order_by()) {
402
            // Si no tenemos order by comprobamos si lo necesitamos y lo a?adimos.
403
            if (offset > 0 || (offset == 0 && limit > 0)) {
404
                // No tengo claro que (offset==0 && limit>0) sea lo mas correcto,
405
                // Pero cuando se va a paginar y se pide la primera pagina offset es
406
                // 0 y limit>0, y si no ordenamos ya esa primera pagina los resultados
407
                // que se obtienen no son correctos, ya que la primera pagina se saca
408
                // sin ordenar y el resto ordenadas.
409
                // Probablemente deberiamos tener alguna otra forma de detectar que
410
                // estamos paginanado ya que asi no distinguimo si solo queremos 
411
                // obtener los primeros elementos sin importarnos su orden.
412
                if (select.has_group_by()) {
413
                    ExpressionBuilder.Value group = select.getGroups().get(0);
414
//                  if(!(group instanceof ExpressionBuilder.Function)) {
415
//                      expbuilder.getattr(this.table.getTable(), group.XXX);
416
//                  }
417
                    select.order_by().value(group).ascending();
418 400

  
419
                } else if (primaryKeys.isEmpty()) {
420
                    // Muy probablemente si no tiene pk sea una vista, asi que 
421
                    // pasaremos de ordenar y esperemos que la vista este ya ordenada.
422
                    select.disable_check_order_and_offset();
423
                } else {
424
                    for (String attrName : primaryKeys) {
425
                        // Se precisa indicar un orden para usar OFFSET.
426
                        if(select.getOrderBy(attrName)==null){
427
                            select.order_by().column(attrName).ascending();
428
                        }
429
                    }
401
        if (select.has_group_by()) { // && isPaginated()) {
402
            // Cuando paginamos debemos ordenar por las columnas del groupby.
403
            // Ordenamos siempre para obtener el mismo resultado cuando paginamos
404
            // y no paginamos.
405
            for (ExpressionBuilder.Value group : select.getGroups()) {
406
                if (select.getOrderBy(group) == null) {
407
                    ExpressionBuilder.Value v = (ExpressionBuilder.Value) CloneableUtils.cloneQuietly(group);
408
                    select.order_by().value(v).ascending();
409
                    valuesToRemoveFeatureType.add(v);
430 410
                }
431 411
            }
432
//        }
433
        for (String attrName : primaryKeys) {
434
            if(select.getOrderBy(attrName)==null){
435
                select.order_by().column(attrName).ascending();
412
        }
413
        
414
        if (primaryKeys.isEmpty()) {
415
            // Muy probablemente si no tiene pk sea una vista, asi que 
416
            // pasaremos de ordenar y esperemos que la vista este ya ordenada.
417
            select.disable_check_order_and_offset();
418
        } else {
419
            // Siempre ordenamos por la clave primaria
420
            for (String attrName : primaryKeys) {
421
                if (select.getOrderBy(attrName) == null) {
422
                    select.order_by().column(attrName).ascending();
423
                }
436 424
            }
437 425
        }
426

  
438 427
        if (limit > 0) {
439 428
            select.limit(limit);
440 429
        } else {
......
454 443
        for (ExpressionBuilder.Value value : valuesToRemoveFeatureType) {
455 444
            value.setProperty(PROP_FEATURE_TYPE, null);
456 445
        }
457
		this.helper.expandCalculedColumns(sqlbuilder);
446
	this.helper.expandCalculedColumns(sqlbuilder);
458 447
        this.helper.processSpecialFunctions(sqlbuilder, storeType, extraColumnNames);
459 448
        String sql = sqlbuilder.toString();
460 449
        return sql;
461 450
    }
451
    
452
    private boolean isPaginated() {
453
        // No tengo claro que (offset==0 && limit>0) sea lo mas correcto,
454
        // Pero cuando se va a paginar y se pide la primera pagina offset es
455
        // 0 y limit>0, y si no ordenamos ya esa primera pagina los resultados
456
        // que se obtienen no son correctos, ya que la primera pagina se saca
457
        // sin ordenar y el resto ordenadas.
458
        // Probablemente deberiamos tener alguna otra forma de detectar que
459
        // estamos paginanado ya que asi no distinguimo si solo queremos 
460
        // obtener los primeros elementos sin importarnos su orden.
461
        return (offset > 0 || (offset == 0 && limit > 0));
462
    }
462 463

  
463 464
    public ResultSetEntry createResultSet() throws DataException {
464 465
        List<FeatureAttributeDescriptor> columns = new ArrayList<>();
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/SQLBuilder.java
191 191
        public OrderByBuilder column(String name);
192 192
        
193 193
        public boolean isColumn(String name);
194
        
195
        public boolean isColumn(Value value);
194 196

  
195 197
//        @Deprecated
196 198
//        public OrderByBuilder column(Value name);
......
219 221
        public OrderByBuilder order_by();
220 222

  
221 223
        public OrderByBuilder getOrderBy(String column);
224
        
225
        public OrderByBuilder getOrderBy(Value column);
222 226

  
223 227
        public SelectBuilder group_by(Value... column);
224 228

  
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/SQLBuilderBase.java
73 73
    protected TableNameBuilder table_name;
74 74

  
75 75
    protected abstract class AbstractStatementPart extends AbstractValue {
76

  
76
        
77 77
    }
78 78

  
79 79
    protected abstract class AbstractStatement extends AbstractStatementPart {
80

  
80
        @Override
81
        public Value clone() throws CloneNotSupportedException {
82
            throw new CloneNotSupportedException();
83
        }
81 84
    }
82 85

  
83 86
    protected class ColumnDescriptorBase implements ColumnDescriptor {
......
328 331
            this.name = name;
329 332
            this.table = table;
330 333
        }
334
        
335
        @Override
336
        public ColumnBase clone() throws CloneNotSupportedException {
337
            ColumnBase other = (ColumnBase) super.clone();
338
            other.table = (TableNameBuilder) org.gvsig.tools.lang.Cloneable.cloneQuietly(table);
339
            return other;
340
        }
331 341

  
342

  
332 343
        @Override
333 344
        public String name() {
334 345
            return this.name;
......
392 403

  
393 404
        public TableNameBuilderBase() {
394 405
        }
395

  
406
        
396 407
        @Override
397 408
        public void accept(Visitor visitor, VisitorFilter filter) {
398 409
            if (filter==null || filter.accept(this)) {
......
527 538
            this.distinct = false;
528 539
            this.all = false;
529 540
        }
530

  
541
        
531 542
        @Override
543
        public CountBuilderBase clone() throws CloneNotSupportedException {
544
            CountBuilderBase other = (CountBuilderBase) super.clone();
545
            other.value = (Value) org.gvsig.tools.lang.Cloneable.cloneQuietly(value);
546
            return other;
547
        }
548
        
549
        @Override
532 550
        public CountBuilder all() {
533 551
            this.all = true;
534 552
            return this;
......
586 604
            this.table = table;
587 605
            this.expression = expression;
588 606
        }
607
        
608
        @Override
609
        public JoinBase clone() throws CloneNotSupportedException {
610
            JoinBase other = (JoinBase) super.clone();
611
            other.table = (TableNameBuilder) org.gvsig.tools.lang.Cloneable.cloneQuietly(table);
612
            other.expression = (Value) org.gvsig.tools.lang.Cloneable.cloneQuietly(expression);
613
            return other;
614
        }
589 615

  
590 616
        @Override
591 617
        public String toString() {
......
625 651
            this.passthrough = null;
626 652
            this.joins = null;
627 653
        }
654
        
655
        @Override
656
        public FromBuilderBase clone() throws CloneNotSupportedException {
657
            FromBuilderBase other = (FromBuilderBase) super.clone();
658
            other.tableName = (TableNameBuilder) org.gvsig.tools.lang.Cloneable.cloneQuietly(tableName);
659
            if (joins!=null) {
660
                for (int i = 0; i < joins.size(); i++) {
661
                    other.joins.set(i, (JoinBase) joins.get(i).clone());
662
                }
663
            }
664
            return other;
665
        }
628 666

  
629 667
        @Override
630 668
        public FromBuilder left_join(TableNameBuilder table, Value expression) {
......
705 743
        protected Value value = null;
706 744
        protected boolean asGeometry = false;
707 745
        protected TableNameBuilder table;
746
        
747
        @Override
748
        public SelectColumnBuilderBase clone() throws CloneNotSupportedException {
749
            SelectColumnBuilderBase other = (SelectColumnBuilderBase) super.clone();
750
            other.value = (Value) org.gvsig.tools.lang.Cloneable.cloneQuietly(value);
751
            other.name = (Variable) org.gvsig.tools.lang.Cloneable.cloneQuietly(name);
752
            other.table = (TableNameBuilder) org.gvsig.tools.lang.Cloneable.cloneQuietly(table);
753
            return other;
754
        }
708 755

  
709 756
        @Override
710 757
        public void accept(Visitor visitor, VisitorFilter filter) {
......
851 898
        public OrderByBuilderBase() {
852 899
            this.ascending = true;
853 900
        }
854

  
901
        
855 902
        @Override
903
        public OrderByBuilderBase clone() throws CloneNotSupportedException {
904
            OrderByBuilderBase other = (OrderByBuilderBase) super.clone();
905
            other.value = (Value) org.gvsig.tools.lang.Cloneable.cloneQuietly(value);
906
            return other;
907
        }
908
        
909
        @Override
856 910
        public void accept(Visitor visitor, VisitorFilter filter) {
857 911
            if (filter==null || filter.accept(this)) {
858 912
                visitor.visit(this);
......
877 931
        }
878 932
        
879 933
        @Override
934
        public boolean isColumn(Value value) {
935
            if(value instanceof ExpressionBuilder.Variable){
936
                return isColumn(((ExpressionBuilder.Variable)value).name());
937
            }
938
            return this.value == value;
939
        }
940
        
941
        @Override
880 942
        public OrderByBuilder value(Value expression) {
881 943
            this.value = expression;
882 944
            return this;
......
1157 1219
            return order;
1158 1220
        }
1159 1221
        
1222
        public OrderByBuilder getOrderBy(Value column) {
1223
            if(this.order_by == null){
1224
                return null;
1225
            }
1226
            for (OrderByBuilder orderByBuilder : this.order_by) {
1227
                if(orderByBuilder.isColumn(column)){
1228
                    return orderByBuilder;
1229
                }
1230
            }
1231
            return null;
1232
        }
1233
        
1160 1234
        public OrderByBuilder getOrderBy(String column) {
1161 1235
            if(this.order_by == null){
1162 1236
                return null;
......
1375 1449
            this.role = role;
1376 1450
            this.privileges = new HashSet<>();
1377 1451
        }
1452
        
1453
        @Override
1454
        public GrantRoleBuilderBase clone() throws CloneNotSupportedException {
1455
            GrantRoleBuilderBase other = (GrantRoleBuilderBase) super.clone();
1456
            other.table = (TableNameBuilder) org.gvsig.tools.lang.Cloneable.cloneQuietly(table);
1457
            other.privileges = (Set<Privilege>) org.gvsig.tools.lang.Cloneable.cloneQuietly(privileges);
1458
            
1459
            return other;
1460
        }
1378 1461

  
1379 1462
        @Override
1380 1463
        public GrantRoleBuilder privilege(Privilege privilege) {
trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.h2spatial/org.gvsig.h2spatial.h2gis132/org.gvsig.h2spatial.h2gis132.provider/src/test/resources/org/gvsig/fmap/dal/store/h2/resultSetForSetProvider.sql
16 16
    NULL AS "Bool4", NULL AS "Float", NULL AS "Bool5", NULL AS "Decimal", 
17 17
    NULL AS "Geometry" 
18 18
  FROM "PUBLIC"."test" 
19
  GROUP BY "test"."Long" ORDER BY "ID" ASC;
19
  GROUP BY "test"."Long" ORDER BY "test"."Long" ASC, "ID" ASC;
20 20

  
21 21
-- Subselect
22 22
SELECT 
......
49 49
    FROM "countries" 
50 50
    WHERE (("TEST"."STRING" = "countries"."CONTINENT") AND 
51 51
      ("countries"."LASTCENSUS" < 0)) LIMIT 1)),TRUE,FALSE) 
52
  GROUP BY "test"."Long" ORDER BY "ID" ASC;
52
  GROUP BY "test"."Long" ORDER BY "test"."Long" ASC, "ID" ASC;
53 53

  
54 54
-- Simple
55 55
SELECT 
......
107 107
    SUM(("Long" + 300)) AS "Compu2", 
108 108
    SUM(((20 + "Byte") + ("ID" * 2))) AS "Extra2", 
109 109
    (("Long" + 10) + (("ID" * 2))) AS "Extra1" 
110
FROM "PUBLIC"."test" GROUP BY "test"."Long", (("Long" + 10) + (("ID" * 2))), (("ID" * 2)) ORDER BY "ID" ASC;
110
FROM "PUBLIC"."test" GROUP BY "test"."Long", (("Long" + 10) + (("ID" * 2))), (("ID" * 2)) 
111
ORDER BY "test"."Long" ASC, "Extra1" ASC, "Compu1" ASC, "ID" ASC;
trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.h2spatial/org.gvsig.h2spatial.h2gis132/org.gvsig.h2spatial.h2gis132.provider/src/test/resources/org/gvsig/fmap/dal/store/h2/usecases/arena2/testGroupByForeignValue.sql
2 2
-- ResultSetForSetProvider SQL
3 3

  
4 4
-- Select 
5
SELECT NULL AS "LID_CONDUCTOR", NULL AS "ID_ACCIDENTE", NULL AS "LID_VEHICULO", NULL AS "ID_VEHICULO", NULL AS "POSIBLE_RESPONSABLE", NULL AS "FECHA_NACIMIENTO", NULL AS "SEXO", NULL AS "NACIONALIDAD", NULL AS "PAIS_RESIDENCIA", NULL AS "PROVINCIA_RESIDENCIA", NULL AS "MUNICIPIO_RESIDENCIA", NULL AS "ASISTENCIA_SANITARIA", NULL AS "INFLU_FACT_ATENCION", NULL AS "FACTORES_ATENCION", NULL AS "INFLU_PRES_ERROR", NULL AS "PRESUNTOS_ERRORES", NULL AS "CARACT_PERMISO", NULL AS "CLASE_PERMISO", NULL AS "FECHA_PERMISO", NULL AS "MOTIVO_DESPLAZAMIENTO", NULL AS "DESPLAZAMIENTO_PREVISTO", NULL AS "ACC_SEG_CINTURON", NULL AS "ACC_SEG_CASCO", NULL AS "ACC_SEG_BRAZOS", NULL AS "ACC_SEG_ESPALDA", NULL AS "ACC_SEG_TORSO", NULL AS "ACC_SEG_MANOS", NULL AS "ACC_SEG_PIERNAS", NULL AS "ACC_SEG_PIES", NULL AS "ACC_SEG_PRENDA_REF", NULL AS "INFLU_ALCOHOL", NULL AS "PRUEBA_ALCOHOLEMIA", NULL AS "TASA_ALCOHOLEMIA1", NULL AS "TASA_ALCOHOLEMIA2", NULL AS "PRUEBA_ALC_SANGRE", NULL AS "SIGNOS_INFLU_ALCOHOL", NULL AS "INFLU_DROGAS", NULL AS "PRUEBA_DROGAS", NULL AS "AMP", NULL AS "CONFIRMADO_AMP", NULL AS "BDZ", NULL AS "CONFIRMADO_BDZ", NULL AS "COC", NULL AS "CONFIRMADO_COC", NULL AS "THC", NULL AS "CONFIRMADO_THC", NULL AS "METH", NULL AS "CONFIRMADO_METH", NULL AS "OPI", NULL AS "CONFIRMADO_OPI", NULL AS "OTRAS", NULL AS "CONFIRMADO_OTRAS", NULL AS "SIGNOS_INFLU_DROGAS", NULL AS "INFLU_PRES_INFRAC_COND", NULL AS "PRES_INFRAC_COND", NULL AS "PRES_INFRAC_SIN_LUCES", NULL AS "PRES_INFRAC_SIN_TRIANGULO", NULL AS "INFLU_PRES_INFRAC_VEL", NULL AS "PRES_INFRAC_VEL_COND", NULL AS "INFLU_OTRA_INFRAC", NULL AS "OTRA_INFRAC_COND", NULL AS "EXTRA", SUM(1) AS "Acc", EXTRACT(YEAR FROM "public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE") AS "ano", "public"."ARENA2_ACCIDENTES"."COD_PROVINCIA" AS "provincia", CASE WHEN (("ASISTENCIA_SANITARIA" = 1)) THEN ('Muerto') WHEN (("ASISTENCIA_SANITARIA" = 2)) THEN ('Grave') WHEN (((((("ASISTENCIA_SANITARIA" = 3) OR ("ASISTENCIA_SANITARIA" = 4)) OR ("ASISTENCIA_SANITARIA" = 5)) OR ("ASISTENCIA_SANITARIA" = 6)) OR ("ASISTENCIA_SANITARIA" = 7))) THEN ('Leve') WHEN (("ASISTENCIA_SANITARIA" = 8)) THEN ('Ileso') ELSE ('Se Desconoce') END AS "lesividad" FROM "public"."ARENA2_CONDUCTORES" LEFT JOIN "public"."ARENA2_ACCIDENTES" ON ( ("public"."ARENA2_CONDUCTORES"."ID_ACCIDENTE") = ("public"."ARENA2_ACCIDENTES"."ID_ACCIDENTE") ) LEFT JOIN "public"."ARENA2_VEHICULOS" ON ( ("public"."ARENA2_CONDUCTORES"."LID_VEHICULO") = ("public"."ARENA2_VEHICULOS"."LID_VEHICULO") ) WHERE ((("public"."ARENA2_ACCIDENTES"."TITULARIDAD_VIA" = 2) AND ((("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 5) OR ("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 6)) OR ("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 7))) AND (("public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE" >= DATE '2019-01-01') AND ("public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE" <= DATE '2019-12-31'))) GROUP BY EXTRACT(YEAR FROM "public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE"), "public"."ARENA2_ACCIDENTES"."COD_PROVINCIA", CASE WHEN (("ASISTENCIA_SANITARIA" = 1)) THEN ('Muerto') WHEN (("ASISTENCIA_SANITARIA" = 2)) THEN ('Grave') WHEN (((((("ASISTENCIA_SANITARIA" = 3) OR ("ASISTENCIA_SANITARIA" = 4)) OR ("ASISTENCIA_SANITARIA" = 5)) OR ("ASISTENCIA_SANITARIA" = 6)) OR ("ASISTENCIA_SANITARIA" = 7))) THEN ('Leve') WHEN (("ASISTENCIA_SANITARIA" = 8)) THEN ('Ileso') ELSE ('Se Desconoce') END ORDER BY "provincia" ASC, "LID_CONDUCTOR" ASC;
5
SELECT NULL AS "LID_CONDUCTOR", NULL AS "ID_ACCIDENTE", NULL AS "LID_VEHICULO", NULL AS "ID_VEHICULO", NULL AS "POSIBLE_RESPONSABLE", NULL AS "FECHA_NACIMIENTO", NULL AS "SEXO", NULL AS "NACIONALIDAD", NULL AS "PAIS_RESIDENCIA", NULL AS "PROVINCIA_RESIDENCIA", NULL AS "MUNICIPIO_RESIDENCIA", NULL AS "ASISTENCIA_SANITARIA", NULL AS "INFLU_FACT_ATENCION", NULL AS "FACTORES_ATENCION", NULL AS "INFLU_PRES_ERROR", NULL AS "PRESUNTOS_ERRORES", NULL AS "CARACT_PERMISO", NULL AS "CLASE_PERMISO", NULL AS "FECHA_PERMISO", NULL AS "MOTIVO_DESPLAZAMIENTO", NULL AS "DESPLAZAMIENTO_PREVISTO", NULL AS "ACC_SEG_CINTURON", NULL AS "ACC_SEG_CASCO", NULL AS "ACC_SEG_BRAZOS", NULL AS "ACC_SEG_ESPALDA", NULL AS "ACC_SEG_TORSO", NULL AS "ACC_SEG_MANOS", NULL AS "ACC_SEG_PIERNAS", NULL AS "ACC_SEG_PIES", NULL AS "ACC_SEG_PRENDA_REF", NULL AS "INFLU_ALCOHOL", NULL AS "PRUEBA_ALCOHOLEMIA", NULL AS "TASA_ALCOHOLEMIA1", NULL AS "TASA_ALCOHOLEMIA2", NULL AS "PRUEBA_ALC_SANGRE", NULL AS "SIGNOS_INFLU_ALCOHOL", NULL AS "INFLU_DROGAS", NULL AS "PRUEBA_DROGAS", NULL AS "AMP", NULL AS "CONFIRMADO_AMP", NULL AS "BDZ", NULL AS "CONFIRMADO_BDZ", NULL AS "COC", NULL AS "CONFIRMADO_COC", NULL AS "THC", NULL AS "CONFIRMADO_THC", NULL AS "METH", NULL AS "CONFIRMADO_METH", NULL AS "OPI", NULL AS "CONFIRMADO_OPI", NULL AS "OTRAS", NULL AS "CONFIRMADO_OTRAS", NULL AS "SIGNOS_INFLU_DROGAS", NULL AS "INFLU_PRES_INFRAC_COND", NULL AS "PRES_INFRAC_COND", NULL AS "PRES_INFRAC_SIN_LUCES", NULL AS "PRES_INFRAC_SIN_TRIANGULO", NULL AS "INFLU_PRES_INFRAC_VEL", NULL AS "PRES_INFRAC_VEL_COND", NULL AS "INFLU_OTRA_INFRAC", NULL AS "OTRA_INFRAC_COND", NULL AS "EXTRA", SUM(1) AS "Acc", EXTRACT(YEAR FROM "public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE") AS "ano", "public"."ARENA2_ACCIDENTES"."COD_PROVINCIA" AS "provincia", CASE WHEN (("ASISTENCIA_SANITARIA" = 1)) THEN ('Muerto') WHEN (("ASISTENCIA_SANITARIA" = 2)) THEN ('Grave') WHEN (((((("ASISTENCIA_SANITARIA" = 3) OR ("ASISTENCIA_SANITARIA" = 4)) OR ("ASISTENCIA_SANITARIA" = 5)) OR ("ASISTENCIA_SANITARIA" = 6)) OR ("ASISTENCIA_SANITARIA" = 7))) THEN ('Leve') WHEN (("ASISTENCIA_SANITARIA" = 8)) THEN ('Ileso') ELSE ('Se Desconoce') END AS "lesividad" FROM "public"."ARENA2_CONDUCTORES" LEFT JOIN "public"."ARENA2_ACCIDENTES" ON ( ("public"."ARENA2_CONDUCTORES"."ID_ACCIDENTE") = ("public"."ARENA2_ACCIDENTES"."ID_ACCIDENTE") ) LEFT JOIN "public"."ARENA2_VEHICULOS" ON ( ("public"."ARENA2_CONDUCTORES"."LID_VEHICULO") = ("public"."ARENA2_VEHICULOS"."LID_VEHICULO") ) WHERE ((("public"."ARENA2_ACCIDENTES"."TITULARIDAD_VIA" = 2) AND ((("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 5) OR ("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 6)) OR ("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 7))) AND (("public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE" >= DATE '2019-01-01') AND ("public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE" <= DATE '2019-12-31'))) GROUP BY EXTRACT(YEAR FROM "public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE"), "public"."ARENA2_ACCIDENTES"."COD_PROVINCIA", CASE WHEN (("ASISTENCIA_SANITARIA" = 1)) THEN ('Muerto') WHEN (("ASISTENCIA_SANITARIA" = 2)) THEN ('Grave') WHEN (((((("ASISTENCIA_SANITARIA" = 3) OR ("ASISTENCIA_SANITARIA" = 4)) OR ("ASISTENCIA_SANITARIA" = 5)) OR ("ASISTENCIA_SANITARIA" = 6)) OR ("ASISTENCIA_SANITARIA" = 7))) THEN ('Leve') WHEN (("ASISTENCIA_SANITARIA" = 8)) THEN ('Ileso') ELSE ('Se Desconoce') END 
6
ORDER BY "provincia" ASC, "ano" ASC, "lesividad" ASC, "LID_CONDUCTOR" ASC;
6 7

  
7 8
-- Count
8 9
SELECT COUNT(*) FROM ( SELECT COUNT(*) FROM "public"."ARENA2_CONDUCTORES" LEFT JOIN "public"."ARENA2_ACCIDENTES" ON ( ("public"."ARENA2_CONDUCTORES"."ID_ACCIDENTE") = ("public"."ARENA2_ACCIDENTES"."ID_ACCIDENTE") ) LEFT JOIN "public"."ARENA2_VEHICULOS" ON ( ("public"."ARENA2_CONDUCTORES"."LID_VEHICULO") = ("public"."ARENA2_VEHICULOS"."LID_VEHICULO") ) WHERE ((("public"."ARENA2_ACCIDENTES"."TITULARIDAD_VIA" = 2) AND ((("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 5) OR ("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 6)) OR ("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 7))) AND (("public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE" >= DATE '2019-01-01') AND ("public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE" <= DATE '2019-12-31'))) GROUP BY EXTRACT(YEAR FROM "public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE"), "public"."ARENA2_ACCIDENTES"."COD_PROVINCIA", CASE WHEN (("ASISTENCIA_SANITARIA" = 1)) THEN ('Muerto') WHEN (("ASISTENCIA_SANITARIA" = 2)) THEN ('Grave') WHEN (((((("ASISTENCIA_SANITARIA" = 3) OR ("ASISTENCIA_SANITARIA" = 4)) OR ("ASISTENCIA_SANITARIA" = 5)) OR ("ASISTENCIA_SANITARIA" = 6)) OR ("ASISTENCIA_SANITARIA" = 7))) THEN ('Leve') WHEN (("ASISTENCIA_SANITARIA" = 8)) THEN ('Ileso') ELSE ('Se Desconoce') END) as _subquery_alias_ ;
trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.h2spatial/org.gvsig.h2spatial.h2gis132/org.gvsig.h2spatial.h2gis132.provider/src/test/resources/org/gvsig/fmap/dal/store/h2/usecases/arena2/testOrderByExtraValue.sql
1

  
2
-- ResultSetForSetProvider SQL
3

  
4
-- Select 
5
SELECT 
6
NULL AS "LID_CONDUCTOR", NULL AS "ID_ACCIDENTE", NULL AS "LID_VEHICULO", NULL AS "ID_VEHICULO", NULL AS "POSIBLE_RESPONSABLE", 
7
NULL AS "FECHA_NACIMIENTO", NULL AS "SEXO", NULL AS "NACIONALIDAD", NULL AS "PAIS_RESIDENCIA", NULL AS "PROVINCIA_RESIDENCIA", 
8
NULL AS "MUNICIPIO_RESIDENCIA", NULL AS "ASISTENCIA_SANITARIA", NULL AS "INFLU_FACT_ATENCION", NULL AS "FACTORES_ATENCION", 
9
NULL AS "INFLU_PRES_ERROR", NULL AS "PRESUNTOS_ERRORES", NULL AS "CARACT_PERMISO", NULL AS "CLASE_PERMISO", NULL AS "FECHA_PERMISO", 
10
NULL AS "MOTIVO_DESPLAZAMIENTO", NULL AS "DESPLAZAMIENTO_PREVISTO", NULL AS "ACC_SEG_CINTURON", NULL AS "ACC_SEG_CASCO", 
11
NULL AS "ACC_SEG_BRAZOS", NULL AS "ACC_SEG_ESPALDA", NULL AS "ACC_SEG_TORSO", NULL AS "ACC_SEG_MANOS", NULL AS "ACC_SEG_PIERNAS", 
12
NULL AS "ACC_SEG_PIES", NULL AS "ACC_SEG_PRENDA_REF", NULL AS "INFLU_ALCOHOL", NULL AS "PRUEBA_ALCOHOLEMIA", NULL AS "TASA_ALCOHOLEMIA1", 
13
NULL AS "TASA_ALCOHOLEMIA2", NULL AS "PRUEBA_ALC_SANGRE", NULL AS "SIGNOS_INFLU_ALCOHOL", NULL AS "INFLU_DROGAS", NULL AS "PRUEBA_DROGAS", 
14
NULL AS "AMP", NULL AS "CONFIRMADO_AMP", NULL AS "BDZ", NULL AS "CONFIRMADO_BDZ", NULL AS "COC", NULL AS "CONFIRMADO_COC", NULL AS "THC", 
15
NULL AS "CONFIRMADO_THC", NULL AS "METH", NULL AS "CONFIRMADO_METH", NULL AS "OPI", NULL AS "CONFIRMADO_OPI", NULL AS "OTRAS", 
16
NULL AS "CONFIRMADO_OTRAS", NULL AS "SIGNOS_INFLU_DROGAS", NULL AS "INFLU_PRES_INFRAC_COND", NULL AS "PRES_INFRAC_COND", 
17
NULL AS "PRES_INFRAC_SIN_LUCES", NULL AS "PRES_INFRAC_SIN_TRIANGULO", NULL AS "INFLU_PRES_INFRAC_VEL", NULL AS "PRES_INFRAC_VEL_COND", 
18
NULL AS "INFLU_OTRA_INFRAC", NULL AS "OTRA_INFRAC_COND", NULL AS "EXTRA", 
19
SUM(1) AS "Acc", 
20
EXTRACT(YEAR FROM "public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE") AS "ano", 
21
"public"."ARENA2_ACCIDENTES"."COD_PROVINCIA" AS "provincia", 
22
CASE 
23
WHEN (("ASISTENCIA_SANITARIA" = 1)) THEN ('Muerto') 
24
WHEN (("ASISTENCIA_SANITARIA" = 2)) THEN ('Grave') 
25
WHEN (((((("ASISTENCIA_SANITARIA" = 3) OR ("ASISTENCIA_SANITARIA" = 4)) OR ("ASISTENCIA_SANITARIA" = 5)) OR ("ASISTENCIA_SANITARIA" = 6)) OR ("ASISTENCIA_SANITARIA" = 7))) THEN ('Leve') 
26
WHEN (("ASISTENCIA_SANITARIA" = 8)) THEN ('Ileso') 
27
ELSE ('Se Desconoce') 
28
END AS "lesividad" 
29
FROM "public"."ARENA2_CONDUCTORES" 
30
LEFT JOIN "public"."ARENA2_ACCIDENTES" ON ( ("public"."ARENA2_CONDUCTORES"."ID_ACCIDENTE") = ("public"."ARENA2_ACCIDENTES"."ID_ACCIDENTE") ) 
31
LEFT JOIN "public"."ARENA2_VEHICULOS" ON ( ("public"."ARENA2_CONDUCTORES"."LID_VEHICULO") = ("public"."ARENA2_VEHICULOS"."LID_VEHICULO") ) 
32
WHERE 
33
((("public"."ARENA2_ACCIDENTES"."TITULARIDAD_VIA" = 2) AND 
34
((("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 5) OR 
35
("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 6)) OR 
36
("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 7))) AND 
37
(("public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE" >= DATE '2019-01-01') AND 
38
("public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE" <= DATE '2019-12-31'))) 
39
GROUP BY 
40
EXTRACT(YEAR FROM "public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE"), 
41
"public"."ARENA2_ACCIDENTES"."COD_PROVINCIA", 
42
CASE 
43
WHEN (("ASISTENCIA_SANITARIA" = 1)) THEN ('Muerto') 
44
WHEN (("ASISTENCIA_SANITARIA" = 2)) THEN ('Grave') 
45
WHEN (((((("ASISTENCIA_SANITARIA" = 3) OR ("ASISTENCIA_SANITARIA" = 4)) OR ("ASISTENCIA_SANITARIA" = 5)) OR ("ASISTENCIA_SANITARIA" = 6)) OR ("ASISTENCIA_SANITARIA" = 7))) THEN ('Leve') 
46
WHEN (("ASISTENCIA_SANITARIA" = 8)) THEN ('Ileso') 
47
ELSE ('Se Desconoce') 
48
END 
49
ORDER BY "ano" ASC, "provincia" ASC, "lesividad" ASC, "LID_CONDUCTOR" ASC 
50
LIMIT 15;
51

  
52
-- Count
53
SELECT COUNT(*) FROM ( SELECT COUNT(*) FROM "public"."ARENA2_CONDUCTORES" 
54
LEFT JOIN "public"."ARENA2_ACCIDENTES" ON ( ("public"."ARENA2_CONDUCTORES"."ID_ACCIDENTE") = ("public"."ARENA2_ACCIDENTES"."ID_ACCIDENTE") ) 
55
LEFT JOIN "public"."ARENA2_VEHICULOS" ON ( ("public"."ARENA2_CONDUCTORES"."LID_VEHICULO") = ("public"."ARENA2_VEHICULOS"."LID_VEHICULO") ) 
56
WHERE 
57
((("public"."ARENA2_ACCIDENTES"."TITULARIDAD_VIA" = 2) AND 
58
((("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 5) OR 
59
("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 6)) OR 
60
("public"."ARENA2_VEHICULOS"."TIPO_VEHICULO" = 7))) AND 
61
(("public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE" >= DATE '2019-01-01') AND 
62
("public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE" <= DATE '2019-12-31'))) 
63
GROUP BY 
64
EXTRACT(YEAR FROM "public"."ARENA2_ACCIDENTES"."FECHA_ACCIDENTE"), 
65
"public"."ARENA2_ACCIDENTES"."COD_PROVINCIA", 
66
CASE 
67
WHEN (("ASISTENCIA_SANITARIA" = 1)) THEN ('Muerto') 
68
WHEN (("ASISTENCIA_SANITARIA" = 2)) THEN ('Grave') 
69
WHEN (((((("ASISTENCIA_SANITARIA" = 3) OR ("ASISTENCIA_SANITARIA" = 4)) OR ("ASISTENCIA_SANITARIA" = 5)) OR ("ASISTENCIA_SANITARIA" = 6)) OR ("ASISTENCIA_SANITARIA" = 7))) THEN ('Leve') 
70
WHEN (("ASISTENCIA_SANITARIA" = 8)) THEN ('Ileso') 
71
ELSE ('Se Desconoce') 
72
END
73
) as _subquery_alias_ ;
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/TestArena2OrderByExtraValue.java
1
package org.gvsig.fmap.dal.store.h2.operations.usecases;
2

  
3
import java.util.List;
4
import junit.framework.TestCase;
5
import org.gvsig.expressionevaluator.ExpressionUtils;
6
import org.gvsig.fmap.dal.DataTypes;
7
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
8
import org.gvsig.fmap.dal.feature.EditableFeatureType;
9
import org.gvsig.fmap.dal.feature.FeatureQuery;
10
import org.gvsig.fmap.dal.feature.FeatureStore;
11
import org.gvsig.fmap.dal.feature.FeatureType;
12
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultFeatureAttributeEmulatorExpression;
13
import org.gvsig.fmap.dal.store.h2.TestUtils;
14
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
15
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory;
16
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory.TableReference;
17
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
18
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CountOperation;
19
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.ResultSetForSetProviderOperation;
20
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
21
import org.slf4j.Logger;
22
import org.slf4j.LoggerFactory;
23

  
24
@SuppressWarnings("UseSpecificCatch")
25
public class TestArena2OrderByExtraValue extends TestCase {
26

  
27
    private static final Logger LOGGER = LoggerFactory.getLogger(TestArena2OrderByExtraValue.class);
28

  
29
    public TestArena2OrderByExtraValue(String testName) {
30
        super(testName);
31
    }
32

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

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

  
44
    protected List<String> getExpectedSQLs(String name) throws Exception {
45
        return TestUtils.getSQLs(name);
46
    }
47

  
48
    public void testOrderByExtraValue() throws Exception {
49
        try {
50
            JDBCHelper helper = TestUtils.createJDBCHelper();
51
            JDBCSQLBuilderBase sqlbuilder = helper.createSQLBuilder();
52
            OperationsFactory operations = helper.getOperations();
53

  
54
            List<String> expectedSQLs = getExpectedSQLs("usecases/arena2/testOrderByExtraValue.sql");
55

  
56
            FeatureStore arena2_conductores = TestUtils.openStoreTest("usecases/arena2/ARENA2_CONDUCTORES.csv");
57
            FeatureStore arena2_accidentes = TestUtils.openStoreTest("usecases/arena2/ARENA2_ACCIDENTES.csv");
58
            FeatureStore arena2_vehiculos = TestUtils.openStoreTest("usecases/arena2/ARENA2_VEHICULOS.csv");
59

  
60
            TableReference table = operations.createTableReference(
61
                    "dbtest",
62
                    "public", //sqlbuilder.default_schema(),
63
                    "ARENA2_CONDUCTORES",
64
                    null
65
            );
66
            FeatureType featureType = arena2_conductores.getDefaultFeatureType();
67
            EditableFeatureType eFeatureType = featureType.getEditable();
68
            FeatureQuery query = arena2_conductores.createFeatureQuery();
69
            query.setFilter("( ( ( (FOREING_VALUE('ID_ACCIDENTE.TITULARIDAD_VIA') = 2) )) AND \n" +
70
"( (( (FOREING_VALUE('LID_VEHICULO.TIPO_VEHICULO') = 5) ) OR ( (FOREING_VALUE('LID_VEHICULO.TIPO_VEHICULO') = 6) ) OR ( (FOREING_VALUE('LID_VEHICULO.TIPO_VEHICULO') = 7) )))) AND \n" +
71
"( (( (FOREING_VALUE('ID_ACCIDENTE.FECHA_ACCIDENTE') >= DATE '2019-01-01') ) AND ( (FOREING_VALUE('ID_ACCIDENTE.FECHA_ACCIDENTE') <= DATE '2019-12-31') )))");
72
            addExtraColumn(eFeatureType, query, "ano", DataTypes.INTEGER, "EXTRACT(YEAR FROM FOREING_VALUE('ID_ACCIDENTE.FECHA_ACCIDENTE'))");
73
            addExtraColumn(eFeatureType, query, "provincia", DataTypes.STRING, "FOREING_VALUE('ID_ACCIDENTE.COD_PROVINCIA')");
74
            addExtraColumn(eFeatureType, query, "lesividad", DataTypes.STRING, "CASE\n"
75
                    + "WHEN ASISTENCIA_SANITARIA=1 THEN 'Muerto'\n"
76
                    + "WHEN ASISTENCIA_SANITARIA=2 THEN 'Grave'\n"
77
                    + "WHEN ASISTENCIA_SANITARIA=3 or ASISTENCIA_SANITARIA=4 or ASISTENCIA_SANITARIA=5 or ASISTENCIA_SANITARIA=6 or ASISTENCIA_SANITARIA=7 THEN 'Leve'\n"
78
                    + "WHEN ASISTENCIA_SANITARIA=8 THEN 'Ileso'\n"
79
                    + "ELSE 'Se Desconoce'\n"
80
                    + "END CASE");
81
            addExtraColumn(eFeatureType, query, "Acc", DataTypes.INTEGER, "1");
82

  
83
            query.getGroupByColumns().add("ano");
84
            query.getGroupByColumns().add("provincia");
85
            query.getGroupByColumns().add("lesividad");
86
            query.getAggregateFunctions().put("Acc", "SUM");
87
            query.getOrder().add("ano");
88
            query.getOrder().add("provincia");
89
            query.getOrder().add("lesividad");
90
            
91
            
92
            CountOperation count = operations.createCount(eFeatureType, table, null, query);
93
            String sqlcount = count.getSQL();
94
            System.out.println("###### SQL:" + sqlcount);
95
            System.out.println("###### EXP:" + expectedSQLs.get(1));
96
            assertEquals("Count SQL", expectedSQLs.get(1), sqlcount);
97

  
98
            ResultSetForSetProviderOperation resultSetForSetProvider = operations.createResultSetForSetProvider(
99
                    table,
100
                    null,
101
                    null,
102
                    query,
103
                    eFeatureType,
104
                    eFeatureType,
105
                    15,
106
                    0,
107
                    0
108
            );
109
            String sql = resultSetForSetProvider.getSQL();
110
            System.out.println("###### SQL:" + sql);
111
            System.out.println("###### EXP:" + expectedSQLs.get(0));
112

  
113
            assertEquals("Select SQL", expectedSQLs.get(0), sql);
114
            
115
            
116
        } catch (Throwable th) {
117
            th.printStackTrace();
118
            throw th;
119
        }
120
    }
121

  
122
    private void addExtraColumn(EditableFeatureType eFeatureType, FeatureQuery query, String name, int type, String exp) {
123
        EditableFeatureAttributeDescriptor extraColumn = query.getExtraColumn().add(name, type);
124
        extraColumn.setFeatureAttributeEmulator(new DefaultFeatureAttributeEmulatorExpression(eFeatureType, ExpressionUtils.createExpression(exp)));
125
    }
126

  
127
}
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/sql/TestResultSetForSetProvider.java
338 338

  
339 339
			assertEquals("ResultSetForSetProvider SQL", expectedSQLs.get(1), sql);
340 340
		} catch (Throwable th) {
341
                    LOGGER.warn("",th);
341 342
			throw th;
342 343
		}
343 344
	}
......
392 393

  
393 394
			assertEquals("ResultSetForSetProvider SQL", expectedSQLs.get(10), sql);
394 395
		} catch (Throwable th) {
396
                    LOGGER.warn("", th);
395 397
			throw th;
396 398
		}
397 399
	}
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/ExpressionBuilder.java
152 152
        public void accept(Visitor visitor, VisitorFilter filter);
153 153
    }
154 154
        
155
    public interface Value extends Visitable, PropertiesSupport {
155
    public interface Value extends Visitable, PropertiesSupport, org.gvsig.tools.lang.Cloneable {
156 156
        public String toString(Formatter<Value> formatter);
157 157
        public void replace(Value target, Value replacement);
158 158
        public void copyPropertiesFrom(PropertiesSupport properties);
159

  
160
        @Override
161
        public Value clone() throws CloneNotSupportedException;
162
        
159 163
    }
160 164

  
161 165
    public interface Group extends Value {
......
212 216

  
213 217
    public abstract class AbstractValue implements Value {
214 218

  
215
        protected final PropertiesSupport properties;
219
        protected PropertiesSupportHelper properties;
216 220
        
217 221
        protected AbstractValue() {
218 222
            this.properties = new PropertiesSupportHelper();
219 223
        }
224

  
225
        @Override
226
        public Value clone() throws CloneNotSupportedException {
227
            AbstractValue other = (AbstractValue) super.clone();
228
            other.properties = properties.clone();
229
            return other;
230
        }
220 231
        
232
        
221 233
        @Override
222 234
        public void copyPropertiesFrom(PropertiesSupport properties) {
223 235
            for (Map.Entry<String, Object> entry : properties.getProperties().entrySet()) {
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/DefaultExpressionBuilder.java
70 70
        public GroupBase(Value value) {
71 71
            this.value = value;
72 72
        }
73
        
74
        @Override
75
       public GroupBase clone() throws CloneNotSupportedException {
76
            GroupBase other = (GroupBase) super.clone();
77
            other.value = value.clone();
78
            return other;
79
        }
73 80

  
74 81
        @Override
75 82
        public Value value() {
......
114 121
            this.name = name;
115 122
            this.builder = builder;
116 123
        }
124
        
125
        public VariableBase clone() throws CloneNotSupportedException {
126
            VariableBase other = (VariableBase) super.clone();
127
            return other;
128
        }    
117 129

  
118 130
        @Override
119 131
        public String name() {
......
165 177
            this.name = null;
166 178
            this.value = null;
167 179
        }
180
        
181
        public ParameterBase clone() throws CloneNotSupportedException {
182
            ParameterBase other = (ParameterBase) super.clone();
183
            return other;
184
        }     
168 185

  
169 186
        @Override
170 187
        public Parameter as_constant() {
......
279 296
            this.builder = builder;
280 297
        }
281 298

  
299
        public Constant clone() throws CloneNotSupportedException {
300
            ConstantBase other = (ConstantBase) super.clone();
301
            return other;
302
        }
303
        
282 304
        @Override
283 305
        public Object value() {
284 306
            return this.value;
......
318 340
        public ExpressionBuilder builder() {
319 341
            return this.builder; // Ojo, no esta en el API.
320 342
        }
343
        
321 344
    }
322 345

  
323 346
    public class CustomBase extends AbstractValue implements Custom {
......
331 354
        public CustomBase(Object value) {
332 355
            this.value = value;
333 356
        }
357
        
358
        public Custom clone() throws CloneNotSupportedException {
359
            CustomBase other = (CustomBase) super.clone();
360
            if(other.values!=null) {
361
                for (int i = 0; i < values.size(); i++) {
362
                    Value v = (Value) values.get(i).clone();
363
                    other.values.set(i, v);
364
                }
365
            }
366
            
367
            return other;
368
        }
334 369

  
335 370
        @Override
336 371
        public void accept(Visitor visitor, VisitorFilter filter) {
......
404 439
            this.name = name;
405 440
            this.format = format;
406 441
        }
442
        
443
        public FunctionBase clone() throws CloneNotSupportedException {
444
            FunctionBase other = (FunctionBase) super.clone();
445
            if (other.parameters != null) {
446
                for (int i = 0; i < parameters.size(); i++) {
447
                    Value v = (Value) parameters.get(i).clone();
448
                    other.parameters.set(i, v);
449
                }
450
            }
407 451

  
452
            return other;
453
        }
454

  
408 455
        public FunctionBase(String name) {
409 456
            this(name,null);
410 457
        }
......
511 558
            super(name);
512 559
            this.instance = instance;
513 560
        }
561
        
562
        public MethodBase clone() throws CloneNotSupportedException {
563
            MethodBase other = (MethodBase) super.clone();
564
            other.instance = instance.clone();
565
            return other;
566
        }
567
        
514 568

  
515 569
        @Override
516 570
        public Value instance() {
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/DefaultGeometryExpressionBuilderHelper.java
68 68
        }
69 69

  
70 70
        @Override
71
        public Value clone() throws CloneNotSupportedException {
72
            GeometryParameterBase other = (GeometryParameterBase) super.clone();
73
            other.srs = (Value) org.gvsig.tools.lang.Cloneable.cloneQuietly(srs);
74
            return other;
75
        }
76
        
77
        
78

  
79
        @Override
71 80
        public void accept(Visitor visitor, VisitorFilter filter) {
72 81
            super.accept(visitor, filter);
73 82
            if (this.srs != null) {

Also available in: Unified diff