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 | } |