X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=perl%2Flib%2FIDZebra%2FResultset.pm;h=7408d353280e791cbfe3350d6a81a934dc9a48dc;hb=52551bf774d771a0422a401946fd0c5ee3788f34;hp=dd40ad12be3b091533d15bf1d34ebeb8152fa854;hpb=0a34a94a93dc7d594d0f6a7f359a63dbc1297775;p=idzebra-moved-to-github.git diff --git a/perl/lib/IDZebra/Resultset.pm b/perl/lib/IDZebra/Resultset.pm index dd40ad1..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,16 +36,42 @@ sub new { $self->{errCode} = $args{errCode}; $self->{errString} = $args{errString}; - bless ($self, $class); return ($self); } -sub DESTROY { +sub recordCount { my ($self) = @_; + return ($self->{recordCount}); +} +sub count { + my ($self) = @_; + return ($self->{recordCount}); +} -# print STDERR "Destroy RS\n"; +sub errCode { + my ($self) = @_; + return ($self->{errCode}); +} +sub errString { + my ($self) = @_; + return ($self->{errCode}); +} + +# ============================================================================= +sub DESTROY { + 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}); @@ -50,20 +79,32 @@ sub DESTROY { $self->{odr_stream} = undef; } - delete($self->{ro}); 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} : ''; + my $class = $args{class} ? $args{class} : ''; + my $ro = IDZebra::RetrievalObj->new(); IDZebra::records_retrieve($self->{session}{zh}, @@ -76,13 +117,16 @@ sub records { $to, $ro); - my @res = (); for (my $i=$from; $i<=$to; $i++) { my $rec = IDZebra::RetrievalRecord->new(); IDZebra::record_retrieve($ro, $self->{odr_stream}, $rec, $i-$from+1); - push (@res, $rec); + if ($class) { + + } else { + push (@res, $rec); + } } IDZebra::odr_reset($self->{odr_stream}); @@ -90,11 +134,17 @@ sub records { return (@res); } +# ============================================================================ 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, @@ -102,16 +152,102 @@ sub sort { } } +# ============================================================================ __END__ =head1 NAME -IDZebra::Session - +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 + +The folowing properties are available, trough object methods and the object hash reference: + +=over 4 + +=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 Fill in @@ -122,6 +258,6 @@ Peter Popovics, pop@technomat.hu =head1 SEE ALSO -IDZebra, IDZebra::Data1, Zebra documentation +Zebra documentation, IDZebra::ResultSet, IDZebra::RetrievalRecord manpages. =cut