--- trunk/Estraier.pm 2006/01/06 13:19:50 51 +++ trunk/Estraier.pm 2006/01/06 20:39:58 55 @@ -645,7 +645,7 @@ sub doc_num { my $self = shift; - return $#{$self->{docs}}; + return $#{$self->{docs}} + 1; } @@ -1095,7 +1095,7 @@ sub name { my $self = shift; - $self->set_info unless ($self->{name}); + $self->_set_info unless ($self->{name}); return $self->{name}; } @@ -1108,7 +1108,7 @@ sub label { my $self = shift; - $self->set_info unless ($self->{label}); + $self->_set_info unless ($self->{label}); return $self->{label}; } @@ -1121,7 +1121,7 @@ sub doc_num { my $self = shift; - $self->set_info if ($self->{dnum} < 0); + $self->_set_info if ($self->{dnum} < 0); return $self->{dnum}; } @@ -1134,7 +1134,7 @@ sub word_num { my $self = shift; - $self->set_info if ($self->{wnum} < 0); + $self->_set_info if ($self->{wnum} < 0); return $self->{wnum}; } @@ -1147,7 +1147,7 @@ sub size { my $self = shift; - $self->set_info if ($self->{size} < 0); + $self->_set_info if ($self->{size} < 0); return $self->{size}; } @@ -1172,12 +1172,104 @@ 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 ), + \$resbody, + ); + return if ($rv != 200); + + my (@docs, $hints); + + my @lines = split(/\n/, $resbody); + return unless (@lines); + + my $border = $lines[0]; + my $isend = 0; + my $lnum = 1; + + while ( $lnum <= $#lines ) { + my $line = $lines[$lnum]; + $lnum++; + + #warn "## $line\n"; + if ($line && $line =~ m/^\Q$border\E(:END)*$/) { + $isend = $1; + last; + } + + if ($line =~ /\t/) { + my ($k,$v) = split(/\t/, $line, 2); + $hints->{$k} = $v; + } + } + + my $snum = $lnum; + + while( ! $isend && $lnum <= $#lines ) { + my $line = $lines[$lnum]; + #warn "# $lnum: $line\n"; + $lnum++; + + if ($line && $line =~ m/^\Q$border\E/) { + if ($lnum > $snum) { + my $rdattrs; + my $rdvector; + my $rdsnippet; + + my $rlnum = $snum; + while ($rlnum < $lnum - 1 ) { + #my $rdline = $self->_s($lines[$rlnum]); + my $rdline = $lines[$rlnum]; + $rlnum++; + last unless ($rdline); + if ($rdline =~ /^%/) { + $rdvector = $1 if ($rdline =~ /^%VECTOR\t(.+)$/); + } elsif($rdline =~ /=/) { + $rdattrs->{$1} = $2 if ($rdline =~ /^(.+)=(.+)$/); + } else { + confess "invalid format of response"; + } + } + while($rlnum < $lnum - 1) { + my $rdline = $lines[$rlnum]; + $rlnum++; + $rdsnippet .= "$rdline\n"; + } + #warn Dumper($rdvector, $rdattrs, $rdsnippet); + if (my $rduri = $rdattrs->{'@uri'}) { + push @docs, new Search::Estraier::ResultDocument( + uri => $rduri, + attrs => $rdattrs, + snippet => $rdsnippet, + keywords => $rdvector, + ); + } + } + $snum = $lnum; + #warn "### $line\n"; + $isend = 1 if ($line =~ /:END$/); + } + + } + + if (! $isend) { + warn "received result doesn't have :END\n$resbody"; + return; + } + + #warn Dumper(\@docs, $hints); + + return new Search::Estraier::NodeResult( docs => \@docs, hints => $hints ); } =head2 cond_to_query +Return URI encoded string generated from Search::Estraier::Condition + my $args = $node->cond_to_query( $cond ); =cut @@ -1228,7 +1320,7 @@ This is method which uses C to communicate with Hyper Estraier node master. - my $rv = shuttle_url( $url, $content_type, \$req_body, \$resbody ); + my $rv = shuttle_url( $url, $content_type, $req_body, \$resbody ); C<$resheads> and C<$resbody> booleans controll if response headers and/or response body will be saved within object. @@ -1335,15 +1427,47 @@ } -=head2 set_info +=head2 set_snippet_width + +Set width of snippets in results + + $node->set_snippet_width( $wwidth, $hwidth, $awidth ); + +C<$wwidth> specifies whole width of snippet. It's C<480> by default. If it's C<0> snippet +is not sent with results. If it is negative, whole document text is sent instead of snippet. + +C<$hwidth> specified width of strings from beginning of string. Default +value is C<96>. Negative or zero value keep previous value. + +C<$awidth> specifies width of strings around each highlighted word. It's C<96> by default. +If negative of zero value is provided previous value is kept unchanged. + +=cut + +sub set_snippet_width { + my $self = shift; + + my ($wwidth, $hwidth, $awidth) = @_; + $self->{wwidth} = $wwidth; + $self->{hwidth} = $hwidth if ($hwidth >= 0); + $self->{awidth} = $awidth if ($awidth >= 0); +} + + + +=head1 PRIVATE METHODS + +You could call those directly, but you don't have to. I hope. + +=head2 _set_info Set information for node - $node->set_info; + $node->_set_info; =cut -sub set_info { +sub _set_info { my $self = shift; $self->{status} = -1;