From: Chris W. <la...@us...> - 2004-10-05 03:08:41
|
Update of /cvsroot/openinteract/OpenInteract2/lib/OpenInteract2/Action In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20853/Action Modified Files: CommonSearch.pm Log Message: OIN-63: ensure that CommonSearch, RsultsManage, ResultsIterator all play nice together (passing the right parameters, etc.); update logging Index: CommonSearch.pm =================================================================== RCS file: /cvsroot/openinteract/OpenInteract2/lib/OpenInteract2/Action/CommonSearch.pm,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** CommonSearch.pm 15 Jun 2004 00:02:21 -0000 1.14 --- CommonSearch.pm 5 Oct 2004 03:08:25 -0000 1.15 *************** *** 51,105 **** my %tmpl_params = (); - my $req = CTX->request; my $is_paged = $self->param( 'c_search_results_paged' ); if ( $is_paged eq 'yes' ) { ! my $search_id = $req->param( 'search_id' ); ! my $results = OpenInteract2::ResultsManage->new(); ! ! # If the search has been run before, just set the ID ! ! if ( $search_id ) { ! $log->is_debug && ! $log->debug( "Retrieving search for ID [$search_id]" ); ! $results->{search_id} = $search_id; ! } ! ! # Otherwise, run the search and get an iterator back, then ! # pass the iterator to ResultsManage so we can reuse the ! # results ! ! else { ! $log->is_debug && ! $log->debug( "Running search for the first time" ); ! my $iterator = eval { ! $self->_search_build_and_run({ is_paged => 'yes' }) ! }; ! $self->_search_catch_errors( "$@" ); ! $results->save( $iterator ); ! $log->is_debug && ! $log->debug( "Search ID [$results->{search_id}]" ); ! } ! ! if ( $results->{search_id} ) { ! my $this_page = $req->param( 'page_num' ) || 1; ! my $hits_per_page = $self->param( 'c_search_results_page_size' ); ! my ( $min, $max ) = ! $results->find_page_boundaries( $this_page, $hits_per_page ); ! $tmpl_params{iterator} = $results->retrieve( ! { min => $min, ! max => $max, ! return => 'iterator' }); ! $tmpl_params{page_num} = $this_page; ! $tmpl_params{total_pages} = $results->find_total_page_count( $hits_per_page ); ! $tmpl_params{total_hits} = $results->{num_records}; ! $tmpl_params{search_id} = $results->{search_id}; ! $log->is_debug && ! $log->debug( "Search info: min: ($min); max: ($max)", ! "records ($results->{num_records})" ); ! } ! else { ! $log->warn( "No search ID from results, creating empty iterator" ); ! $tmpl_params{iterator} = SPOPS::Iterator->from_list( [] ); ! } } --- 51,57 ---- my %tmpl_params = (); my $is_paged = $self->param( 'c_search_results_paged' ); if ( $is_paged eq 'yes' ) { ! %tmpl_params = $self->_search_retrieve_paged_results; } *************** *** 108,111 **** --- 60,65 ---- else { + $log->is_debug && + $log->debug( "Search results not paged, using basic iterator" ); $tmpl_params{iterator} = eval { $self->_search_build_and_run( \%tmpl_params ) *************** *** 121,124 **** --- 75,133 ---- } + sub _search_retrieve_paged_results { + my ( $self ) = @_; + $log->is_debug && $log->debug( "Search results will be paged" ); + my %display = (); + + my $req = CTX->request; + my $search_id = $req->param( 'search_id' ); + my $results = OpenInteract2::ResultsManage->new(); + + # If the search has been run before, just set the ID + + if ( $search_id ) { + $log->is_debug && + $log->debug( "Retrieving search for ID '$search_id'" ); + $results->{search_id} = $search_id; + } + + # Otherwise, run the search and get an iterator back, then pass + # the iterator to ResultsManage so we can reuse the results + + else { + $log->is_debug && + $log->debug( "Running search for the first time" ); + my $iterator = eval { + $self->_search_build_and_run({ is_paged => 'yes' }) + }; + $self->_search_catch_errors( "$@" ); + $results->save( $iterator ); + $log->is_debug && + $log->debug( "Got search ID from stored results '$results->{search_id}'" ); + } + + if ( $results->{search_id} ) { + my $this_page = $req->param( 'page_num' ) || 1; + my $hits_per_page = $self->param( 'c_search_results_page_size' ); + my ( $min, $max ) = + $results->find_page_boundaries( $this_page, $hits_per_page ); + $display{iterator} = $results->retrieve({ + min => $min, + max => $max, + return_type => 'iterator' }); + $display{page_num} = $this_page; + $display{total_pages} = $results->find_total_page_count( $hits_per_page ); + $display{total_hits} = $results->{num_records}; + $display{search_id} = $results->{search_id}; + $log->is_debug && $log->debug( "Search info: [min: $min] [max: $max] ", + "[records: $results->{num_records}]" ); + } + else { + $log->warn( "No search ID from results, creating empty iterator" ); + $display{iterator} = SPOPS::Iterator->from_list( [] ); + } + return %display; + } + my %DEFAULTS = ( *************** *** 187,191 **** if ( $caught =~ /^CAP: (.*)$/ ) { $msg = join( '', "Your search has returned too many ", ! "results. ($1) Please try again." ); $task = $self->param( 'c_search_results_cap_fail_task' ); } --- 196,200 ---- if ( $caught =~ /^CAP: (.*)$/ ) { $msg = join( '', "Your search has returned too many ", ! "results ($1). Please try again." ); $task = $self->param( 'c_search_results_cap_fail_task' ); } *************** *** 209,213 **** my $object_class = $self->param( 'c_object_class' ); ! # TODO: This is kind of yucky -- run the same search twice? my @tables = $self->param( 'c_search_query_tables' ); --- 218,222 ---- my $object_class = $self->param( 'c_object_class' ); ! # TODO: This is kind of (!!!) yucky -- run the same search twice? my @tables = $self->param( 'c_search_query_tables' ); *************** *** 215,223 **** my @values = $self->param( 'c_search_query_values' ); if ( my $num_limit_results = $self->param( 'c_search_results_cap' ) ) { ! my $row = eval { $object_class->db_select({ select => [ 'count(*)' ], ! from => \@tables, ! where => $where, ! value => \@values, ! return => 'single' }) }; if ( $row->[0] > $num_limit_results ) { oi_error "CAP: $row->[0] > $num_limit_results"; --- 224,235 ---- my @values = $self->param( 'c_search_query_values' ); if ( my $num_limit_results = $self->param( 'c_search_results_cap' ) ) { ! my $row = eval { ! $object_class->db_select({ ! select => [ 'count(*)' ], ! from => \@tables, ! where => $where, ! value => \@values, ! return => 'single' }) ! }; if ( $row->[0] > $num_limit_results ) { oi_error "CAP: $row->[0] > $num_limit_results"; *************** *** 229,243 **** my $order = $self->param( 'c_search_results_order' ); my $additional_params = $self->_search_additional_params || {}; ! my $iter = eval { $object_class->fetch_iterator({ ! from => \@tables, ! where => $where, ! value => \@values, ! limit => $limit, ! order => $order, ! %{ $additional_params } }) }; if ( $@ ) { $log->error( "Search failed: $@" ); oi_error $@; } return $iter; } --- 241,259 ---- my $order = $self->param( 'c_search_results_order' ); my $additional_params = $self->_search_additional_params || {}; ! my $iter = eval { ! $object_class->fetch_iterator({ ! from => \@tables, ! where => $where, ! value => \@values, ! limit => $limit, ! order => $order, ! %{ $additional_params } }) ! }; if ( $@ ) { $log->error( "Search failed: $@" ); oi_error $@; } + $log->is_info && + $log->info( "Got iterator from '$object_class' given query params" ); return $iter; } *************** *** 412,420 **** $log->is_debug && $log->debug( join( "\n", ! "Built: ", ! " FROM: " . join( ', ', $self->param( 'c_search_query_tables' ) ), " WHERE: " . join( ' AND ', $self->param( 'c_search_query_where' ) ), ! " VALUES:" . join( ', ', $self->param( 'c_search_query_values' ) ), ) ); return $self; --- 428,436 ---- $log->is_debug && $log->debug( join( "\n", ! "Built SQL chunks: ", ! " FROM: " . join( ', ', $self->param( 'c_search_query_tables' ) ), " WHERE: " . join( ' AND ', $self->param( 'c_search_query_where' ) ), ! " VALUES: " . join( ', ', $self->param( 'c_search_query_values' ) ), ) ); return $self; |