Revision 209 trunk/org.gvsig.gdal/org.gvsig.gdal.prov/org.gvsig.gdal.prov.ogr/src/main/java/org/gvsig/gdal/prov/ogr/OGRFetureSetProvider.java
OGRFetureSetProvider.java | ||
---|---|---|
55 | 55 |
import org.slf4j.LoggerFactory; |
56 | 56 |
|
57 | 57 |
/** |
58 |
*
|
|
58 |
* |
|
59 | 59 |
* @author <a href="mailto:lmarques@disid.com">Lluis Marques</a> |
60 | 60 |
* |
61 | 61 |
*/ |
... | ... | |
122 | 122 |
LOG.debug("Running query {} over {}", new Object[] { sql, dataSource.getName() }); |
123 | 123 |
|
124 | 124 |
Layer layer = null; |
125 |
if (getOGRStoreProvider().getLayer().TestCapability(ogrConstants.OLCFastSpatialFilter) |
|
125 |
boolean ignoreSpatialFilter = (boolean) getStore().getParameters().getDynValue(OGRDataStoreParameters.IGNORE_SPATIAL_FILTER); |
|
126 |
if (!ignoreSpatialFilter && getOGRStoreProvider().getLayer().TestCapability(ogrConstants.OLCFastSpatialFilter) |
|
126 | 127 |
&& getQuery().hasFilter()) { |
127 | 128 |
|
128 | 129 |
String evaluatorSQL = getQuery().getFilter().getSQL(); |
... | ... | |
153 | 154 |
} else { |
154 | 155 |
layer = dataSource.ExecuteSQL(sql); |
155 | 156 |
} |
156 |
|
|
157 |
|
|
157 | 158 |
if(layer == null){ |
158 | 159 |
LOG.warn("The result of query is null. SQL {} FeatureType {}", sql, getFeatureType()); |
159 | 160 |
LOG.warn("Getting data without SQL filter"); |
160 | 161 |
OGRDataStoreParameters ogrParameters = (OGRDataStoreParameters) getOGRStoreProvider().getParameters(); |
161 | 162 |
layer = dataSource.ExecuteSQL("SELECT * FROM ".concat(ogrParameters.getLayerName())); |
162 | 163 |
} |
163 |
|
|
164 |
|
|
164 | 165 |
return new OGRFastIterator(getStore(), layer, index); |
165 | 166 |
} |
166 | 167 |
|
... | ... | |
188 | 189 |
|
189 | 190 |
private FeatureProvider featureProvider; |
190 | 191 |
|
192 |
private Feature currentOgrFeature; |
|
193 |
private Feature nextOgrFeature; |
|
194 |
|
|
191 | 195 |
public OGRFastIterator(FeatureStoreProvider storeProvider, Layer layer, long index) |
192 | 196 |
throws OGRUnsupportedFormatException { |
193 | 197 |
super(storeProvider); |
... | ... | |
196 | 200 |
this.converter = new OGRConverter(); |
197 | 201 |
this.index = index; |
198 | 202 |
this.layer = layer; |
199 |
this.layer.SetNextByIndex((int) index); |
|
203 |
this.layer.GetFeatureCount(); |
|
204 |
this.layer.ResetReading(); |
|
205 |
if(index!=0){ |
|
206 |
this.layer.SetNextByIndex((int) index); |
|
207 |
} |
|
208 |
this.currentOgrFeature = null; |
|
209 |
this.nextOgrFeature = this.layer.GetNextFeature(); |
|
200 | 210 |
} |
201 | 211 |
|
202 | 212 |
@Override |
203 | 213 |
public void remove() { |
204 |
Feature ogrFeature;
|
|
205 |
ogrFeature = this.layer.GetNextFeature();
|
|
206 |
this.layer.DeleteFeature(ogrFeature.GetFID());
|
|
207 |
index++;
|
|
214 |
if (currentOgrFeature != null) {
|
|
215 |
this.layer.DeleteFeature(currentOgrFeature.GetFID());
|
|
216 |
currentOgrFeature=null;
|
|
217 |
}
|
|
208 | 218 |
} |
209 | 219 |
|
210 | 220 |
@Override |
211 | 221 |
protected Object internalNext() { |
212 |
Feature ogrFeature = this.layer.GetNextFeature(); |
|
213 |
this.featureProvider = converter.convert(featureProvider, getFeatureType(), ogrFeature); |
|
214 |
index++; |
|
222 |
this.currentOgrFeature = this.nextOgrFeature; |
|
223 |
this.featureProvider = null; |
|
224 |
this.featureProvider = converter.convert(featureProvider, getFeatureType(), this.nextOgrFeature); |
|
225 |
this.nextOgrFeature = this.layer.GetNextFeature(); |
|
215 | 226 |
return this.featureProvider; |
216 | 227 |
} |
217 | 228 |
|
218 | 229 |
@Override |
219 | 230 |
protected boolean internalHasNext() { |
220 |
return index < this.layer.GetFeatureCount() ? true : false;
|
|
231 |
return nextOgrFeature!=null;
|
|
221 | 232 |
} |
222 | 233 |
|
223 | 234 |
@Override |
Also available in: Unified diff