[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1395?page=c...
]
Joonas Koivunen commented on HHH-1395:
--------------------------------------
Actually I've found that the post-update event _is_ the way to go.
I'm yet to formulate a proper patch against the Christians version above, but the
solution is:
* add post-load -eventlistener, catch NestedSetNode<?> entities, set a property
"persistentParent"
{code}
if (event.getEntity() instanceof NestedSetNode<?>)
(NestedSetNode)event.getEntity().setPersistentParent(
((NestedSetNode)event.getEntity()).getParent());
{code}
* add post-update -eventlistener, which uses the "persistentParent" property to
first find out whether or not the parent has changed
** if the parent *was* null but is no longer, joins the node into parent's tree (sort
of like insert operation)
** if the parent *was* not null but is null, detaches the node
** if the parent *was* not null but is not null and not same, detaches the node and
joins
The detach operation has 3 operations:
# set new ns_thread and add correction *c* to ns_left and ns_right, where {{long c = 1 -
node.getNsLeft();}}
# fix previous threads nodes TO THE RIGHT (excluding previous parents of node):
#* add correction c to both ns_left and ns_right, where {{long c = -2 *
updatedInThePreviousQuery;}}
# fix previous thread parent hierarchy (all parents in the previous node):
#* add correction c to ns_right (c is the same)
The join operation has 4 operations:
# setup the joined tree:
#* add correction c to both ns_left and ns_right, where {{ long c =
newParent.getNsRight() - 1; }}
# fix up the new parent tree with nodes TO THE RIGHT by the insertion point
#* add correction c to both ns_left and ns_right, where {{ long c = 2 *
updatedInThePreviousQuery;}}
# fix up the new parent trees new parents
#* add correction c to ns_right (c is the same)
# fix the joined tree thread_id as new tree's thread id
Simple as that :) Watch this space for a patch.
Also, if someone was interested in formulating a hibernate-3.5 style tests for this one
maybe perhaps this might get someday into main tree.. I've got no idea how to do
those, as in fact I haven't yet look at any of the tests in the 3.5 series..
Hierarchical entity data management using 'modified preorder
tree traversal algorithm' (nested set trees)
----------------------------------------------------------------------------------------------------------
Key: HHH-1395
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1395
Project: Hibernate Core
Issue Type: New Feature
Components: core, query-hql
Environment: Hibernate 3.1 plus Annotations extending EJB3 implementation
Reporter: James Salt
Attachments: nestedset.tar.gz
Original Estimate: 3 weeks
Remaining Estimate: 3 weeks
An enhancement to allow entities to exist in a managed tree (DAG) structure, via the use
of property annotations and entity annotations. With an extension to the HQL language to
mimic the Oracle recusive query clause.
This would be classically be useful for Bill of Material uses, or any tree like entity
structure.
I have implemented a homebrew approach using the 'adjacency list method' , and a
post persist call back method to set the node path. Although I think a more full blown
optimised algorithm would be the 'modified preorder tree traversal algorithm'.
In the annotations world this could be implemented using an annotation like @Hierarchical
to the entity, with a @Parent (mask for @ManyToOne) annotation on the parent
field/parameter and @Children (mask for @OneToMany) annotation on the list of children
entities.
Then a postupdate method could be implemented for the entity type, that recalculates the
tree meta data -i.e. parent, left and right.
I believe this would be a valuable extension (useful for many common data models) to the
hibernate core product that could be exposed through annotations as I have discussed and
the hbm.xml.
The users of such a system would be aware of the performance implications on
insert/update/delete, but gain a massive performance gain on querying a tree data model.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira