--- trunk/Estraier.pm 2006/03/12 15:20:06 112 +++ trunk/Estraier.pm 2006/05/06 21:38:14 126 @@ -4,7 +4,7 @@ use strict; use warnings; -our $VERSION = '0.04'; +our $VERSION = '0.06_1'; =head1 NAME @@ -599,6 +599,35 @@ } +=head2 set_skip + +Set number of skipped documents from beginning of results + + $cond->set_skip(42); + +Similar to C in RDBMS. + +=cut + +sub set_skip { + my $self = shift; + $self->{skip} = shift; +} + +=head2 skip + +Return skip for this condition. + + print $cond->skip; + +=cut + +sub skip { + my $self = shift; + return $self->{skip}; +} + + package Search::Estraier::ResultDocument; use Carp qw/croak/; @@ -1444,6 +1473,56 @@ return new Search::Estraier::NodeResult( docs => \@docs, hints => $hints ); } +=head2 search_new + +Better implementation of search by Robert Klep + +=cut + +sub search_new { + my $self = shift; + my ($cond, $depth) = @_; + return unless ($cond && defined($depth) && $self->{url}); + croak "cond mush be Search::Estraier::Condition, not '$cond->isa'" unless ($cond->isa('Search::Estraier::Condition')); + croak "depth needs number, not '$depth'" unless ($depth =~ m/^\d+$/); + + my $resbody; + + my $rv = $self->shuttle_url( $self->{url} . '/search', + 'application/x-www-form-urlencoded', + $self->cond_to_query( $cond, $depth ), + \$resbody, + ); + return if ($rv != 200); + + my @records = split /--------\[.*?\]--------(?::END)?\r?\n/, $resbody; + my $hintsText = splice @records, 0, 2; # starts with empty record + my $hints = { $hintsText =~ m/^(.*?)\t(.*?)$/gsm }; + + # process records + my $docs; + foreach my $record (@records) + { + # split into keys and snippets + my ($keys, $snippet) = $record =~ m/^(.*?)\n\n(.*?)$/s; + + # create document hash + my $doc = { $keys =~ m/^(.*?)=(.*?)$/gsm }; + $doc->{'@keywords'} = $doc->{keywords}; + ($doc->{keywords}) = $keys =~ m/^%VECTOR\t(.*?)$/gm; + $doc->{snippet} = $snippet; + + push @$docs, new Search::Estraier::ResultDocument( + attrs => $doc, + uri => $doc->{'@uri'}, + snippet => $snippet, + keywords => $doc->{'keywords'}, + ); + } + + return new Search::Estraier::NodeResult( docs => $docs, hints => $hints ); +} + =head2 cond_to_query @@ -1490,6 +1569,7 @@ push @args, 'wwidth=' . $self->{wwidth}; push @args, 'hwidth=' . $self->{hwidth}; push @args, 'awidth=' . $self->{awidth}; + push @args, 'skip=' . $self->{skip} if ($self->{skip}); return join('&', @args); }