X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=perl%2Flib%2FIDZebra%2FResultset.pm;h=7408d353280e791cbfe3350d6a81a934dc9a48dc;hb=4c01004f98083cefbe51cfa53676e2e0900db491;hp=bf90d4be7e7c26dee9e30a6a88ffa9bc4e67510a;hpb=924ac21637671fe586641fc29952ef5a78c7b7c5;p=idzebra-moved-to-github.git diff --git a/perl/lib/IDZebra/Resultset.pm b/perl/lib/IDZebra/Resultset.pm index bf90d4b..7408d35 100644 --- a/perl/lib/IDZebra/Resultset.pm +++ b/perl/lib/IDZebra/Resultset.pm @@ -1,17 +1,20 @@ -#!/usr/bin/perl -# ============================================================================ +# $Id: Resultset.pm,v 1.9 2003-03-06 23:32:10 pop Exp $ +# # Zebra perl API header # ============================================================================= -use strict; -use Carp; -# ============================================================================ package IDZebra::Resultset; -use IDZebra; -use IDZebra::Logger qw(:flags :calls); -use IDZebra::Repository; -use Scalar::Util qw(weaken); -our @ISA = qw(IDZebra::Logger); +use strict; +use warnings; + +BEGIN { + use IDZebra; + use IDZebra::Logger qw(:flags :calls); + use Scalar::Util qw(weaken); + use Carp; + our $VERSION = do { my @r = (q$Revision: 1.9 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + our @ISA = qw(IDZebra::Logger); +} 1; # ----------------------------------------------------------------------------- @@ -21,11 +24,11 @@ sub new { my ($proto,$session, %args) = @_; my $class = ref($proto) || $proto; my $self = {}; + bless ($self, $class); + $self->{session} = $session; weaken ($self->{session}); - # Retrieval object - $self->{ro} = IDZebra::RetrievalObj->new(); $self->{odr_stream} = IDZebra::odr_createmem($IDZebra::ODR_DECODE); $self->{name} = $args{name}; @@ -33,14 +36,13 @@ sub new { $self->{errCode} = $args{errCode}; $self->{errString} = $args{errString}; - bless ($self, $class); - -# $self->{session}{resultsets}{$args{name}} = $self; -# weaken ($self->{session}{resultsets}{$args{name}}; - return ($self); } +sub recordCount { + my ($self) = @_; + return ($self->{recordCount}); +} sub count { my ($self) = @_; return ($self->{recordCount}); @@ -58,9 +60,18 @@ sub errString { # ============================================================================= sub DESTROY { - my ($self) = @_; + my $self = shift; +# print STDERR "Destroy RS\n"; # Deleteresultset? + + my $stats = 0; + if ($self->{session}{zh}) { + my $r = IDZebra::deleteResultSet($self->{session}{zh}, + 0, #Z_DeleteRequest_list, + 1,[$self->{name}], + $stats); + } if ($self->{odr_stream}) { IDZebra::odr_reset($self->{odr_stream}); @@ -68,17 +79,26 @@ sub DESTROY { $self->{odr_stream} = undef; } - delete($self->{ro}); -# delete($self->{session}{resultsets}{$self->{name}}); delete($self->{session}); } # ----------------------------------------------------------------------------- sub records { my ($self, %args) = @_; + unless ($self->{session}{zh}) { + croak ("Session is closed or out of scope"); + } my $from = $args{from} ? $args{from} : 1; my $to = $args{to} ? $args{to} : $self->{recordCount}; + if (($to-$from) >= 1000) { + if ($args{to}) { + croak ("Cannot fetch more than 1000 records at a time"); + } else { + $to = $from + 999; + } + } + my $elementSet = $args{elementSet} ? $args{elementSet} : 'R'; my $schema = $args{schema} ? $args{schema} : ''; my $recordSyntax = $args{recordSyntax} ? $args{recordSyntax} : ''; @@ -97,7 +117,6 @@ sub records { $to, $ro); - my @res = (); for (my $i=$from; $i<=$to; $i++) { @@ -106,7 +125,7 @@ sub records { if ($class) { } else { - push (@res, $rec); + push (@res, $rec); } } @@ -118,9 +137,14 @@ sub records { # ============================================================================ sub sort { my ($self, $sortspec, $setname) = @_; + + unless ($self->{session}{zh}) { + croak ("Session is closed or out of scope"); + } + unless ($setname) { - $_[0] = $self->{session}->sortResultsets($sortspec, - $self->{name}, ($self)); + return ($_[0] = $self->{session}->sortResultsets($sortspec, + $self->{session}->_new_setname, ($self))); return ($_[0]); } else { return ($self->{session}->sortResultsets($sortspec, @@ -137,20 +161,92 @@ IDZebra::Resultset - Representation of Zebra search results =head1 SYNOPSIS + $count = $rs->count; + + printf ("RS Status is %d (%s)\n", $rs->errCode, $rs->errString); + + my @recs = $rs->records(from => 1, + to => 10); + =head1 DESCRIPTION The I object represents results of a Zebra search. Contains number of hits, search status, and can be used to sort and retrieve the records. =head1 PROPERTIES - $count = $rs->count; +The folowing properties are available, trough object methods and the object hash reference: - printf ("RS Status is %d (%s)\n", $rs->errCode, $rs->errString); +=over 4 -I<$rs-EerrCode> is 0, if there were no errors during search. +=item B + +The error code returned from search, resulting the Resultset object. + +=item B + +The optional error string + +=item B + +The number of hits (records available) in the resultset + +=item B + +Just the synonym for I + +=back =head1 RETRIEVING RECORDS +In order to retrieve records, use the I method: + + my @recs = $rs->records(); + +By default this is going to return an array of IDZebra::RetrievalRecord objects. The possible arguments are: + +=over 4 + +=item B + +Retrieve records from the given position. The first record corresponds to position 1. If not specified, retrieval starts from the first record. + +=item B + +The last record position to be fetched. If not specified, all records are going to be fetched, starting from position I. + +=item B + +The element set used for retrieval. If not specified 'I' is used, which will return the "record" in the original format (ie.: without extraction, just as the original file, or data buffer in the update call). + +=item B + +The schema used for retrieval. The default is "". + +=item B + +The record syntax for retrieval. The default is SUTRS. + +=back + +=head1 SORTING + +You can sort resultsets by calling: + + $rs1->sort($sort_expr); + +or create a new sorted resultset: + + $rs2 = $rs1->sort($sort_expr); + +The sort expression has the same format as described in the I documentation. For example: + + $rs1->sort('1=4 id'); + +will sort thr results by title, in a case insensitive way, in descending order, while + + $rs1->sort('1=4 a'); + +will sort ascending by titles. =head1 COPYRIGHT @@ -162,6 +258,6 @@ Peter Popovics, pop@technomat.hu =head1 SEE ALSO -IDZebra, IDZebra::Data1, Zebra documentation +Zebra documentation, IDZebra::ResultSet, IDZebra::RetrievalRecord manpages. =cut