Re: [Gvsig_desarrolladores] Actualizar a 2.5.1. Problema con FeatureQuery

2020-10-28 Por tema Francisco Puga
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  escreveu no dia
domingo, 25/10/2020 à(s) 09:30:

>
>
> El lun., 19 oct. 2020 a las 21:23, Francisco Puga ()
> 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(); 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 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 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.
>> http://www.icarto.es/
>> ___
>> gvSIG_desarrolladores mailing list
>> gvSIG_desarrolladores@listserv.gva.es
>> 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
> jjdelce...@gvsig.com
> gvSIG Association
> www.gvsig.com
> ___
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores@listserv.gva.es
>

Re: [Gvsig_desarrolladores] Actualizar a 2.5.1. Problema con FeatureQuery

2020-10-25 Por tema Joaquin Jose del Cerro Murciano
El lun., 19 oct. 2020 a las 21:23, Francisco Puga ()
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(); 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 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 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.
> http://www.icarto.es/
> ___
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores@listserv.gva.es
> 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
jjdelce...@gvsig.com
gvSIG Association
www.gvsig.com
___
gvSIG_desarrolladores mailing list
gvSIG_desarrolladores@listserv.gva.es
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