.. include-document:: org.gvsig.fmap.dal/reference-links
:rest:
.. include-document:: org.gvsig.tools/reference-links
:rest:
Dentro de este apartado veremos:
* Como obtener un conjunto de fenómenos filtrando
por tipo de fenómeno.
* Como obtener un conjunto de fenómenos filtrando
por una condición en función de los atributos
de los fenómenos.
Vamos a seguir trabajando sobre el ejemplo que hemos estado viendo en el
apartado anterior. ¿ Como podemos obtener un subconjunto de fenómenos de
nuestro almacén ?
Para aplicar un filtro, este se aplicara en el momento de invocar al
método *getFeatureSet* de nuestro *almacén*. Para esto deberemos
construir un objeto FeatureQuery_ , rellenarlo con los valores con los
que queremos filtrar e invocar al *getFeatureSet* pasándole
ese *query*.
A la hora de filtrar los fenómenos de un almacén de datos, podemos hacerlo
llevándonos de dos tipos de criterios:
* Según el tipo de fenómeno
* O según una condición de filtro en función de los valores
de los fenómenos del almacén.
Por ejemplo podríamos asegurarnos que cuando nos recorremos los fenómenos
siempre nos da fenómenos del mismo tipo, para ello podríamos hacer:
.. code-block:: java
types = store.getFeatureTypes();
Iterator typesIterator = types.iterator();
while( typesIterator.hasNext() ) {
featureType = (FeatureType)typesIterator.next();
index = featureType.getFieldIndex("NOMBRE");
FeatureQuery query = store.createFeatureQuery();
query.setFeatureType(featureType);
features = store.getFeatureSet(query);
DisposableIterator featuresIterator = features.iterator();
while( featuresIterator.hasNext() ) {
feature = (Feature)featuresIterator.next();
System.out.println(feature.getString(index));
}
featuresIterator.dispose();
features.dispose();
}
Primero averiguamos los tipos de fenómenos que contiene nuestro almacén,
y luego obtenemos los fenómenos filtrando por tipo. Para filtrar creamos
un FeatureQuery_ a partir del *store*.
.. code-block:: java
FeatureQuery query = store.createFeatureQuery();
Indicamos que queremos filtrar por los fenómenos de un tipo
en concreto.
.. code-block:: java
query.setFeatureType(featureType):
y por ultimo creamos el conjunto de fenómenos usando ese
filtro.
.. code-block:: java
features = store.getFeatureSet(query);
Al igual que podiamos emplear *visitor* sobre un almacen para
acceder a sus fenomenos, cuando estamos aplicando un filtro
tambien podemos usar el concepto de *visitor*, ya que el
almacen dispone de un metodo *acept* que recibe un query.
.. code-block:: java
store.accept( new Visitor() {
public void visit(Object obj) {
..
}
},
query
);
De forma similar a como filtramos por el tipo de fenómeno podemos
filtrar por una expresión en función de los atributos de los
fenómenos. Para ello deberemos crear un objeto Evaluator_ con la
condición que deseemos. Así el código de filtrado podría ser:
.. code-block:: java
FeatureQuery query = store.createFeatureQuery();
query.setFilter( manager.createExpresion("NOMBRE like 'a%'") );
features = store.getFeatureSet(query);
...
features.dispose();
Hay que tener en cuenta que podemos mezclar los dos tipos de filtro,
filtrando a su vez por los tipo de fenómeno y por una expresión.
.. code-block:: java
FeatureQuery query = store.createFeatureQuery();
query.setFilter( manager.createExpresion("NOMBRE like 'a%'") );
query.setFeatureType(featureType):
features = store.getFeatureSet(query);
...
features.dispose();
A la hora de aplicar un filtro a un *query*, debemos entregarle un objeto
de tipo Evaluator_ . El DataManager_ dispone de un evaluador por defecto
para la evaluación de expresiones, pero se pueden utilizar evaluadores
especializados para obtener mejores rendimientos.
Puede ser conveniente repasar la referencia sobre:
* FeatureQuery_
* Evaluator_
* DataManager_