03 febrero 2006

Filtrando colecciones

Estamos trabajando en EColBase, nuestro objeto genérico y raíz de las colecciones de nuestros objetos de negocio. Para ofrecer el filtrado, la ordenación... sobre una colección seguramente lo implementemos con una vista sobre un EColBase, para repartir más la funcionalidad, y para separar 2 comportamientos distintos: filtrar una colección ya cargada, y cargar una colección ya filtrada. El primer caso será el de la vista, y el segundo caso será que en lugar de cargar la colección con todos los datos de la tabla (algo que no haremos nunca salvo excepciones) pasaremos un filtro en la SQL que nos devuelve la tabla desde la que cargamos la colección. Ambos filtros, el de la vista y el de la colección (BD) deben ser coherentes y homogéneos, es decir, no usar una nomenclatura para uno y otra distinta para el otro, aunque su eficiencia y comportamiento difieran (esto estará claro por el contexto en que hacemos el filtro, sea la vista o la colección). Un modelo muy elegante y sencillo para realizar filtros es el findByExample() de este ejemplo de la web de hibernate, donde se crea un objeto de negocio ficticio y se rellena con los valores que queremos que tengan los resultados. Esto ofrece poca potencia: no permite OR, sólo AND; para hacer los filtros LIKE debemos incluir los comodines en el objeto de negocio; debemos omitir todas las reglas de negocio, lo cual no sé si será sencillo en objetos complejos; debemos crear objetos hijos (también ficticios) para realizar filtros en los que se involucren varias tablas (como albaranes que contengan el artículo determinado); no se pueden definir filtros como mayor, menor o filtros de fechas avanzados (sólo el mes de marzo, entre una fecha y otra, etcétera)...
Por todo esto, es claro que es necesario un sistema de filtros avanzados: una estructura donde indicar propiedad y filtro, siendo este filtro dependiente del tipo de datos de la propiedad, y compuesto por operador y valor (o valores), como menor que 14, o entre 1/jul y 31/jul, o como 3a semana de marzo de 2005. Esto deberá implementarse de forma que sea reutilizable entre la vista y la colección, aunque la forma de utilizar los filtros establecidos en dicha estructura sea distinta en cada caso.