Index: openacs-4/packages/xowiki/tcl/folder-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/folder-procs.tcl,v diff -u -r1.27.2.11 -r1.27.2.12 --- openacs-4/packages/xowiki/tcl/folder-procs.tcl 19 Mar 2015 10:15:12 -0000 1.27.2.11 +++ openacs-4/packages/xowiki/tcl/folder-procs.tcl 23 Mar 2015 11:54:42 -0000 1.27.2.12 @@ -55,10 +55,32 @@ return [$tree render -style yuitree -js $js] } + folders instproc folder_query { + -form_id:required + -package_id:required + {-parent_id ""} + } { + if {$parent_id eq ""} { + return [subst { + select * from xowiki_form_instance_item_view + where page_template = '$form_id' and package_id = '$package_id' + and publish_status = 'ready' + }] + } + return [subst { + select * from xowiki_form_instance_children ch + left join xowiki_form_instance_attributes xa on (ch.item_id = xa.item_id) + where page_template = '$form_id' and package_id = '$package_id' + and root_item_id = '$parent_id' + and publish_status = 'ready' + }] + } + folders instproc collect_folders { -package_id:required -folder_form_id:required -link_form_id:required + {-parent_id ""} {-subtree_query ""} {-depth 3} } { @@ -70,17 +92,25 @@ # # get folders # - set folder_pages [::xowiki::FormPage get_form_entries \ - -base_item_ids $folder_form_id -form_fields "" \ - -extra_where_clause $subtree_query \ - -publish_status ready -package_id $package_id] + set sql [my folder_query -form_id $folder_form_id \ + -parent_id $parent_id \ + -package_id $package_id] + ns_log notice "folder_pages:\n$sql" + set folder_pages [::xowiki::FormPage instantiate_objects -sql $sql \ + -named_objects true -object_named_after "item_id" \ + -object_class ::xowiki::FormPage -initialize true] + # # get links # - set links [::xowiki::FormPage get_form_entries \ - -base_item_ids $link_form_id -form_fields "" \ - -extra_where_clause $subtree_query \ - -publish_status ready -package_id $package_id] + set sql [my folder_query -form_id $link_form_id \ + -parent_id $parent_id \ + -package_id $package_id] + ns_log notice "links:\n$sql" + set links [::xowiki::FormPage instantiate_objects -sql $sql \ + -named_objects true -object_named_after "item_id" \ + -object_class ::xowiki::FormPage -initialize true] + #my msg "[llength [$links children]] links" set folders [$folder_pages children] @@ -101,28 +131,10 @@ # we found a cross-package link. These kind of links require further queries # set target [$l get_target_from_link_page] - - # the following clause needs an oracle counter-part - if {[::xo::pg_version] < 9} { - set tree_sortkey [::xo::dc get_value get_tree_sort_key \ - "select tree_sortkey from acs_objects where object_id = [$target item_id]"] - set extra_where "and bt.item_id in (select object_id from acs_objects \ - where tree_sortkey between '$tree_sortkey' and tree_right('$tree_sortkey') \ - and object_type = 'content_item')" - } else { - ns_log notice "$target item_id = [$target item_id]" - set root_node [$target item_id] - set extra_where "and bt.item_id in ( - With RECURSIVE child_items AS ( - select item_id from cr_items where item_id = $root_node - UNION ALL - select ci.item_id from cr_items ci, child_items where ci.parent_id = child_items.item_id - ) select item_id from child_items)" - } - set sub_folders [my collect_folders -package_id [$target physical_package_id] \ -folder_form_id $folder_form_id -link_form_id $link_form_id \ - -subtree_query $extra_where -depth [expr {$depth -1}]] + -parent_id [$target item_id] \ + -depth [expr {$depth -1}]] foreach f $sub_folders { @@ -141,12 +153,12 @@ # TODO we could save the double-fetch by collecing in # get_form_entries via item-ids, not via new-objects # - ::xo::db::CrClass get_instance_from_db -item_id [$f item_id] + #::xo::db::CrClass get_instance_from_db -item_id [$f item_id] [$f item_id] set_resolve_context -package_id [$l package_id] -parent_id [$l item_id] } else { #my msg "2 found child [$f name] and reset parent_id from [$f parent_id] to [$f parent_id], package id [$l package_id]" $f set_resolve_context -package_id [$l package_id] -parent_id [$f parent_id] - ::xo::db::CrClass get_instance_from_db -item_id [$f item_id] + #::xo::db::CrClass get_instance_from_db -item_id [$f item_id] [$f item_id] set_resolve_context -package_id [$l package_id] -parent_id [$f parent_id] }