Actualizar a 2.5.1. Problema con FeatureQuery

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Actualizar a 2.5.1. Problema con FeatureQuery

Francisco Puga-2
Hola,

Antes con una tabla alfanumérica proveniente de postgres usaba un código como este para filtrar algunas features de la tabla que me interesaban, y estas features tenían todos los atributos:

```java
FeatureStore store = my_get_feature_store_from_the_tabledocument() // no relevante. capa con al menos columnas: gid, bar, foo
boolean hasFilter = si_tiene_que_tener_filtro(); // no relevante
DataManager dataManager = DALLocator.getDataManager();
FeatureQuery query = store.createFeatureQuery();
if (hasFillter()) {
    String where = "foo = 5";
    Evaluator evaluator = dataManager.createExpresion(where) // ahora sería createFilter
    query.addFilter(evaluator);
}
FeaturePagingHelper set = manager.createFeaturePagingHelper(store, query, 10); // tenía todos los atributos

Feature feat = set.getFeatureAt(position);
feat.get("bar"); // IllegalArgumentException: Attribute name 'bar' not found in the feature.
```

Pero ahora al intentar acceder a un atributo de la feature que no está definido en el filtro obtengo un error. En otros métodos de store.createFeatureQuery(xxxx); veo que al final se hace un "query.retrievesAllAttributes();". ¿Este es el comportamiento esperado? Lo comento por si es un bug.

He cambiado del siguiente modo y parece funcionar:

```java
FeatureStore store = my_get_feature_store_from_the_tabledocument() // no relevante. capa con al menos columnas: gid, bar, foo
boolean hasFilter = si_tiene_que_tener_filtro(); // no relevante
DataManager dataManager = DALLocator.getDataManager();
FeatureQuery query = null;
if (hasFillter()) {
    String where = "foo = 5";
    store.createFeatureQuery(where, "", false);
} else {
     store.createFeatureQuery("", "", false);
}
FeaturePagingHelper set = manager.createFeaturePagingHelper(store, query, 10); 

Feature feat = set.getFeatureAt(position);
feat.get("bar"); // It works!
```



--
Francisco Puga
iCarto | Innovación, Cooperación, Cartografía y Territorio S.L.

_______________________________________________
gvSIG_desarrolladores mailing list
[hidden email]
Para ver histórico de mensajes, editar sus preferencias de usuario o darse de baja en esta lista, acuda a la siguiente dirección: https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
Reply | Threaded
Open this post in threaded view
|

Re: Actualizar a 2.5.1. Problema con FeatureQuery

Joaquin Jose del Cerro Murciano


El lun., 19 oct. 2020 a las 21:23, Francisco Puga (<[hidden email]>) escribió:
Hola,

Antes con una tabla alfanumérica proveniente de postgres usaba un código como este para filtrar algunas features de la tabla que me interesaban, y estas features tenían todos los atributos:

```java
FeatureStore store = my_get_feature_store_from_the_tabledocument() // no relevante. capa con al menos columnas: gid, bar, foo
boolean hasFilter = si_tiene_que_tener_filtro(); // no relevante
DataManager dataManager = DALLocator.getDataManager();
FeatureQuery query = store.createFeatureQuery();
if (hasFillter()) {
    String where = "foo = 5";
    Evaluator evaluator = dataManager.createExpresion(where) // ahora sería createFilter
    query.addFilter(evaluator);
}
FeaturePagingHelper set = manager.createFeaturePagingHelper(store, query, 10); // tenía todos los atributos

Feature feat = set.getFeatureAt(position);
feat.get("bar"); // IllegalArgumentException: Attribute name 'bar' not found in the feature.
```

Pero ahora al intentar acceder a un atributo de la feature que no está definido en el filtro obtengo un error. En otros métodos de store.createFeatureQuery(xxxx); veo que al final se hace un "query.retrievesAllAttributes();". ¿Este es el comportamiento esperado? Lo comento por si es un bug.

He cambiado del siguiente modo y parece funcionar:

```java
FeatureStore store = my_get_feature_store_from_the_tabledocument() // no relevante. capa con al menos columnas: gid, bar, foo
boolean hasFilter = si_tiene_que_tener_filtro(); // no relevante
DataManager dataManager = DALLocator.getDataManager();
FeatureQuery query = null;
if (hasFillter()) {
    String where = "foo = 5";
    store.createFeatureQuery(where, "", false);
} else {
     store.createFeatureQuery("", "", false);
}
FeaturePagingHelper set = manager.createFeaturePagingHelper(store, query, 10); 

Feature feat = set.getFeatureAt(position);
feat.get("bar"); // It works!
```


Hola Francisco.

Cuando contruyes una consulta con el FeatureQuery, solo se trae los campos
que ha de usar en el filtro, mas los que se indiquen con el metodo "addAttributeName".
Si te interesan todos los campos de la feature, cuando termines de configurar
el FeatureQuery y antes de usarla llama al metodo "retrievesAllAttributes".

  FeatureQuery query = store.createFeatureQuery();
  if (hasFillter()) {
      query.addFilter("foo = 5");
      query.retrieveAllFeatures();
  }
  List<Feature> features = store.getFeatures(query,10);

  ...
  features.get(position).get("bar")
  ...

  DisposeUtils.disposeQuietly(features);

Cuando construyes un FeatureQuery vacio, es cosa tuya configurarlo todo correctamente.
Si lo construyes a partir de un filtro u orden, automaticamente te marca que
debe recuperar todos los atributos. Lo dejamos asi por que consideramos que una consulta
simple salga directamente, pero si quieres algo mas complejo, es cosa tuya
configurarlo todo.

  String where = ... null/""/"foo = 5"...;
  List<Feature> features = store.getFeatures(where);
  ...
  features.get(position).get("bar")
  ...
  DisposeUtils.disposeQuietly(features);


Si utilizas el metodo getFeatures La lista que devuelve no esta en memoria,
por debajo usa PagingHelper. Puedes hacer casting a cualquiera de estos interfaces
en caso de que lo necesites:

- FacadeOfAFeaturePagingHelper. Por si necesitas acceder al PagingHelper
- UnmodifiableBasicList. Una lista, no te hara falta, ya la tienes un lista.
- UnmodifiableBasicList64. Por si la consulta crees que pueda devolver mas elementos de los que caben en un int.
- Disposable. Para hacer un dispose cuando termines, o un bind si fuese necesario.


Un saludo
Joaquin
 


--
Francisco Puga
iCarto | Innovación, Cooperación, Cartografía y Territorio S.L.
_______________________________________________
gvSIG_desarrolladores mailing list
[hidden email]
Para ver histórico de mensajes, editar sus preferencias de usuario o darse de baja en esta lista, acuda a la siguiente dirección: https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores


--
--------------------------------------
Joaquin Jose del Cerro Murciano
Development and software arquitecture manager at gvSIG Team
[hidden email]
gvSIG Association
www.gvsig.com

_______________________________________________
gvSIG_desarrolladores mailing list
[hidden email]
Para ver histórico de mensajes, editar sus preferencias de usuario o darse de baja en esta lista, acuda a la siguiente dirección: https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
Reply | Threaded
Open this post in threaded view
|

Re: Actualizar a 2.5.1. Problema con FeatureQuery

Francisco Puga-2
Gracias por los comentarios Joaquín.

En este caso tengo mucho código de antes acoplado a FeaturePagingHelper y prefiero no refactorizar pero lo tendré en cuenta para cuando tenga que hacer cambios o escribir nuevo código.

Joaquin Jose del Cerro Murciano <[hidden email]> escreveu no dia domingo, 25/10/2020 à(s) 09:30:


El lun., 19 oct. 2020 a las 21:23, Francisco Puga (<[hidden email]>) escribió:
Hola,

Antes con una tabla alfanumérica proveniente de postgres usaba un código como este para filtrar algunas features de la tabla que me interesaban, y estas features tenían todos los atributos:

```java
FeatureStore store = my_get_feature_store_from_the_tabledocument() // no relevante. capa con al menos columnas: gid, bar, foo
boolean hasFilter = si_tiene_que_tener_filtro(); // no relevante
DataManager dataManager = DALLocator.getDataManager();
FeatureQuery query = store.createFeatureQuery();
if (hasFillter()) {
    String where = "foo = 5";
    Evaluator evaluator = dataManager.createExpresion(where) // ahora sería createFilter
    query.addFilter(evaluator);
}
FeaturePagingHelper set = manager.createFeaturePagingHelper(store, query, 10); // tenía todos los atributos

Feature feat = set.getFeatureAt(position);
feat.get("bar"); // IllegalArgumentException: Attribute name 'bar' not found in the feature.
```

Pero ahora al intentar acceder a un atributo de la feature que no está definido en el filtro obtengo un error. En otros métodos de store.createFeatureQuery(xxxx); veo que al final se hace un "query.retrievesAllAttributes();". ¿Este es el comportamiento esperado? Lo comento por si es un bug.

He cambiado del siguiente modo y parece funcionar:

```java
FeatureStore store = my_get_feature_store_from_the_tabledocument() // no relevante. capa con al menos columnas: gid, bar, foo
boolean hasFilter = si_tiene_que_tener_filtro(); // no relevante
DataManager dataManager = DALLocator.getDataManager();
FeatureQuery query = null;
if (hasFillter()) {
    String where = "foo = 5";
    store.createFeatureQuery(where, "", false);
} else {
     store.createFeatureQuery("", "", false);
}
FeaturePagingHelper set = manager.createFeaturePagingHelper(store, query, 10); 

Feature feat = set.getFeatureAt(position);
feat.get("bar"); // It works!
```


Hola Francisco.

Cuando contruyes una consulta con el FeatureQuery, solo se trae los campos
que ha de usar en el filtro, mas los que se indiquen con el metodo "addAttributeName".
Si te interesan todos los campos de la feature, cuando termines de configurar
el FeatureQuery y antes de usarla llama al metodo "retrievesAllAttributes".

  FeatureQuery query = store.createFeatureQuery();
  if (hasFillter()) {
      query.addFilter("foo = 5");
      query.retrieveAllFeatures();
  }
  List<Feature> features = store.getFeatures(query,10);

  ...
  features.get(position).get("bar")
  ...

  DisposeUtils.disposeQuietly(features);

Cuando construyes un FeatureQuery vacio, es cosa tuya configurarlo todo correctamente.
Si lo construyes a partir de un filtro u orden, automaticamente te marca que
debe recuperar todos los atributos. Lo dejamos asi por que consideramos que una consulta
simple salga directamente, pero si quieres algo mas complejo, es cosa tuya
configurarlo todo.

  String where = ... null/""/"foo = 5"...;
  List<Feature> features = store.getFeatures(where);
  ...
  features.get(position).get("bar")
  ...
  DisposeUtils.disposeQuietly(features);


Si utilizas el metodo getFeatures La lista que devuelve no esta en memoria,
por debajo usa PagingHelper. Puedes hacer casting a cualquiera de estos interfaces
en caso de que lo necesites:

- FacadeOfAFeaturePagingHelper. Por si necesitas acceder al PagingHelper
- UnmodifiableBasicList. Una lista, no te hara falta, ya la tienes un lista.
- UnmodifiableBasicList64. Por si la consulta crees que pueda devolver mas elementos de los que caben en un int.
- Disposable. Para hacer un dispose cuando termines, o un bind si fuese necesario.


Un saludo
Joaquin
 


--
Francisco Puga
iCarto | Innovación, Cooperación, Cartografía y Territorio S.L.
_______________________________________________
gvSIG_desarrolladores mailing list
[hidden email]
Para ver histórico de mensajes, editar sus preferencias de usuario o darse de baja en esta lista, acuda a la siguiente dirección: https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores


--
--------------------------------------
Joaquin Jose del Cerro Murciano
Development and software arquitecture manager at gvSIG Team
[hidden email]
gvSIG Association
www.gvsig.com
_______________________________________________
gvSIG_desarrolladores mailing list
[hidden email]
Para ver histórico de mensajes, editar sus preferencias de usuario o darse de baja en esta lista, acuda a la siguiente dirección: https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores


--
Francisco Puga
iCarto | Innovación, Cooperación, Cartografía y Territorio S.L.

c/ Rafael Alberti nº 13 – 1º D
15008 A Coruña
Galicia (Spain)
+34 881927808

Este correo electrónico contiene información estrictamente confidencial y es de uso exclusivo del destinatario, quedando prohibida a cualquier otra persona su revelación, copia, distribución, o el ejercicio de cualquier acción relativa a su contenido. Si ha recibido este mensaje por error, por favor conteste a su remitente mediante correo electrónico y proceda a borrarlo de su sistema.

Sus datos personales serán tratados de forma confidencial y no serán cedidos a terceros ajenos a ICARTO. En cualquier caso, podrá ejercer los derecho de oposición, acceso, rectificación y cancelación de acuerdo con lo establecido en la Ley Orgánica 15/99, de 13 de diciembre, de Protección de Datos de Carácter Personal dirigiéndose a Innovación, Cooperación, Cartografía e Territorio, SL. (ICARTO) en la dirección postal a C/ Rafael Alberti, nº 13, 1ºD, 15.008 – (A Coruña).

_______________________________________________
gvSIG_desarrolladores mailing list
[hidden email]
Para ver histórico de mensajes, editar sus preferencias de usuario o darse de baja en esta lista, acuda a la siguiente dirección: https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores