Home | Wiki | OI 1.x Docs | OI 2.x Docs OI logo

NAME

OpenInteract2::ResultsManage - Save and retrieve generic search results

SYNOPSIS

 use OpenInteract2::ResultsManage;
 
 # Basic usage
 
 ... perform search ...
 
 my $results = OpenInteract2::ResultsManage->new();
 $results->save( \@id_list );
 $request->session->{this_search_id} = $results->{search_id};
 
 ... another request from this user ...
 
 my $results = OpenInteract2::ResultsManage->new({
                              search_id => $R->{session}{this_search_id} });
 my $result_list = $results->retrieve();
 
 # Use with paged results
 
 my $results = OpenInteract2::ResultsManage->new();
 $results->save( \@id_list );
 $request->session->{this_search_id} = $results->{search_id};
 my $page_num = $R->apache->param( 'pagenum' );
 my ( $min, $max ) = $results->find_page_boundaries( $page_num, $HITS_PER_PAGE );
 my ( $results, $total_count ) = $results->retrieve({ min => $min, max => $max } );
 my $total_pages = $results->find_total_page_count( $HITS_PER_PAGE );
 my $total_hits = $results->{num_records};
 
 # Can now print "Page $page_num of $total_pages" or you
 # can pass this information to the template and use the
 # 'page_count' component and pass it 'total_pages',
 # 'current_pagenum', and a 'url' to get back to this page:
 
 [%- PROCESS page_count( total_pages     = 5,
                         current_pagenum = 3,
                         url             = url ) -%]
 
 Displays:
 
 Page [<<] [1] [2] 3 [4] [5] [>>]
 
 (Where the items enclosed by '[]' are links.)

DESCRIPTION

This class has methods to enable you to easily create paged result lists. This includes saving your results to disk, retrieving them easily and some simple calculation functions for page number determination.

PUBLIC METHODS

The following methods are public and available for OpenInteract application developers.

save( $stuff_to_save, \%params )

Saves a list of things to be retrieved later. The $stuff_to_save can be an arrayref of ID values (simple scalars), an arrayref of SPOPS objects, or an SPOPS::Iterator implementation all primed and ready to go. If objects are passed in via a list or an iterator, we call ->id() on each to get the ID value to save.

If objects are used, we also query each one for its class and save that information in the search results. Whether you have a homogenous resultset or not affects the return values. If it is a homogenous resultset we note the class for all objects in the search results metadata, which is saved in a separate file from the results themselves. This enables us to create an iterator from the results if needed.

Parameters:

Returns: an ID you can use to retrieve the search results using the retrieve() or retrieve_iterator() methods. If you misplace the ID, you cannot get the search results back.

Side effects: the ID returned is also saved in the 'search_id' key of the object itself.

Example:

 my $results = OpenInteract2::ResultsManage->new();
 my $search_id = $results->save({ \@results,
                                  { force_mixed => 1,
                                    extra       => \@extra_info,
                                    extra_name  => [ 'hit_count', 'weight' ] });

The following parameters are set in the object after a successful results save:

 search_id
 num_records

Returns: the ID of the search just saved.

retrieve( $search_id, \%params )

Retrieve previously saved search results using the parameter 'search_id' which should be set on initialization or before this method is run.

Parameters:

Returns:

Note: The interface for this method may change, and we might split apart the different return results into two methods (particularly whether classes are involved).

Also sets the object parameters:

'num_records' - total number of results in the original search

'date' - date the search was run

'num_extra' - number of 'extra' records saved

'extra_name' (\@) - list of fields matching extra values saved

retrieve_iterator( $search_id, \%params )

Retrieves an iterator to walk the results. You can use min/max to pre-separate or you can simply grab all the results and screen them out yourself.

Parameters: same as retrieve()

find_total_page_count( $records_per_page, [ $num_records ] )

If called as an object then use 'num_records' property of object. If 'num_records' is not in the object, or if you call this as a class method, then we use the second parameter for the total number of records.

Returns: Number of pages required to display $num_records at $records_per_page.

Example:

 my $page_count = $class->find_total_page_count( 289, 25 );
 # $page_count = 11
 
 my $page_count = $class->find_total_page_count( 289, 75 );
 # $page_count = 4

find_page_boundaries( $page_number, $records_per_page )

Returns: An array with the floor and ceiling values to display the given page with $records_per_page on the page.

Example:

 my ( $min, $max ) = $class->find_page_boundaries( 3, 75 );
 # $min is 226, $max is 300
 my ( $min, $max ) = $class->find_page_boundaries( 12, 25 );
 # min is 301, $max is 325

INTERNAL METHODS

build_results_filename()

generate_search_id()

results_lock()

results_unlock()

results_clear()

retrieve_raw_results()

DATA FORMAT

Here is an example of a saved resultset. This one happens to be generated by the OpenInteract2::FullText module.

 Thu Jul 12 17:19:05 2001-->3-->-->1-->fulltext_score
 -->3d5676e0af1f1cc6b539fb08a5ee67b7-->2
 -->c3d72c3c568d99a796b23e8efc75c00f-->1
 -->8f10f3a91c3f10c876805ab1d76e1b94-->1

Here are all the pieces:

First, the separator is -->. This is configurable in this module.

Second, the first line has:

Third, the second and remaining line have three pieces:

BUGS

None known, although the API may change in the near future.

TO DO

Review API

The API is currently unstable but should solidify quickly as we get more use out of this module.

 - Keep 'mixed' stuff in there, or maybe always treat the resultset as
 potentially heterogeneous objects?
 - Test with saving different types of non-object data as well as
 objects and see if the usage holds up (including with the
 ResultsIterator).

Objectify?

Think about creating a 'search_results' object that can access the resultset along with metadata about the results (number of items, time searched, etc.). This would likely prove easier to work with in the future.

What would also be interesting is combine this with the interface for SPOPS::Iterator and the currently impelemented OpenInteract2::ResultsIterator, so we could do something like:

 my $search = OpenInteract2::ResultsManage->new( $search_id );
 print "Search initially run: $search->{search_date}\n",
       "Number of results: $search->{num_records}\n";
 $search->set_min( 10 );
 $search->set_max( 25 );
 while ( my $obj = $search->get_next ) {
   print "Object retrieved is a ", ref $obj, " with ID ", $obj->id, "\n";
 }

COPYRIGHT

Copyright (c) 2001-2003 Chris Winters. All rights reserved.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

AUTHORS

Chris Winters <chris@cwinters.com>

Generated from the OpenInteract 1.99_03 source.


Home | Wiki | OI 1.x Docs | OI 2.x Docs
SourceForge Logo