Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_daldb / src / org / gvsig / fmap / dal / store / jdbc / JDBCSetProvider.java @ 27672

History | View | Annotate | Download (7.86 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2008 Infrastructures and Transports Department
4
* of the Valencian Government (CIT)
5
*
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
* MA  02110-1301, USA.
20
*
21
*/
22

    
23
/*
24
* AUTHORS (In addition to CIT):
25
* 2009 IVER T.I   {{Task}}
26
*/
27

    
28
/**
29
 *
30
 */
31
package org.gvsig.fmap.dal.store.jdbc;
32

    
33
import java.util.ArrayList;
34
import java.util.Iterator;
35
import java.util.List;
36
import java.util.NoSuchElementException;
37

    
38
import org.gvsig.fmap.dal.exception.DataException;
39
import org.gvsig.fmap.dal.feature.DisposableIterator;
40
import org.gvsig.fmap.dal.feature.FeatureQuery;
41
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
42
import org.gvsig.fmap.dal.feature.FeatureType;
43
import org.gvsig.fmap.dal.feature.FeatureQueryOrder.FeatureQueryOrderMember;
44
import org.gvsig.fmap.dal.feature.spi.FeatureSetProvider;
45
import org.gvsig.tools.evaluator.Evaluator;
46
import org.slf4j.Logger;
47
import org.slf4j.LoggerFactory;
48

    
49
/**
50
 * @author jmvivo
51
 *
52
 */
53
public abstract class JDBCSetProvider implements FeatureSetProvider {
54

    
55
        final static private Logger logger = LoggerFactory
56
                        .getLogger(JDBCSetProvider.class);
57

    
58

    
59

    
60
        protected JDBCStoreProvider store;
61
        protected FeatureQuery query;
62
        protected FeatureType featureType;
63
        protected String filter;
64
        protected String order;
65
        protected Long size = null;
66
        protected Boolean isEmpty = null;
67

    
68
        protected List resultSetIDReferenced;
69

    
70
        public JDBCSetProvider(JDBCStoreProvider store, FeatureQuery query,
71
                        FeatureType featureType) throws DataException {
72
                this.store = store;
73
                this.query = query;
74
                this.featureType = featureType;
75
                this.resultSetIDReferenced = new ArrayList();
76

    
77
                if (query.hasFilter() && this.canFilter()) {
78
                        setFilter(query.getFilter().getCQL());
79
                } else {
80
                        setFilter(null);
81
                }
82

    
83
                if (query.hasOrder() && canOrder()) {
84
                        setOrder(query.getOrder());
85
                } else {
86
                        setOrder(null);
87
                }
88
        }
89

    
90
        private void setOrder(FeatureQueryOrder order) {
91
                if (order == null || order.size() == 0) {
92
                        this.order = null;
93
                        return;
94
                }
95

    
96
                StringBuilder buffer = new StringBuilder();
97
                Iterator iter = order.iterator();
98
                FeatureQueryOrderMember menber;
99
                while (true) {
100
                        menber = (FeatureQueryOrderMember) iter.next();
101
                        if (menber.hasEvaluator()) {
102
                                buffer.append(menber.getEvaluator().getCQL());
103
                        } else {
104
                                buffer.append(menber.getAttributeName());
105
                        }
106
                        if (menber.getAscending()) {
107
                                buffer.append(" ASC");
108
                        } else {
109
                                buffer.append(" DESC");
110
                        }
111
                        if (iter.hasNext()) {
112
                                buffer.append(", ");
113
                        } else {
114
                                buffer.append(' ');
115
                                break;
116
                        }
117
                }
118

    
119
                this.order = buffer.toString();
120
        }
121

    
122
        protected void setFilter(String filter) {
123
                this.filter = filter;
124
        }
125

    
126

    
127

    
128
        /* (non-Javadoc)
129
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#canFilter()
130
         */
131
        public boolean canFilter() {
132
                Evaluator filter = query.getFilter();
133
                if (filter != null) {
134
                        if (filter.getCQL() == null || filter.getCQL().length() == 0) {
135
                                return false;
136
                        } else {
137
                                // TODO Check Geom fields if postgis not are available
138
                                return true;
139
                        }
140

    
141
                } else{
142
                        return false;
143
                }
144
        }
145

    
146
        /* (non-Javadoc)
147
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#canIterateFromIndex()
148
         */
149
        public abstract boolean canIterateFromIndex();
150

    
151
        /* (non-Javadoc)
152
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#canOrder()
153
         */
154
        public boolean canOrder() {
155
                // TODO Check Geom fields if postgis not are available
156
                if (query.hasOrder()) {
157
                        Iterator iter = query.getOrder().iterator();
158
                        FeatureQueryOrderMember menber;
159
                        String cql;
160
                        while (iter.hasNext()){
161
                                menber = (FeatureQueryOrderMember) iter.next();
162
                                if (menber.hasEvaluator()){
163
                                        cql =menber.getEvaluator().getCQL();
164
                                        if (cql == null || cql.length() == 0) {
165
                                                return false;
166
                                        }
167
                                }
168
                        }
169
                }
170
                return true;
171
        }
172

    
173
        public void dispose() {
174
                if (resultSetIDReferenced != null) {
175
                        Iterator iter = resultSetIDReferenced.iterator();
176
                        Integer resID;
177
                        while (iter.hasNext()) {
178
                                resID = (Integer) iter.next();
179
                                if (resID != null) {
180
                                        logger.warn(
181
                                                "ResultSet (ID {}) not closed on dispose, will close",
182
                                                resID);
183
                                        try {
184
                                                this.store.closeResulset(resID.intValue());
185
                                        } catch (DataException e) {
186
                                                logger.error("Close resulset Exception", e);
187
                                        }
188
                                }
189
                                iter.remove();
190
                        }
191
                }
192
                resultSetIDReferenced = null;
193
                store = null;
194
                query = null;
195
                featureType = null;
196
                filter = null;
197
                order = null;
198
                size = null;
199
                isEmpty = null;
200
        }
201

    
202

    
203
        /*
204
         * (non-Javadoc)
205
         *
206
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#fastIterator()
207
         */
208
        public DisposableIterator fastIterator() throws DataException {
209
                return this.fastIterator(0);
210
        }
211

    
212
        /*
213
         * (non-Javadoc)
214
         *
215
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#fastIterator(long)
216
         */
217
        public DisposableIterator fastIterator(long index) throws DataException {
218
                if (isEmpty != null && isEmpty.booleanValue()) {
219
                        return new EmptyJDBCIterator();
220
                }
221
                JDBCIterator iter = createFastIterartor(index);
222
                return iter;
223
        }
224

    
225
        protected abstract JDBCIterator createFastIterartor(long index)
226
                        throws DataException;
227

    
228
        protected JDBCIterator createDefaultFastIterartor(int resultSetID)
229
                        throws DataException {
230
                return new JDBCFastIterator(store, this, featureType, resultSetID);
231
        }
232

    
233
        /* (non-Javadoc)
234
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#getSize()
235
         */
236
        public long getSize() throws DataException {
237
                if (size == null) {
238
                        size = new Long(store.getCount(filter));
239
                }
240
                return size.longValue();
241
        }
242

    
243
        /* (non-Javadoc)
244
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#isEmpty()
245
         */
246
        public boolean isEmpty() throws DataException {
247
                if (isEmpty == null) {
248
                        if (size == null) {
249
                                String[] fieldName = new String[] { featureType
250
                                                .getAttributeDescriptor(0).getName() };
251
                                String sql = store
252
                                                .compoundSelect(fieldName, filter, null, 1, 0);
253
                                int rsID = store.createResultSet(sql);
254
                                isEmpty = new Boolean(store.resulsetNext(rsID));
255
                                store.closeResulset(rsID);
256
                        } else {
257
                                isEmpty = new Boolean(size.longValue() < 1);
258
                        }
259
                }
260
                return isEmpty.booleanValue();
261
        }
262

    
263
        /* (non-Javadoc)
264
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#iterator()
265
         */
266
        public DisposableIterator iterator() throws DataException {
267
                return iterator(0);
268
        }
269

    
270
        /* (non-Javadoc)
271
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#iterator(long)
272
         */
273
        public DisposableIterator iterator(long index) throws DataException {
274
                if (isEmpty != null && isEmpty.booleanValue()) {
275
                        return new EmptyJDBCIterator();
276
                }
277

    
278
                JDBCIterator iter = createIterator(index);
279
                return iter;
280
        }
281

    
282
        protected abstract JDBCIterator createIterator(long index)
283
                        throws DataException;
284

    
285
        protected JDBCIterator createDefaultIterartor(int resultSetID)
286
                        throws DataException {
287
                return new JDBCIterator(store, this, featureType, resultSetID);
288
        }
289

    
290
        private class EmptyJDBCIterator extends JDBCIterator {
291

    
292
                protected EmptyJDBCIterator() throws DataException {
293
                        super(null, null, null, -1);
294
                }
295

    
296
                public boolean hasNext() {
297
                        return false;
298
                }
299

    
300
                public Object next() {
301
                        throw new NoSuchElementException();
302
                }
303

    
304
                public void dispose() {
305

    
306
                }
307

    
308
        }
309

    
310
        public void addResulsetReference(int resulsetID) {
311
                this.resultSetIDReferenced.add(new Integer(resulsetID));
312
        }
313

    
314
        public void removeResulsetReference(int resulsetID) {
315
                this.resultSetIDReferenced.remove(new Integer(resulsetID));
316
        }
317

    
318

    
319
}