Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.db / org.gvsig.fmap.dal.db.mdb / src / test / java / org / gvsig / fmap / dal / store / mdb / TestCreate.java @ 44951

History | View | Annotate | Download (19.3 KB)

1
package org.gvsig.fmap.dal.store.mdb;
2

    
3
import java.time.LocalDate;
4
import java.time.LocalTime;
5
import java.util.Date;
6
import java.util.List;
7
import junit.framework.TestCase;
8
import static junit.framework.TestCase.assertEquals;
9
import org.gvsig.expressionevaluator.ExpressionBuilder;
10
import org.gvsig.expressionevaluator.ExpressionUtils;
11
import org.gvsig.expressionevaluator.GeometryExpressionBuilder;
12
import org.gvsig.fmap.dal.DALLocator;
13
import org.gvsig.fmap.dal.DataTypes;
14
import org.gvsig.fmap.dal.DataManager;
15
import org.gvsig.fmap.dal.DataStore;
16
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
17
import org.gvsig.fmap.dal.feature.EditableFeature;
18
import org.gvsig.fmap.dal.feature.EditableFeatureType;
19
import org.gvsig.fmap.dal.feature.Feature;
20
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
21
import org.gvsig.fmap.dal.feature.FeatureQuery;
22
import org.gvsig.fmap.dal.feature.FeatureSet;
23
import org.gvsig.fmap.dal.feature.FeatureStore;
24
import org.gvsig.fmap.dal.feature.FeatureType;
25
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
26
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
27
import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer;
28
import org.gvsig.tools.ToolsLocator;
29
import org.gvsig.tools.dataTypes.DataType;
30
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
31
import org.slf4j.Logger;
32
import org.slf4j.LoggerFactory;
33

    
34
public class TestCreate extends TestCase {
35

    
36
    private static final Logger LOGGER = LoggerFactory.getLogger(TestCreate.class);
37

    
38
    public static final String DBNAME = "testCreate";
39

    
40
    public TestCreate(String testName) {
41
        super(testName);
42
    }
43

    
44
    @Override
45
    protected void setUp() throws Exception {
46
        super.setUp();
47
        new DefaultLibrariesInitializer().fullInitialize();
48
    }
49

    
50
    @Override
51
    protected void tearDown() throws Exception {
52
        super.tearDown();
53
    }
54

    
55
    // TODO add test methods here. The name must begin with 'test'. For example:
56
    // public void testHello() {}
57
    protected String getProviderName() {
58
        return DataStore.MDB_PROVIDER_NAME;
59
    }
60

    
61
    protected String getTargetName() {
62
        return "testCreateTarget1";
63
    }
64

    
65
    protected FeatureStore openTargetStore1(JDBCServerExplorer explorer) throws Exception {
66
        JDBCStoreParameters params = explorer.get(getTargetName());
67

    
68
        DataManager dataManager = DALLocator.getDataManager();
69
        FeatureStore store;
70
        try {
71
            store = (FeatureStore) dataManager.openStore(
72
                    getProviderName(),
73
                    params
74
            );
75
        } catch (ValidateDataParametersException ex) {
76
            LOGGER.warn(ex.getLocalizedMessageStack());
77
            throw ex;
78
        }
79
        return store;
80
    }
81

    
82
    protected void createFrom(JDBCServerExplorer explorer, FeatureStore sourceStore) throws Exception {
83
        NewFeatureStoreParameters params = (NewFeatureStoreParameters) explorer.getAddParameters(
84
                getTargetName()
85
        );
86
        EditableFeatureType ft = params.getDefaultFeatureType();
87
        ft.addAll(sourceStore.getDefaultFeatureType());
88
        explorer.add(getProviderName(), params, true);
89
    }
90

    
91
    protected void checkTypes(JDBCServerExplorer explorer, FeatureType sourceFeatureType) throws Exception {
92
//        DataType STRING_TYPE = ToolsLocator.getDataTypesManager().get(DataTypes.STRING);
93
//        DataType INT_TYPE = ToolsLocator.getDataTypesManager().get(DataTypes.INT);
94

    
95
        FeatureStore targetStore = openTargetStore1(explorer);
96
        FeatureType targetFeatureType = targetStore.getDefaultFeatureType();
97

    
98
        assertEquals("Feature type size", sourceFeatureType.size(), targetFeatureType.size());
99
        for (int i = 0; i < sourceFeatureType.size(); i++) {
100
            FeatureAttributeDescriptor sourceAttr = sourceFeatureType.get(i);
101
            FeatureAttributeDescriptor targetAttr = targetFeatureType.get(i);
102
            switch (sourceAttr.getType()) {
103
                case DataTypes.DECIMAL:
104
                    if (sourceAttr.getPrecision() == 19 && sourceAttr.getScale() == 0) { // en acces es un decimal, lo tratamos como long
105
                        assertEquals(
106
                                String.format("Field %s name mismatch", sourceAttr.getName()),
107
                                sourceAttr.getName(),
108
                                targetAttr.getName()
109
                        );
110
                        assertEquals(
111
                                String.format("Field %s type mismatch", sourceAttr.getName()),
112
                                "Long",
113
                                targetAttr.getDataTypeName()
114
                        );
115
                    } else {
116
                        assertEquals(
117
                                String.format("Field %s name mismatch", sourceAttr.getName()),
118
                                sourceAttr.getName(),
119
                                targetAttr.getName()
120
                        );
121
                        assertEquals(
122
                                String.format("Field %s type mismatch", sourceAttr.getName()),
123
                                sourceAttr.getDataTypeName(),
124
                                targetAttr.getDataTypeName()
125
                        );
126
                        assertEquals(
127
                                String.format("Field %s size mismatch", sourceAttr.getName()),
128
                                sourceAttr.getSize(),
129
                                targetAttr.getSize()
130
                        );
131
                        assertEquals(
132
                                String.format("Field %s precision mismatch", sourceAttr.getName()),
133
                                sourceAttr.getPrecision(),
134
                                targetAttr.getPrecision()
135
                        );
136
                        assertEquals(
137
                                String.format("Field %s scale mismatch", sourceAttr.getName()),
138
                                sourceAttr.getScale(),
139
                                targetAttr.getScale()
140
                        );
141
                    }
142
                    break;
143
                case DataTypes.DATE:
144
                case DataTypes.TIME:
145
                case DataTypes.TIMESTAMP:
146
                    assertEquals(
147
                            String.format("Field %s name mismatch", sourceAttr.getName()),
148
                            sourceAttr.getName(),
149
                            targetAttr.getName()
150
                    );
151
                    assertEquals(
152
                            String.format("Field %s type mismatch", sourceAttr.getName()),
153
                            "Timestamp",
154
                            targetAttr.getDataTypeName()
155
                    );
156
                    assertEquals(
157
                            String.format("Field %s size mismatch", sourceAttr.getName()),
158
                            0,
159
                            targetAttr.getSize()
160
                    );
161
                    assertEquals(
162
                            String.format("Field %s precision mismatch", sourceAttr.getName()),
163
                            -1,
164
                            targetAttr.getPrecision()
165
                    );
166
                    assertEquals(
167
                            String.format("Field %s scale mismatch", sourceAttr.getName()),
168
                            -1,
169
                            targetAttr.getScale()
170
                    );
171
                    break;
172
                case DataTypes.FLOAT:
173
                    assertEquals(
174
                            String.format("Field %s name mismatch", sourceAttr.getName()),
175
                            sourceAttr.getName(),
176
                            targetAttr.getName()
177
                    );
178
                    assertEquals(
179
                            String.format("Field %s type mismatch", sourceAttr.getName()),
180
                            "Double",
181
                            targetAttr.getDataTypeName()
182
                    );
183
                    assertEquals(
184
                            String.format("Field %s size mismatch", sourceAttr.getName()),
185
                            0,
186
                            targetAttr.getSize()
187
                    );
188
                    assertEquals(
189
                            String.format("Field %s precision mismatch", sourceAttr.getName()),
190
                            16,
191
                            targetAttr.getPrecision()
192
                    );
193
                    assertEquals(
194
                            String.format("Field %s scale mismatch", sourceAttr.getName()),
195
                            -1,
196
                            targetAttr.getScale()
197
                    );
198
                    break;
199
                case DataTypes.LONG:
200
                case DataTypes.DOUBLE:
201
                case DataTypes.BYTE:
202
                case DataTypes.INT:
203
                case DataTypes.BOOLEAN:
204
                case DataTypes.STRING:
205
//                case DataTypes.DECIMAL:
206
                    assertEquals(
207
                            String.format("Field %s name mismatch", sourceAttr.getName()),
208
                            sourceAttr.getName(),
209
                            targetAttr.getName()
210
                    );
211
                    assertEquals(
212
                            String.format("Field %s type mismatch", sourceAttr.getName()),
213
                            sourceAttr.getDataTypeName(),
214
                            targetAttr.getDataTypeName()
215
                    );
216
                    assertEquals(
217
                            String.format("Field %s size mismatch", sourceAttr.getName()),
218
                            sourceAttr.getSize(),
219
                            targetAttr.getSize()
220
                    );
221
                    assertEquals(
222
                            String.format("Field %s precision mismatch", sourceAttr.getName()),
223
                            sourceAttr.getPrecision(),
224
                            targetAttr.getPrecision()
225
                    );
226
                    assertEquals(
227
                            String.format("Field %s scale mismatch", sourceAttr.getName()),
228
                            sourceAttr.getScale(),
229
                            targetAttr.getScale()
230
                    );
231
                    break;
232
                case DataTypes.GEOMETRY:
233
                    assertEquals(
234
                            String.format("Field %s name mismatch", sourceAttr.getName()),
235
                            sourceAttr.getName(),
236
                            targetAttr.getName()
237
                    );
238
                    assertEquals(
239
                            String.format("Field %s type mismatch", sourceAttr.getName()),
240
                            sourceAttr.getDataTypeName(),
241
                            targetAttr.getDataTypeName()
242
                    );
243
                    assertEquals(
244
                            String.format("Field %s geometry type mismatch", sourceAttr.getName()),
245
                            sourceAttr.getGeomType().getName(),
246
                            targetAttr.getGeomType().getName()
247
                    );
248
                    assertEquals(
249
                            String.format("Field %s geometry SRS mismatch", sourceAttr.getName()),
250
                            sourceAttr.getSRS().toString(),
251
                            targetAttr.getSRS().toString()
252
                    );
253
                    assertEquals(
254
                            String.format("Field %s size mismatch", sourceAttr.getName()),
255
                            sourceAttr.getSize(),
256
                            targetAttr.getSize()
257
                    );
258
                    assertEquals(
259
                            String.format("Field %s precision mismatch", sourceAttr.getName()),
260
                            sourceAttr.getPrecision(),
261
                            targetAttr.getPrecision()
262
                    );
263
                    break;
264
                default:
265
                    fail(
266
                            String.format("Field %s type %d (%s) not supported.",
267
                                    targetAttr.getName(),
268
                                    targetAttr.getType(),
269
                                    targetAttr.getDataTypeName()
270
                            )
271
                    );
272
            }
273
        }
274
    }
275

    
276
    protected void copyFrom(JDBCServerExplorer explorer, FeatureStore sourceStore, int mode) throws Exception {
277
        FeatureStore targetStore = openTargetStore1(explorer);
278
        targetStore.edit(mode);
279
        try {
280
            for (Feature sourceFeature : sourceStore.getFeatureSet()) {
281
                EditableFeature targetFeature = targetStore.createNewFeature(sourceFeature);
282
                targetStore.insert(targetFeature);
283
            }
284
        } finally {
285
            targetStore.finishEditing();
286
        }
287
    }
288

    
289
    protected void checkData(JDBCServerExplorer explorer, FeatureStore sourceStore) throws Exception {
290
        FeatureStore targetStore = openTargetStore1(explorer);
291

    
292
        List<Feature> sourceFeatures = sourceStore.getFeatures();
293
        List<Feature> targetFeatures = targetStore.getFeatures();
294
        assertEquals("Count features", sourceFeatures.size(), targetFeatures.size());
295
        for (int i = 0; i < targetFeatures.size(); i++) {
296
            Feature sourceFeature = sourceFeatures.get(i);
297
            Feature targetFeature = targetFeatures.get(i);
298
            for (FeatureAttributeDescriptor sourceAttr : sourceStore.getDefaultFeatureType()) {
299
                switch (sourceAttr.getType()) {
300
                    case DataTypes.BOOLEAN:
301
                        Object expected = sourceFeature.get(sourceAttr.getName());
302
                        if (expected == null) {
303
                            expected = false; //access never have null values for boolean
304
                        }
305
                        assertEquals(
306
                                String.format("Feature %03d attribute %s", i, sourceAttr.getName()),
307
                                expected,
308
                                targetFeature.get(sourceAttr.getName())
309
                        );
310
                        break;
311

    
312
                    case DataTypes.BYTE:
313
                        assertEquals(
314
                                String.format("Feature %03d attribute %s", i, sourceAttr.getName()),
315
                                sourceFeature.getInt(sourceAttr.getName()),
316
                                targetFeature.getInt(sourceAttr.getName())
317
                        );
318
                        break;
319
                    case DataTypes.TIMESTAMP:
320
                        Date sourceTimestamp = sourceFeature.getDate(sourceAttr.getName());
321
                        Date targetTimestamp = targetFeature.getDate(sourceAttr.getName());
322
                        assertEquals(
323
                                String.format("Feature %03d attribute %s", i, sourceAttr.getName()),
324
                                sourceTimestamp,
325
                                targetTimestamp
326
                        );
327
                        break;
328
                    case DataTypes.TIME:
329
                        assertEquals(
330
                                String.format("Feature %03d attribute %s", i, sourceAttr.getName()),
331
                                sourceFeature.getDate(sourceAttr.getName()),
332
                                targetFeature.getDate(sourceAttr.getName())
333
                        );
334
                        break;
335
                    case DataTypes.GEOMETRY:
336
                        assertEquals(
337
                                String.format("Feature %03d attribute %s", i, sourceAttr.getName()),
338
                                sourceFeature.get(sourceAttr.getName()),
339
                                targetFeature.get(sourceAttr.getName())
340
                        );
341
                        break;
342
                    case DataTypes.LONG:
343
                        Object expectedLong = sourceFeature.get(sourceAttr.getName());
344
                        if (expectedLong != null) {
345
                            expectedLong = sourceFeature.getLong(sourceAttr.getName());
346
                        }
347
                        Object targetLong = targetFeature.get(sourceAttr.getName());
348
                        if (targetLong!=null) {
349
                            targetLong = targetFeature.getLong(sourceAttr.getName());
350
                        }
351
                        assertEquals(
352
                                String.format("Feature %03d attribute %s", i, sourceAttr.getName()),
353
                                expectedLong,
354
                                targetLong
355
                        );
356
                        break;
357

    
358
                    case DataTypes.FLOAT:
359
                    case DataTypes.DOUBLE:
360
                    default:
361
                        Object sourceValue = sourceFeature.get(sourceAttr.getName());
362
                        Object targetValue = targetFeature.get(sourceAttr.getName());
363
                        if (sourceValue == null) {
364
                            LOGGER.info(String.format("Feature %03d attribute %s is null", i, sourceAttr.getName()));
365
                        }
366
                        assertEquals(
367
                                String.format("Feature %03d attribute %s", i, sourceAttr.getName()),
368
                                sourceValue,
369
                                targetValue
370
                        );
371
                }
372
            }
373
        }
374
    }
375

    
376
    public void testCreatePopulateAndCheckData() throws Exception {
377
        FeatureStore sourceStore = TestUtils.openSourceStore1();
378
        JDBCServerExplorer explorer = TestUtils.openServerExplorer(DBNAME);
379

    
380
        createFrom(explorer, sourceStore);
381

    
382
        checkTypes(explorer, sourceStore.getDefaultFeatureType());
383
        copyFrom(explorer, sourceStore, FeatureStore.MODE_APPEND);
384
        checkData(explorer, sourceStore);
385

    
386
        JDBCStoreParameters params = explorer.get(this.getTargetName());
387
        explorer.remove(params);
388

    
389
        createFrom(explorer, sourceStore);
390
        copyFrom(explorer, sourceStore, FeatureStore.MODE_FULLEDIT);
391
        checkData(explorer, sourceStore);
392

    
393
    }
394

    
395
    public void testFilterByDate() throws Exception {
396
        FeatureStore sourceStore = TestUtils.openSourceStore1();
397
        JDBCServerExplorer explorer = TestUtils.openServerExplorer(DBNAME);
398

    
399
        createFrom(explorer, sourceStore);
400
        copyFrom(explorer, sourceStore, FeatureStore.MODE_APPEND);
401

    
402
        FeatureStore mdbStore = openTargetStore1(explorer);
403
        ExpressionBuilder expbuilder = ExpressionUtils.createExpressionBuilder();
404

    
405
        String filter = expbuilder.or(
406
                expbuilder.and(
407
                        expbuilder.gt(
408
                                expbuilder.column("Time"),
409
                                expbuilder.time("01:02:03")
410
                        ),
411
                        expbuilder.lt(
412
                                expbuilder.column("Time"),
413
                                expbuilder.time(new Date())
414
                        )
415
                ),
416
                expbuilder.and(
417
                        expbuilder.gt(
418
                                expbuilder.column("Date"),
419
                                expbuilder.date("2019-02-17")
420
                        ),
421
                        expbuilder.lt(
422
                                expbuilder.column("Date"),
423
                                expbuilder.date(new Date())
424
                        )
425
                )
426
        ).toString();
427
        FeatureQuery query = sourceStore.createFeatureQuery();
428
        query.addFilter(filter);
429
        List<Feature> features = mdbStore.getFeatures(query);
430
        int sz = features.size();
431
    }
432

    
433
}