1 # $Id: Resultset.pm,v 1.12 2004-09-15 14:11:06 heikki Exp $
3 # Zebra perl API header
4 # =============================================================================
5 package IDZebra::Resultset;
12 use IDZebra::Logger qw(:flags :calls);
13 use Scalar::Util qw(weaken);
15 our $VERSION = do { my @r = (q$Revision: 1.12 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
16 our @ISA = qw(IDZebra::Logger);
20 # -----------------------------------------------------------------------------
21 # Class constructors, destructor
22 # -----------------------------------------------------------------------------
24 my ($proto,$session, %args) = @_;
25 my $class = ref($proto) || $proto;
27 bless ($self, $class);
29 $self->{session} = $session;
30 weaken ($self->{session});
32 $self->{odr_stream} = IDZebra::odr_createmem($IDZebra::ODR_DECODE);
34 $self->{name} = $args{name};
35 $self->{query} = $args{query};
36 $self->{recordCount} = $args{recordCount};
37 $self->{errCode} = $args{errCode};
38 $self->{errString} = $args{errString};
45 return ($self->{recordCount});
49 return ($self->{recordCount});
54 return ($self->{errCode});
59 return ($self->{errCode});
62 ######################
63 # this is disabled, while the term counts are broken by the work done to
64 # rsets. To be reinstantiated some day real soon now...
68 # my $count = 0; my $type = 0; my $len = 0;
69 # my $tc = IDZebra::resultSetTerms($self->{session}{zh},$self->{name},
70 # 0, \$count, \$type, "\0", \$len);
72 # logf (LOG_LOG,"Got $tc terms");
76 # for (my $i=0; $i<$tc; $i++) {
78 # my $t = {term => "\0" x $len, count => 0, type => 0};
79 # my $stat = IDZebra::resultSetTerms($self->{session}{zh},$self->{name},
80 # $i, \$t->{count}, \$t->{type},
82 # $t->{term} = substr($t->{term}, 0, $len);
84 # "term $i: type $t->{type}, '$t->{term}' ($t->{count})");
90 # =============================================================================
94 # print STDERR "Destroy RS\n";
98 if ($self->{session}{zh}) {
99 my $r = IDZebra::deleteResultSet($self->{session}{zh},
100 0, #Z_DeleteRequest_list,
105 if ($self->{odr_stream}) {
106 IDZebra::odr_reset($self->{odr_stream});
107 IDZebra::odr_destroy($self->{odr_stream});
108 $self->{odr_stream} = undef;
111 delete($self->{session});
113 # -----------------------------------------------------------------------------
115 my ($self, %args) = @_;
117 unless ($self->{session}{zh}) {
118 croak ("Session is closed or out of scope");
120 my $from = $args{from} ? $args{from} : 1;
121 my $to = $args{to} ? $args{to} : $self->{recordCount};
123 if (($to-$from) >= 1000) {
125 croak ("Cannot fetch more than 1000 records at a time");
131 my $elementSet = $args{elementSet} ? $args{elementSet} : 'R';
132 my $schema = $args{schema} ? $args{schema} : '';
133 my $recordSyntax = $args{recordSyntax} ? $args{recordSyntax} : '';
135 my $class = $args{class} ? $args{class} : '';
137 # ADAM: Reset before we use it (not after)
138 IDZebra::odr_reset($self->{odr_stream});
140 my $ro = IDZebra::RetrievalObj->new();
141 IDZebra::records_retrieve($self->{session}{zh},
153 for (my $i=$from; $i<=$to; $i++) {
154 my $rec = IDZebra::RetrievalRecord->new();
155 IDZebra::record_retrieve($ro, $self->{odr_stream}, $rec, $i-$from+1);
166 # ============================================================================
168 my ($self, $sortspec, $setname) = @_;
170 unless ($self->{session}{zh}) {
171 croak ("Session is closed or out of scope");
175 return ($_[0] = $self->{session}->sortResultsets($sortspec,
176 $self->{session}->_new_setname, ($self)));
179 return ($self->{session}->sortResultsets($sortspec,
184 # ============================================================================
189 IDZebra::Resultset - Representation of Zebra search results
195 printf ("RS Status is %d (%s)\n", $rs->errCode, $rs->errString);
197 my @recs = $rs->records(from => 1,
202 The I<Resultset> object represents results of a Zebra search. Contains number of hits, search status, and can be used to sort and retrieve the records.
206 The folowing properties are available, trough object methods and the object hash reference:
212 The error code returned from search, resulting the Resultset object.
216 The optional error string
220 The number of hits (records available) in the resultset
224 Just the synonym for I<recordCount>
228 =head1 RETRIEVING RECORDS
230 In order to retrieve records, use the I<records> method:
232 my @recs = $rs->records();
234 By default this is going to return an array of IDZebra::RetrievalRecord objects. The possible arguments are:
240 Retrieve records from the given position. The first record corresponds to position 1. If not specified, retrieval starts from the first record.
244 The last record position to be fetched. If not specified, all records are going to be fetched, starting from position I<from>.
248 The element set used for retrieval. If not specified 'I<R>' 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).
252 The schema used for retrieval. The default is "".
254 =item B<recordSyntax>
256 The record syntax for retrieval. The default is SUTRS.
262 You can sort resultsets by calling:
264 $rs1->sort($sort_expr);
266 or create a new sorted resultset:
268 $rs2 = $rs1->sort($sort_expr);
270 The sort expression has the same format as described in the I<yaz_client> documentation. For example:
272 $rs1->sort('1=4 id');
274 will sort thr results by title, in a case insensitive way, in descending order, while
278 will sort ascending by titles.
286 Peter Popovics, pop@technomat.hu
290 Zebra documentation, IDZebra::ResultSet, IDZebra::RetrievalRecord manpages.