Lista de una estructura de arbol

22 views
Skip to first unread message

jmiguel rodriguez

unread,
May 28, 2013, 4:13:58 AM5/28/13
to madri...@googlegroups.com, grailsenc...@googlegroups.com
Hola a todos!

Tengo que sacar una rejilla (para el caso, una lista) de elementos
hijos de una estructura de arbol. Me explico con un dibujo:

- Rama1
- Elemento 11
- Elemento 12
- Rama11
- Elemento 111
- Elemento 112
- Rama111
- Elemento 1111

- Rama2
[.....]


Si el usuario selecciona Rama1 deberan salir todos los Elemento*. Si
selecciona Rama11 deberian salir Elemento111, 112 y 1111 . Supongo
que se entiende la funcionalidad...

Resolviendo el asunto de forma recursiva podemos obtener la lista sin
demasiados problemas, pero el tema es que es necesario hacer
paginación sobre esa lista, con lo que el sistema 'Grails-style' de
pasar el offset, max y demas para paginación no sirve.

¿Alguna orientación sobre como resolver esto de forma mas o menos elegante?.

Gracias por adelantado!



--
saludos,
jmiguel

http://www.jmiguel.eu
http://www.aerotrastornados.com

jmiguel rodriguez

unread,
May 28, 2013, 4:32:02 AM5/28/13
to madri...@googlegroups.com, grailsEnCastellano

El 28 de mayo de 2013 10:19, Álvaro Sánchez-Mariscal <alvaro....@salenda.es> escribió:
Si no te entiendo mal, una forma de solucionarlo es usar un DetachedCriteria con la condicion para sacarlos todos (eg, by parent), y luego reusarlo con distintos valores de offset.

No lo veo claro para hacerlo de una sola tacada, sin tener que hacer varias peticiones (recursivas) e ir añadiéndolo a un List. Pero lo miro por ese lado a ver si encuentro buena forma. 


Lo del crossposting: no lo vamos a discutir por aqui :-), lo respeto pero es simplemente una forma de llegar a mas público que no tiene  porqué estar en alguna de ellas. EMHO es limitar la utilidad de la lista de Madrid a 'noticias locales' puesto que la otra es mas amplia. Aceptado anyway. 

Alberto Vilches

unread,
May 28, 2013, 4:44:40 AM5/28/13
to madri...@googlegroups.com, grailsenc...@googlegroups.com
Cuantos elementos tiene el árbol? Cuantos niveles máximos de profundidad puedes llegar a tener? (no me vale "infinito")


2013/5/28 jmiguel rodriguez <jmiguel....@gmail.com>

--
Has recibido este mensaje porque estás suscrito al grupo "MadridGUG: Grupo de Usuarios de Groovy de Madrid" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a madrid-gug+...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a madri...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/madrid-gug?hl=es.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.





--
Un saludo.
Alberto Vilches
Twitter: @albertovilches

jmiguel rodriguez

unread,
May 28, 2013, 4:49:31 AM5/28/13
to grailsenc...@googlegroups.com
El día 28 de mayo de 2013 10:44, Alberto Vilches <vil...@gmail.com> escribió:
> Cuantos elementos tiene el árbol? Cuantos niveles máximos de profundidad
> puedes llegar a tener? (no me vale "infinito")

Pocos. En principio 3, puede que algun dia 4. Lo ideal, claro, seria
encontrar una solución 'universal', pero con 3 niveles ahora mismo nos
vale.

José Guitart

unread,
May 28, 2013, 4:50:01 AM5/28/13
to grailsenc...@googlegroups.com, madri...@googlegroups.com
A lo mejor os cuento una tontería, pero ¿y si se guarda el "path" en la base de datos y se buscan los elementos de forma ordenada por un like?

Por ejemplo todo si tenemso el elemento en la rama "1-1-2" y un elemento en la rama "1-1-2-3" y otro en "1-1-3-4-3-3-4-3-3-4-4-4-4-3-3-3-3-4-3-3-4-3-3", con hacer una consulta del tipo Elemento.findAllByPathLike("1-1-%", order:"path") ya te retornaría todo ordenadito... ¿no?.

Atentamente
José Guitart


--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a grailsencastell...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/grailsencastellano?hl=es.

Alberto Vilches

unread,
May 28, 2013, 4:57:52 AM5/28/13
to grailsenc...@googlegroups.com
Si tienes pocos elementos, entonces carga el árbol entero. Nosotros tenemos una cache con todos los árboles posibles y los enviamos enteros a la vista (cada árbol no tiene ni 100 elementos), y no paginamos porque son categorías de productos.

Tendrás que desnormalizar un poco para ayudar a la base de datos. Puedes guarda el nivel de anidamiento (en un campo llamado level por ejemplo) para reducir la recursividad y hacer consultas del tipo "select * from nodes where level >= x". 
El único problema es que si mueves una rama a otra, tienes que actualizar el nivel de ese elemento y el de toda su descendencia.

Puedes guardar los ancestros en un string y buscar con un like. Por ejemplo: ancestors = "-2-18-21-17-", significa que tu padre es el 17, tu abuelo el 21, etc hasta llegar a la raiz que es el 2 (bueno, la raiz verdadera no existe, el 2 es una de las raices cuyo padre es null). Si quieres buscar la descendencia completa del 18, con buscar por like %-18-% ya lo tienes.

A ver si con esto vas tirando. Por cierto, yo tengo ese libro (tengo todos los de Joe Celkos, el de SQL for Smarties tambien) y solo te digo que es la biblia del sql. Ahí esta todo!


2013/5/28 jmiguel rodriguez <jmiguel....@gmail.com>
--
Has recibido este mensaje porque estás suscrito al grupo "grailsEnCastellano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a grailsencastell...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a grailsenc...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/grailsencastellano?hl=es.

Para obtener más opciones, visita https://groups.google.com/groups/opt_out.


jmiguel rodriguez

unread,
May 28, 2013, 5:09:01 AM5/28/13
to grailsEnCastellano
El día 28 de mayo de 2013 10:57, Alberto Vilches <vil...@gmail.com> escribió:
> Si tienes pocos elementos, entonces carga el árbol entero. Nosotros tenemos
> una cache con todos los árboles posibles y los enviamos enteros a la vista

Gracias por los dos mensajes, Alberto. Lo paso a quienes lo están
haciendo ( en este caso soy un mero (neuro)trasmisor ) para ver si se
puede aprovechar, que yo creo que si. A ver si alguno se pasa por aqui
para dar mas pistas en caso de que falte algo...

Gracias!

jmiguel rodriguez

unread,
May 28, 2013, 5:10:20 AM5/28/13
to grailsEnCastellano, madri...@googlegroups.com
El día 28 de mayo de 2013 10:50, José Guitart <jose.g...@gmail.com> escribió:
> A lo mejor os cuento una tontería, pero ¿y si se guarda el "path" en la base
> de datos y se buscan los elementos de forma ordenada por un like?

Es una posibilidad, pero nos llevaria a algunos problemas para la
gestion inicial. Supongo que nada que no se pueda 're-pensar', pero no
seria tan directo como teníamos pensado.

Thank you!
Reply all
Reply to author
Forward
0 new messages