search::indexer (private)

 search::indexer

Defined in packages/search/tcl/search-procs.tcl

Search indexer loops over the existing entries in the search_observer_queue table and calls the appropriate driver functions to index, update, or delete the entry.

Authors:
Neophytos Demetriou
Jeff Davis <davis@xarg.net>

Partial Call Graph (max 5 caller/called nodes):
acs_object_type acs_object_type (public) ad_print_stack_trace ad_print_stack_trace (public) db_exec_plsql db_exec_plsql (public) db_list_of_lists db_list_of_lists (public) search::dequeue search::dequeue (public) search::indexer search::indexer search::indexer->acs_object_type search::indexer->ad_print_stack_trace search::indexer->db_exec_plsql search::indexer->db_list_of_lists search::indexer->search::dequeue

Testcases:
No testcase defined.
Source code:

    set driver [search::driver_name]
    if { $driver eq "" } {
        #
        # Nothing to do if no driver
        #
        return
    }

    # JCD: pull out the rows all at once so we release the handle
    foreach row [db_list_of_lists search_observer_queue_entry {}] {

        # DRB: only do Oracle shit for oracle (doh)
        if { [ns_config "ns/db/drivers" oracle] ne "" } {
            if {[nsv_incr search_static_variables item_counter] > 1000} {
                nsv_set search_static_variables item_counter 0
                db_exec_plsql optimize_intermedia_index {begin
                    ctx_ddl.sync_index ('swi_index');
                    end;
                }
            }
        }

        lassign $row object_id event_date event
        switch -- $event {
            UPDATE -
            INSERT {
                # Don't bother reindexing if we've already inserted/updated this object in this run
                if {![info exists seen($object_id)]} {
                    try {
                        search::object_index  -event $event  -object_id $object_id
                    } on error {errMsg} {
                        ns_log Error "search::indexer: error getting datasource for "  "[acs_object_type $object_id]: $errMsg\n[ad_print_stack_trace]"
                    } on ok {d} {
                        #
                        # Remember seeing this object so we can avoid
                        # reindexing it later.
                        #
                        set seen($object_id) 1
                    }
                }
            }
            DELETE {
                try {
                    search::object_unindex -object_id $object_id
                } on error {errMsg} {
                    ns_log Error "search::indexer: error unindexing $object_id "  "[acs_object_type $object_id]: $errMsg\n[ad_print_stack_trace]"
                }

                #
                # Unset "seen" element since one could conceivably
                # delete one but then subsequently reinsert it (e.g.
                # when rolling back/forward the live revision).
                #
                unset -nocomplain seen($object_id)
            }
        }

        # Don't put that dequeue in a default block of the switch above
        # otherwise objects with insert/update and delete operations in the same
        # run would crash and never get dequeued

        search::dequeue -object_id $object_id -event_date $event_date -event $event
    }
    ns_log notice "SEARCH INDEXER END [clock format [clock seconds]]"
XQL Not present:
PostgreSQL
Generic XQL file:
<fullquery name="search::indexer.search_observer_queue_entry">
    <querytext>
            select object_id, event_date, event
            from search_observer_queue
            order by event_date asc limit 50
        </querytext>
</fullquery>
packages/search/tcl/search-procs.xql

Oracle XQL file:
<fullquery name="search::indexer.search_observer_queue_entry">
    <querytext>
            select object_id, event_date, event
            from search_observer_queue
	    where rownum < 100
            order by event_date asc
        </querytext>
</fullquery>
packages/search/tcl/search-procs-oracle.xql

[ hide source ] | [ make this the default ]
Show another procedure: