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.jdbc / src / main / java / org / gvsig / fmap / dal / store / jdbc2 / impl / JDBCSetProvider.java @ 44376

History | View | Annotate | Download (9.89 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or modify it under
7
 * the terms of the GNU General Public License as published by the Free Software
8
 * Foundation; either version 3 of the License, or (at your option) any later
9
 * version.
10
 *
11
 * This program is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14
 * details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with
17
 * this program; if not, write to the Free Software Foundation, Inc., 51
18
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us at info AT
21
 * gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.fmap.dal.store.jdbc2.impl;
24

    
25
import java.util.ArrayList;
26
import java.util.List;
27
import java.util.NoSuchElementException;
28
import org.apache.commons.collections.CollectionUtils;
29
import org.apache.commons.lang3.BooleanUtils;
30
import org.gvsig.fmap.dal.exception.DataException;
31
import org.gvsig.fmap.dal.feature.FeatureQuery;
32
import org.gvsig.fmap.dal.feature.FeatureType;
33

    
34
import org.gvsig.fmap.dal.feature.spi.AbstractFeatureSetProvider;
35
import org.gvsig.fmap.dal.feature.spi.AbstractFeatureStoreProvider;
36
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
37
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
38
import org.gvsig.fmap.dal.store.jdbc2.JDBCStoreProvider;
39
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
40
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory;
41
import org.gvsig.fmap.dal.store.jdbc2.ResulSetControler;
42
import org.gvsig.fmap.dal.store.jdbc2.ResulSetControler.ResultSetEntry;
43
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.TableIsEmptyOperation;
44
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.ResultSetForSetProviderOperation;
45
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CountOperation;
46
import org.gvsig.tools.evaluator.Evaluator;
47
import org.gvsig.tools.exception.BaseException;
48
import org.slf4j.Logger;
49
import org.slf4j.LoggerFactory;
50

    
51
public class JDBCSetProvider extends AbstractFeatureSetProvider {
52

    
53
    final static protected Logger LOGGER = LoggerFactory.getLogger(JDBCSetProvider.class);
54

    
55
    private class EmptyJDBCIterator extends JDBCIterator {
56

    
57
        protected EmptyJDBCIterator(JDBCStoreProvider store) throws DataException {
58
            super(store, null, null, null);
59
        }
60

    
61
        @Override
62
        protected boolean internalHasNext() {
63
            return false;
64
        }
65

    
66
        @Override
67
        protected Object internalNext() {
68
            throw new NoSuchElementException();
69
        }
70

    
71
        @Override
72
        protected void doDispose() throws BaseException {
73
            // nothing to do
74
        }
75

    
76
    }
77

    
78
    
79
    protected Long size = null;
80
    protected Boolean isEmpty = null;
81
    protected List<ResultSetEntry> resultSets;
82
    private int defaultFetchSize = 1000;
83

    
84
    public JDBCSetProvider(
85
            AbstractFeatureStoreProvider store,
86
            JDBCHelper helper,
87
            FeatureQuery query,
88
            FeatureType featureType
89
    ) throws DataException {
90
        super(store, query, featureType);
91
        this.resultSets = new ArrayList<>();
92
    }
93

    
94
    /**
95
     * @return the defaultFetchSize
96
     */
97
    public int getDefaultFetchSize() {
98
        return defaultFetchSize;
99
    }
100

    
101
    /**
102
     * @param defaultFetchSize the defaultFetchSize to set
103
     */
104
    public void setDefaultFetchSize(int defaultFetchSize) {
105
        this.defaultFetchSize = defaultFetchSize;
106
    }
107

    
108
//    @Override
109
//    protected JDBCStoreProvider getStore() {
110
//        return (JDBCStoreProvider) super.getStore();
111
//    }
112

    
113
    protected JDBCStoreProvider getJDBCStore() {
114
//        Corregido el problema en AbstractFeatureSetProvider, de que getStore
115
//        debe ser un FeatureStoreProvider y no un AbstractFeatureStoreProvider
116
//        este metodo debe desaparecer y quedar el getStore de arriba que esta
117
//          comentarizado
118
        return (JDBCStoreProvider) super.getStore();
119
    }    
120
    
121
    protected JDBCHelper getHelper() {
122
        return this.getJDBCStore().getHelper();
123
    }
124
    
125
    protected OperationsFactory getOperations() {
126
        return this.getHelper().getOperations();
127
    }
128

    
129
    @Override
130
    public boolean canIterateFromIndex() {
131
        return this.getHelper().supportOffsetInSelect();
132
    }
133
    
134
    @Override
135
    public boolean canFilter() {
136
        return this.getHelper().supportFilter(this.getFeatureType(), getQuery().getFilter());
137
    }
138

    
139
    @Override
140
    public boolean canOrder() {
141
        return this.getHelper().supportOrder(this.getFeatureType(), getQuery().getOrder());
142
    }
143
    
144
    public ResulSetControler getResulSetControler() {
145
        return this.getHelper().getResulSetControler();
146
    }
147

    
148
    @Override
149
    protected void doDispose() throws BaseException {
150
        if( ! CollectionUtils.isEmpty(this.resultSets) ) {
151
            for( ResultSetEntry resulset : this.resultSets ) {
152
               JDBCUtils.closeQuietly(resulset);
153
            }
154
        }
155
        size = null;
156
        isEmpty = null;
157
    }
158

    
159
    protected int getFetchSize() {
160
        long pageSize = -1;
161
        if (getQuery() != null) {
162
            pageSize = getQuery().getPageSize();
163
            pageSize = pageSize > Integer.MAX_VALUE ? Integer.MAX_VALUE : pageSize;
164
        }
165
        return (pageSize > 0 ? (int) pageSize : defaultFetchSize);
166
    }
167

    
168
    @Override
169
    public long getSize() throws DataException {
170
        if (size == null) {
171
            JDBCStoreParameters params = this.getJDBCStore().getParameters();
172
            String filtersql = null;
173
            Evaluator filter = this.getQuery().getFilter();
174
            if( filter != null ) {
175
                filtersql = filter.getSQL();
176
            }
177
            CountOperation selectCount = this.getOperations().createCount(
178
                    this.getFeatureType(),
179
                    this.getOperations().createTableReference(params),
180
                    params.getBaseFilter(), 
181
                    filtersql
182
            );
183
            size = (Long) selectCount.perform();              
184
        }
185
        return size;
186
    }
187

    
188
    @Override
189
    public boolean isEmpty() throws DataException {
190
        if (this.isEmpty == null) {
191
            if (this.size == null) {
192
                JDBCStoreParameters params = this.getJDBCStore().getParameters();
193
                String filtersql = null;
194
                Evaluator filter = this.getQuery().getFilter();
195
                if( filter != null ) {
196
                    filtersql = filter.getSQL();
197
                }
198
                TableIsEmptyOperation isEmpty_ = this.getOperations().createTableIsEmpty(
199
                        this.getFeatureType(),
200
                        this.getOperations().createTableReference(params),
201
                        params.getBaseFilter(), 
202
                        filtersql
203
                );
204
                this.isEmpty = (Boolean) isEmpty_.perform();   
205
            } else {
206
                this.isEmpty = (this.size < 1);
207
            }
208
        }
209
        return isEmpty;
210
    }
211

    
212

    
213
    protected JDBCIterator createFastIterator(long index) throws DataException {
214
        return createFastIterator(index, 0);
215
    }
216
    
217
    @Override
218
    protected JDBCIterator createFastIterator(long index, long elements) throws DataException {
219
        if( BooleanUtils.isTrue(isEmpty) ) {
220
            return new EmptyJDBCIterator(this.getJDBCStore());
221
        }
222
        
223
        JDBCStoreParameters params = this.getJDBCStore().getParameters();
224
        FeatureType storeType = this.getStore()
225
                .getStoreServices()
226
                .getProviderFeatureType(this.getFeatureType().getId());
227
        ResultSetForSetProviderOperation createResultSet 
228
            = getOperations().createResultSetForSetProvider(
229
                    this.getOperations().createTableReference(params),
230
                    params.getBaseFilter(), 
231
                    params.getBaseOrder(), 
232
                    this.getQuery(), 
233
                    storeType, 
234
                    this.getFeatureType(), 
235
                    elements, 
236
                    index, 
237
                    this.getDefaultFetchSize()
238
            );
239

    
240
        ResultSetEntry resultSetEntry = (ResultSetEntry) createResultSet.perform();
241

    
242
        this.resultSets.add(resultSetEntry);
243
        return new JDBCFastIterator(
244
                this.getJDBCStore(), 
245
                this, 
246
                this.getFeatureType(),
247
                resultSetEntry
248
        );
249
    }
250

    
251
    @Override
252
    protected JDBCIterator createIterator(long index) throws DataException {
253
        return createIterator(index, -1);
254
    }
255
    
256
    @Override
257
    protected JDBCIterator createIterator(long index, long elements) throws DataException {
258
        if( BooleanUtils.isTrue(isEmpty) ) {
259
            return new EmptyJDBCIterator(this.getJDBCStore());
260
        }
261
        JDBCStoreParameters params = this.getJDBCStore().getParameters();
262
        FeatureType storeType = this.getStore()
263
                .getStoreServices()
264
                .getProviderFeatureType(this.getFeatureType().getId());
265
        ResultSetForSetProviderOperation createResultSet 
266
            = getOperations().createResultSetForSetProvider(
267
                    this.getOperations().createTableReference(params),
268
                    params.getBaseFilter(), 
269
                    params.getBaseOrder(), 
270
                    this.getQuery(), 
271
                    storeType, 
272
                    this.getFeatureType(), 
273
                    elements, 
274
                    index, 
275
                    this.getDefaultFetchSize()
276
            );
277

    
278
        ResultSetEntry resultSetEntry = (ResultSetEntry) createResultSet.perform();
279
        this.resultSets.add(resultSetEntry);
280
        return new JDBCIterator(
281
                this.getJDBCStore(), 
282
                this, 
283
                this.getFeatureType(),
284
                resultSetEntry
285
        );
286
    }
287

    
288
}