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 <jjdelce...@gvsig.org> escreveu no dia domingo, 25/10/2020 à(s) 09:30: > > > El lun., 19 oct. 2020 a las 21:23, Francisco Puga (<fp...@icarto.es>) > 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. >> 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 > -- Francisco Puga iCarto | Innovación, Cooperación, Cartografía y Territorio S.L. http://www.icarto.es/ 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 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