Statistics
| Revision:

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

History | View | Annotate | Download (6.29 KB)

1 27525 jmvivo
/* 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.Iterator;
34
import java.util.NoSuchElementException;
35
36
import org.gvsig.fmap.dal.exception.DataException;
37
import org.gvsig.fmap.dal.feature.FeatureQuery;
38
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
39
import org.gvsig.fmap.dal.feature.FeatureType;
40
import org.gvsig.fmap.dal.feature.FeatureQueryOrder.FeatureQueryOrderMember;
41
import org.gvsig.fmap.dal.feature.spi.FeatureSetProvider;
42
import org.gvsig.tools.evaluator.Evaluator;
43
44
/**
45
 * @author jmvivo
46
 *
47
 */
48
public abstract class JDBCSetProvider implements FeatureSetProvider {
49
50
        protected JDBCStoreProvider store;
51
        protected FeatureQuery query;
52
        protected FeatureType featureType;
53
        protected String filter;
54
        protected String order;
55
        protected Long size = null;
56
        protected Boolean isEmpty = null;
57
58
59
        public JDBCSetProvider(JDBCStoreProvider store, FeatureQuery query,
60
                        FeatureType featureType) throws DataException {
61
                this.store = store;
62
                this.query = query;
63
                this.featureType = featureType;
64
65
                if (query.hasFilter() && this.canFilter()) {
66
                        setFilter(query.getFilter().getCQL());
67
                } else {
68
                        setFilter(null);
69
                }
70
71
                if (query.hasOrder() && canOrder()) {
72
                        setOrder(query.getOrder());
73
                } else {
74
                        setOrder(null);
75
                }
76
        }
77
78
        private void setOrder(FeatureQueryOrder order) {
79
                if (order == null || order.size() == 0) {
80
                        this.order = null;
81
                        return;
82
                }
83
84
                StringBuilder buffer = new StringBuilder();
85
                Iterator iter = order.iterator();
86
                FeatureQueryOrderMember menber;
87
                while (true) {
88
                        menber = (FeatureQueryOrderMember) iter.next();
89
                        if (menber.getAscending()) {
90
                                buffer.append("ASC ");
91
                        } else {
92
                                buffer.append("DESC ");
93
                        }
94
                        if (menber.hasEvaluator()) {
95
                                buffer.append(menber.getEvaluator().getCQL());
96
                        } else {
97
                                buffer.append(menber.getAttributeName());
98
                        }
99
                        if (iter.hasNext()) {
100
                                buffer.append(", ");
101
                        } else {
102
                                buffer.append(' ');
103
                                break;
104
                        }
105
                }
106
107
                this.order = buffer.toString();
108
        }
109
110
        protected void setFilter(String filter) {
111
                this.filter = filter;
112
        }
113
114
115
116
        /* (non-Javadoc)
117
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#canFilter()
118
         */
119
        public boolean canFilter() {
120
                Evaluator filter = query.getFilter();
121
                if (filter != null) {
122
                        if (filter.getCQL() == null || filter.getCQL().length() == 0) {
123
                                return false;
124
                        } else {
125
                                // TODO Check Geom fields if postgis not are available
126
                                return true;
127
                        }
128
129
                } else{
130
                        return false;
131
                }
132
        }
133
134
        /* (non-Javadoc)
135
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#canIterateFromIndex()
136
         */
137
        public abstract boolean canIterateFromIndex();
138
139
        /* (non-Javadoc)
140
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#canOrder()
141
         */
142
        public boolean canOrder() {
143
                // TODO Check Geom fields if postgis not are available
144
                if (query.hasFilter()) {
145
                        Iterator iter = query.getOrder().iterator();
146
                        FeatureQueryOrderMember menber;
147
                        String cql;
148
                        while (iter.hasNext()){
149
                                menber = (FeatureQueryOrderMember) iter.next();
150
                                if (menber.hasEvaluator()){
151
                                        cql =menber.getEvaluator().getCQL();
152
                                        if (cql == null || cql.length() == 0) {
153
                                                return false;
154
                                        }
155
                                }
156
                        }
157
                }
158
                return true;
159
        }
160
161
162
        /*
163
         * (non-Javadoc)
164
         *
165
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#fastIterator()
166
         */
167
        public Iterator fastIterator() throws DataException {
168
                return this.fastIterator(0);
169
        }
170
171
        /*
172
         * (non-Javadoc)
173
         *
174
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#fastIterator(long)
175
         */
176
        public Iterator fastIterator(long index) throws DataException {
177
                if (isEmpty != null && isEmpty.booleanValue()) {
178
                        return new EmptyJDBCIterator();
179
                }
180
                JDBCIterator iter = createFastIterartor(index);
181
                return iter;
182
        }
183
184
        protected abstract JDBCIterator createFastIterartor(long index);
185
186
        /* (non-Javadoc)
187
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#getSize()
188
         */
189
        public long getSize() throws DataException {
190
                if (size == null) {
191
                        size = new Long(store.getCount(filter));
192
                }
193
                return size.longValue();
194
        }
195
196
        /* (non-Javadoc)
197
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#isEmpty()
198
         */
199
        public boolean isEmpty() throws DataException {
200
                if (isEmpty == null) {
201
                        if (size == null) {
202
                                String[] fieldName = new String[] { featureType
203
                                                .getAttributeDescriptor(0).getName() };
204
                                String sql = store
205
                                .compoundSelect(fieldName, filter, null, 1, 0);
206
                                int rsID = store.createResulset(sql);
207
                                isEmpty = new Boolean(store.resulsetNext(rsID));
208
                                store.closeResulset(rsID);
209
                        } else {
210
                                isEmpty = new Boolean(size.longValue() < 1);
211
                        }
212
                }
213
                return isEmpty.booleanValue();
214
        }
215
216
        /* (non-Javadoc)
217
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#iterator()
218
         */
219
        public Iterator iterator() throws DataException {
220
                return iterator(0);
221
        }
222
223
        /* (non-Javadoc)
224
         * @see org.gvsig.fmap.dal.feature.spi.FeatureSetProvider#iterator(long)
225
         */
226
        public Iterator iterator(long index) throws DataException {
227
                if (isEmpty != null && isEmpty.booleanValue()) {
228
                        return new EmptyJDBCIterator();
229
                }
230
231
                JDBCIterator iter = createIterator(index);
232
                return iter;
233
        }
234
235
        protected abstract JDBCIterator createIterator(long index);
236
237
        private class EmptyJDBCIterator extends JDBCIterator {
238
239
                protected EmptyJDBCIterator() throws DataException {
240
                        super(null, null, -1);
241
                }
242
243
                public boolean hasNext() {
244
                        return false;
245
                }
246
247
                public Object next() {
248
                        throw new NoSuchElementException();
249
                }
250
251
                public void close() throws JDBCSQLException,
252
                                InvalidResultSetIdException {
253
                }
254
        }
255
}