Lista de una estructura de arbol

19 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

Álvaro Sánchez-Mariscal

unread,
May 28, 2013, 4:19:14 AM5/28/13
to madri...@googlegroups.com, grailsEnCastellano
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.


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.





--
Álvaro Sánchez-Mariscal
902 110 530 ext. 2
alvaro....@salenda.es

Álvaro Sánchez-Mariscal

unread,
May 28, 2013, 4:20:58 AM5/28/13
to madri...@googlegroups.com
Por cierto, evita el cross posting por favor :(


2013/5/28 Álvaro Sánchez-Mariscal <alvaro....@salenda.es>

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. 

Marcin Gryszko

unread,
May 28, 2013, 4:32:59 AM5/28/13
to madri...@googlegroups.com
No es un problema trivial, hay un libro dedicado exclusivamente a ello: Trees and Hierarchies in SQL for Smarties


Marcin Gryszko      


2013/5/28 Álvaro Sánchez-Mariscal <alvaro....@salenda.es>

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:50:27 AM5/28/13
to madri...@googlegroups.com
El 28 de mayo de 2013 10:32, Marcin Gryszko <mar...@grysz.com> escribió:
No es un problema trivial, hay un libro dedicado exclusivamente a ello: Trees and Hierarchies in SQL for Smarties


Muchas gracias por el enlace, Marcin, . Apuntado para echarle un vistazo 

Alfredo Casado

unread,
May 28, 2013, 4:51:32 AM5/28/13
to madri...@googlegroups.com
Como dice marcin no es un problema trivial guardar estructuras jerarquicas en SQL (porque supongo que usas sql que no lo dices, tampoco dices cual es el problema, ¿no sabes como guardar la información?, ¿no sabes como consultarla pero no puedes cambiar la forma en la que se guarda?, ¿puedes cambiar tanto la forma en la guarda como la forma en la que se consulta?).

No son problemas aislados, en función de como necesites recuperar la información hay distintas estrategias para guardarla, en este post tienes un resumen: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/, en el libro que pone marcin tienes la misma información mucho más ampliada.

Tampoco dices que motor de bd usas, mysql?, si por ejemplo usaras oracle este tiene un constructor especifico para hacer querys jerarquicas que va como un tiro: http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm.

Otra opción es usar un enfoque de persistencia que se adapte mejor a estas estructuras, por ejemplo una bd de grafos (node4j) o bien una documental (mongo o couch) se ajustan mucho mejor a este problema que una bd sql.

Marcin Gryszko

unread,
May 28, 2013, 4:56:42 AM5/28/13
to madri...@googlegroups.com
Uno de las resenas del libro dice que en la 2. edicion todas las soluciones son aplicables para MySQL (quitando el keyword ATOMIC).

Marcin Gryszko      


2013/5/28 Alfredo Casado <casado....@gmail.com>

Alberto Vilches

unread,
May 28, 2013, 5:03:44 AM5/28/13
to madri...@googlegroups.com
Mira, a lo mejor te sirve este snippet que usamos nosotros (cosecha propia, nada del otro mundo). No hacemos cargas recursivas contra la base de datos, sino que cargamos todos los elementos de una tacada y luego montamos el árbol entero en memoria.

A este método le pasas una colección de objetos (de dominio, Expandos, mapas, etc) y te monta el árbol entero. Necesita una propiedad id, otra con el id del padre y luego te crea una propiedad children con los hijos.

    static def unflatten(def flattenChildren, String parentIdProperty = "parentId", String childrenProperty = "children") {
        def childrenByParent = flattenChildren.groupBy { cat -> cat."${parentIdProperty}" }
        flattenChildren.each { cat ->  cat."${childrenProperty}" = childrenByParent[cat.id] ?: [] }
        childrenByParent[null]
    }



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.


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!

jmiguel rodriguez

unread,
May 28, 2013, 5:25:06 AM5/28/13
to madri...@googlegroups.com
Hola Alfredo,

El día 28 de mayo de 2013 10:51, Alfredo Casado
<casado....@gmail.com> escribió:
> Como dice marcin no es un problema trivial guardar estructuras jerarquicas
> en SQL (porque supongo que usas sql que no lo dices, tampoco dices cual es
> el problema, ¿no sabes como guardar la información?, ¿no sabes como
> consultarla pero no puedes cambiar la forma en la que se guarda?, ¿puedes
> cambiar tanto la forma en la guarda como la forma en la que se consulta?).

Si, la idea es recuperar via SQL. Mejor aún si fuera mas 'groovy' pero
no es imprescindible. Guardar sabemos, y recuperar tambien... pero de
forma recursiva. Eso implicaria que para paginar habria que recrear
por cada pagina el arbol a mano y buscar el 'principio' de pagina y
final. No es un sistema muy flexible.

> http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/, en el
> libro que pone marcin tienes la misma información mucho más ampliada.

Oook, otra cosa para mirar, thank you.

> Tampoco dices que motor de bd usas, mysql?, si por ejemplo usaras oracle
> este tiene un constructor especifico para hacer querys jerarquicas que va
> como un tiro:
> http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm.

Actualmente, postgres. No seria gran problema pasar a mySql (o
MariaDB). Oracle llevamos mucho tiempo con el y justo para este
proyecto 'nos estamos quitando' ;-)

Gracias!
Reply all
Reply to author
Forward
0 new messages