Index: openacs-4/packages/search/search.info
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/search/search.info,v
diff -u -r1.48 -r1.49
--- openacs-4/packages/search/search.info	21 Nov 2024 12:49:29 -0000	1.48
+++ openacs-4/packages/search/search.info	21 Nov 2024 14:51:39 -0000	1.49
@@ -9,7 +9,7 @@
     <implements-subsite-p>f</implements-subsite-p>
     <inherit-templates-p>t</inherit-templates-p>
 
-    <version name="6.0.0d1" url="http://openacs.org/repository/download/apm/search-6.0.0d1.apm">
+    <version name="6.0.0d2" url="http://openacs.org/repository/download/apm/search-6.0.0d2.apm">
         <owner url="http://openacs.org">OpenACS</owner>
         <summary>Site wide search</summary>
         <release-date>2024-09-02</release-date>
@@ -18,7 +18,7 @@
         <license>GPL version 2</license>
         <maturity>3</maturity>
 
-        <provides url="search" version="6.0.0d1"/>
+        <provides url="search" version="6.0.0d2"/>
         <requires url="acs-service-contract" version="5.10.1"/>
         <requires url="acs-tcl" version="5.10.1"/>
         <requires url="acs-templating" version="5.10.1"/>
Index: openacs-4/packages/search/tcl/search-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/search/tcl/search-procs.tcl,v
diff -u -r1.61 -r1.62
--- openacs-4/packages/search/tcl/search-procs.tcl	21 Nov 2024 13:27:49 -0000	1.61
+++ openacs-4/packages/search/tcl/search-procs.tcl	21 Nov 2024 14:51:39 -0000	1.62
@@ -18,11 +18,11 @@
                   || [acs_sc_binding_exists_p FtsContentProvider $object_type]}]
 }
 
-ad_proc -public search::object_index {
+ad_proc -public search::object_datasource {
     -object_id:required
-    {-event "UPDATE"}
 } {
-    Indexes an object by invoking the proper datasource and callbacks.
+    Obtains the datasource for an object by invoking the proper
+    datasource and callbacks.
 
     @return datasource as dict
 } {
@@ -57,12 +57,30 @@
                          -impl $object_type]
     }
 
+    return [array get d]
+}
+
+ad_proc -public search::object_index {
+    -object_id:required
+    {-event "UPDATE"}
+} {
+    Indexes an object by invoking the proper datasource and callbacks.
+
+    @return datasource as dict
+} {
+    array set d [search::object_datasource -object_id $object_id]
+    if {[array size d] == 0} {
+        return
+    }
+
     search::content_get txt \
         $d(content) \
         $d(mime) \
         $d(storage_type) \
         $object_id
 
+    set driver [search::driver_name]
+
     if {[callback::impl_exists -callback search::index -impl $driver]} {
         callback -impl $driver search::index \
             -object_id $object_id \
@@ -85,6 +103,8 @@
             -impl $driver
     }
 
+    set object_type [acs_object_type $object_id]
+
     #
     # Call the action so other people who do indexey things have a
     # hook.
@@ -123,6 +143,26 @@
 
 }
 
+ad_proc -public search::object_url {
+    -object_id:required
+} {
+    Retrieves the object URL by invoking the proper callbacks.
+
+    @return URL
+} {
+    set object_type [acs_object_type $object_id]
+
+    if {[callback::impl_exists -impl $object_type -callback search::url]} {
+	return [callback -impl $object_type search::url -object_id $object_id]
+    } else {
+	return [acs_sc::invoke \
+                    -contract FtsContentProvider \
+                    -operation url \
+                    -call_args [list $object_id] \
+                    -impl $object_type]
+    }
+}
+
 ad_proc -public search::queue {
     -object_id
     -event
Index: openacs-4/packages/search/tcl/test/search-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/search/tcl/test/search-procs.tcl,v
diff -u -r1.5 -r1.6
--- openacs-4/packages/search/tcl/test/search-procs.tcl	21 Nov 2024 13:27:49 -0000	1.5
+++ openacs-4/packages/search/tcl/test/search-procs.tcl	21 Nov 2024 14:51:39 -0000	1.6
@@ -224,6 +224,8 @@
     -cats {api smoke} \
     -procs {
         search::searchable_type_p
+        search::object_datasource
+        search::object_url
         search::object_index
         search::object_unindex
     } \
@@ -254,12 +256,27 @@
                 order by object_type asc
             }]] {
                 lassign $sample object_id object_type
-                set datasource [search::object_index -object_id $object_id]
 
+                set datasource [search::object_datasource -object_id $object_id]
+
                 aa_true \
                     "Object '$object_id' of type '$object_type' will return a non null datasource" \
                     [llength $datasource]
 
+                set datasource [search::object_index -object_id $object_id]
+
+                aa_true \
+                    "Object '$object_id' of type '$object_type' will return a non null datasource after index" \
+                    [llength $datasource]
+
+                set url [search::object_url -object_id $object_id]
+
+                aa_false \
+                    "Object '$object_id' produces a valid URL -> $url" \
+                    [catch {
+                        ns_parseurl $url
+                    }]
+
                 aa_false "Unindexing does not bomb." [catch {
                     search::object_unindex -object_id $object_id
                 }]
Index: openacs-4/packages/search/www/search.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/search/www/search.tcl,v
diff -u -r1.43 -r1.44
--- openacs-4/packages/search/www/search.tcl	11 Sep 2024 06:15:54 -0000	1.43
+++ openacs-4/packages/search/www/search.tcl	21 Nov 2024 14:51:39 -0000	1.44
@@ -134,13 +134,7 @@
 
 if { $t eq [_ search.Feeling_Lucky] && $result(count) > 0} {
     set object_id [lindex $result(ids) 0]
-    set object_type [acs_object_type $object_id]
-    if {[callback::impl_exists -impl $object_type -callback search::url]} {
-	set url [callback -impl $object_type search::url -object_id $object_id]
-    } else {
-	set url [acs_sc::invoke -contract FtsContentProvider -operation url \
-		     -call_args [list $object_id] -impl $object_type]
-    }
+    set url [search::object_url -object_id $object_id]
     ad_returnredirect $url
     ad_script_abort
 }
@@ -177,18 +171,16 @@
 
 foreach object_id $result(ids) {
     if {[catch {
-        set object_type [acs_object_type $object_id]
-        if {[callback::impl_exists -impl $object_type -callback search::datasource]} {
-            array set datasource [lindex [callback -impl $object_type search::datasource -object_id $object_id] 0]
-            set url_one [lindex [callback -impl $object_type search::url -object_id $object_id] 0]
-        } else {
-            #ns_log warning "SEARCH search/www/search.tcl callback::datasource::$object_type not found"
-            array set datasource [acs_sc::invoke -contract FtsContentProvider -operation datasource \
-				      -call_args [list $object_id] -impl $object_type]
-            set url_one [acs_sc::invoke -contract FtsContentProvider -operation url \
-			     -call_args [list $object_id] -impl $object_type]
-        }
-        search::content_get txt $datasource(content) $datasource(mime) $datasource(storage_type) $object_id
+        array set datasource [search::object_datasource -object_id $object_id]
+
+        set url_one [search::object_url -object_id $object_id]
+
+        search::content_get txt \
+            $datasource(content) \
+            $datasource(mime) \
+            $datasource(storage_type) \
+            $object_id
+
         if {[callback::impl_exists -impl $driver -callback search::summary]} {
             set title_summary [lindex [callback -impl $driver search::summary -query $q -text $datasource(title)] 0]
             set txt_summary [lindex [callback -impl $driver search::summary -query $q -text $txt] 0]
@@ -199,7 +191,7 @@
 				 -call_args [list $q $txt] -impl $driver]
         }
     } errmsg]} {
-        ns_log error "search.tcl object_id $object_id object_type $object_type error $errmsg"
+        ns_log error "search.tcl object_id $object_id object_type [acs_object_type $object_id] error $errmsg"
     } else {
         template::multirow append searchresult $title_summary $txt_summary $url_one
     }