Statistics
| Revision:

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

History | View | Annotate | Download (7.95 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());
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
        protected abstract String getSqlForEvaluator(Evaluator evaluator);
91

    
92
        protected abstract String getEscapedFieldName(String fieldName);
93

    
94
        protected void setOrder(FeatureQueryOrder order) {
95
                if (order == null || order.size() == 0) {
96
                        this.order = null;
97
                        return;
98
                }
99

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

    
123
                this.order = buffer.toString();
124
        }
125

    
126
        protected void setFilter(Evaluator filter) {
127
                this.filter = getSqlForEvaluator(filter);
128
        }
129

    
130

    
131

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

    
145
                } else{
146
                        return false;
147
                }
148
        }
149

    
150
        /* (non-Javadoc)
151
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#canIterateFromIndex()
152
         */
153
        public abstract boolean canIterateFromIndex();
154

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

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

    
206

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

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

    
229
        protected abstract JDBCIterator createFastIterartor(long index)
230
                        throws DataException;
231

    
232
        protected JDBCIterator createDefaultFastIterartor(int resultSetID)
233
                        throws DataException {
234
                return new JDBCFastIterator(store, this, featureType, resultSetID);
235
        }
236

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

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

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

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

    
281
                JDBCIterator iter = createIterator(index);
282
                return iter;
283
        }
284

    
285
        protected abstract JDBCIterator createIterator(long index)
286
                        throws DataException;
287

    
288
        protected JDBCIterator createDefaultIterartor(int resultSetID)
289
                        throws DataException {
290
                return new JDBCIterator(store, this, featureType, resultSetID);
291
        }
292

    
293
        private class EmptyJDBCIterator extends JDBCIterator {
294

    
295
                protected EmptyJDBCIterator() throws DataException {
296
                        super(null, null, null, -1);
297
                }
298

    
299
                public boolean hasNext() {
300
                        return false;
301
                }
302

    
303
                public Object next() {
304
                        throw new NoSuchElementException();
305
                }
306

    
307
                public void dispose() {
308

    
309
                }
310

    
311
        }
312

    
313
        public void addResulsetReference(int resulsetID) {
314
                this.resultSetIDReferenced.add(new Integer(resulsetID));
315
        }
316

    
317
        public void removeResulsetReference(int resulsetID) {
318
                this.resultSetIDReferenced.remove(new Integer(resulsetID));
319
        }
320

    
321

    
322
}