--- trunk/lib/WebPAC/Search/Estraier.pm 2005/11/23 21:53:01 123 +++ trunk/lib/WebPAC/Search/Estraier.pm 2006/01/07 01:40:01 343 @@ -3,7 +3,7 @@ use warnings; use strict; -use HyperEstraier; +use Search::Estraier; use Text::Iconv; use Data::Dumper; @@ -13,11 +13,11 @@ =head1 VERSION -Version 0.02 +Version 0.06 =cut -our $VERSION = '0.02'; +our $VERSION = '0.06'; =head1 SYNOPSIS @@ -31,7 +31,8 @@ Connect to Hyper Estraier index using HTTP my $est = new WebPAC::Search::Estraier( - url => 'http://localhost:1978/node/webpac2', + masterurl => 'http://localhost:1978/', + database => 'webpac2', user => 'admin', passwd => 'admin', encoding => 'iso-8859-2', @@ -42,10 +43,14 @@ =over 4 -=item url +=item maseterurl URI to C node +=item database + +name of C node + =item user C user with read rights @@ -76,14 +81,18 @@ my $log = $self->_get_logger; - foreach my $p (qw/url user passwd/) { + foreach my $p (qw/masterurl user passwd/) { $log->logdie("need $p") unless ($self->{$p}); } + my $url = $self->{masterurl} . '/node/' . $self->{database}; + $self->{url} = $url; + $log->info("opening Hyper Estraier index $self->{'url'} as $self->{'user'}"); - $self->{'db'} = HyperEstraier::Node->new($self->{'url'}); - $self->{'db'}->set_auth($self->{'user'}, $self->{'passwd'}); + $self->{db} = Search::Estraier::Node->new; + $self->{db}->set_url($self->{'url'}); + $self->{db}->set_auth($self->{'user'}, $self->{'passwd'}); my $encoding = $self->{'encoding'} || 'ISO-8859-2'; $log->info("using encoding $encoding"); @@ -109,6 +118,8 @@ order => 'NUMD', max => 100, options => $HyperEstraier::Condition::SURE, + page => 42, + depth => 0, ); Options are close match to Hyper Estraier API, except C which defines @@ -116,6 +127,8 @@ Results are returned as hash array with keys named by attributes +Pages are numbered C< 1 ... hits/max >. + =cut sub search { @@ -125,6 +138,8 @@ my $log = $self->_get_logger; + #$log->debug( 'search args: ' . Dumper($args) ); + $self->confess('need db in object') unless ($self->{db}); $self->confess('need get_attr') unless ($args->{get_attr}); @@ -134,7 +149,7 @@ $log->debug("args: " . Dumper( $args )); - my $cond = HyperEstraier::Condition->new(); + my $cond = Search::Estraier::Condition->new(); if ( ref($args->{add_attr}) eq 'ARRAY' ) { $log->debug("adding search attributes: " . join(", ", @{ $args->{add_attr} }) ); map { @@ -144,11 +159,19 @@ }; $cond->set_phrase( $self->{iconv}->convert($q) ) if ($q); - $cond->set_max( $args->{max} ) if ($args->{max}); $cond->set_options( $args->{options} ) if ($args->{options}); $cond->set_order( $args->{order} ) if ($args->{order}); - my $result = $self->{db}->search($cond, 0) || + my $max = $args->{max} || 7; + my $page = $args->{page} || 1; + if ($page < 1) { + $log->warn("page number $page < 1"); + $page = 1; + } + + $cond->set_max( $page * $max ); + + my $result = $self->{db}->search($cond, ( $args->{depth} || 0 )) || $log->die("can't search for ", sub { Dumper( $args ) }); my $hits = $result->doc_num; @@ -156,7 +179,7 @@ my @results; - for my $i ( 0 .. ( $hits - 1 ) ) { + for my $i ( (($page - 1) * $max) .. ( $hits - 1 ) ) { #$log->debug("get_doc($i)"); my $doc = $result->get_doc( $i );