X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=perl%2Flib%2FIDZebra%2FResultset.pm;h=b57533d001cc04e1bcb64831fcb640a622109f84;hb=0cb3550373ce8736a146157d72e3cb02e803a6e1;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..b57533d 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.13 2004-09-16 14:58:47 heikki 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.13 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; + our @ISA = qw(IDZebra::Logger); +} 1; # ----------------------------------------------------------------------------- @@ -21,28 +24,86 @@ sub new { my ($proto,$session, %args) = @_; my $class = ref($proto) || $proto; my $self = {}; + bless ($self, $class); + logf(LOG_DEBUG,"creating a Resultset ".$args{name}); + $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}; + $self->{query} = $args{query}; $self->{recordCount} = $args{recordCount}; $self->{errCode} = $args{errCode}; $self->{errString} = $args{errString}; - bless ($self, $class); + logf(LOG_DEBUG,"created a Resultset ".$self->{name}); 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}); +} + +###################### +# this is disabled, while the term counts are broken by the work done to +# rsets. To be reinstantiated some day real soon now... +#sub terms { +# use Data::Dumper; +# my ($self) = @_; +# my $count = 0; my $type = 0; my $len = 0; +# my $tc = IDZebra::resultSetTerms($self->{session}{zh},$self->{name}, +# 0, \$count, \$type, "\0", \$len); +# +# logf (LOG_LOG,"Got $tc terms"); +# +# +# my @res = (); +# for (my $i=0; $i<$tc; $i++) { +# my $len = 1024; +# my $t = {term => "\0" x $len, count => 0, type => 0}; +# my $stat = IDZebra::resultSetTerms($self->{session}{zh},$self->{name}, +# $i, \$t->{count}, \$t->{type}, +# $t->{term}, \$len); +# $t->{term} = substr($t->{term}, 0, $len); +# logf (LOG_LOG, +# "term $i: type $t->{type}, '$t->{term}' ($t->{count})"); +# push (@res, $t); +# } +# return (@res); +#} + +# ============================================================================= +sub DESTROY { + my $self = shift; + +# print STDERR "Destroy RS\n"; # Deleteresultset? + + my $stats = 0; + logf(LOG_DEBUG, "Destroying a Resultset ". $self->{name}); + 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 +111,35 @@ sub DESTROY { $self->{odr_stream} = undef; } - delete($self->{ro}); delete($self->{session}); + logf(LOG_DEBUG, "Destroyed a Resultset ". $self->{name}); } # ----------------------------------------------------------------------------- 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} : ''; + + # ADAM: Reset before we use it (not after) + IDZebra::odr_reset($self->{odr_stream}); my $ro = IDZebra::RetrievalObj->new(); IDZebra::records_retrieve($self->{session}{zh}, @@ -76,42 +152,140 @@ 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}); - return (@res); } +# ============================================================================ sub sort { my ($self, $sortspec, $setname) = @_; - unless ($setname) { - $_[0] = $self->{session}->sortResultsets($sortspec, - $self->{name}, ($self)); - return ($_[0]); - } else { - return ($self->{session}->sortResultsets($sortspec, - $setname, ($self))); + + unless ($self->{session}{zh}) { + croak ("Session is closed or out of scope"); } + + if (!$setname) { + $setname=$self->{session}->_new_setname(); + } + return ($self->{session}->sortResultsets($sortspec, + $setname, ($self))); +# unless ($setname) { +# return ($_[0] = $self->{session}->sortResultsets($sortspec, +# $self->{session}->_new_setname, ($self))); +# return ($_[0]); +# } else { +# return ($self->{session}->sortResultsets($sortspec, +# $setname, ($self))); +# } } +# ============================================================================ __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 +296,6 @@ Peter Popovics, pop@technomat.hu =head1 SEE ALSO -IDZebra, IDZebra::Data1, Zebra documentation +Zebra documentation, IDZebra::ResultSet, IDZebra::RetrievalRecord manpages. =cut