KinoSearch1
view release on metacpan or search on metacpan
lib/KinoSearch1/Index/MultiTermDocs.pm view on Meta::CPAN
package KinoSearch1::Index::MultiTermDocs;
use strict;
use warnings;
use KinoSearch1::Util::ToolSet;
use base qw( KinoSearch1::Index::TermDocs );
BEGIN {
__PACKAGE__->init_instance_vars(
sub_readers => undef,
starts => undef,
);
}
our %instance_vars;
sub new {
my $self = shift->SUPER::new;
confess kerror() unless verify_args( \%instance_vars, @_ );
my %args = ( %instance_vars, @_ );
# get a SegTermDocs for each segment
my $sub_readers = $args{sub_readers} || [];
my $starts = $args{starts} || [];
my @sub_term_docs = map { $_->term_docs } @$sub_readers;
_init_child( $self, \@sub_term_docs, $starts );
return $self;
}
sub seek {
my ( $self, $term ) = @_;
$_->seek($term) for @{ $self->_get_sub_term_docs };
$self->_reset_pointer;
}
sub set_read_positions {
my ( $self, $val ) = @_;
$_->set_read_positions($val) for @{ $self->_get_sub_term_docs };
}
sub close {
my $self = shift;
$_->close for @{ $self->_get_sub_term_docs };
}
1;
__END__
__XS__
MODULE = KinoSearch1 PACKAGE = KinoSearch1::Index::MultiTermDocs
void
_init_child(term_docs, sub_term_docs_avref, starts_av)
TermDocs *term_docs;
SV *sub_term_docs_avref;
AV *starts_av;
PPCODE:
Kino1_MultiTermDocs_init_child(term_docs, sub_term_docs_avref, starts_av);
=for comment
Helper for seek().
=cut
void
_reset_pointer(term_docs)
TermDocs *term_docs;
PREINIT:
MultiTermDocsChild *child;
PPCODE:
child = (MultiTermDocsChild*)term_docs->child;
child->base = 0;
child->pointer = 0;
child->current = NULL;
SV*
_set_or_get(term_docs, ...)
TermDocs *term_docs;
ALIAS:
_set_sub_term_docs = 1
_get_sub_term_docs = 2
CODE:
{
MultiTermDocsChild *child = (MultiTermDocsChild*)term_docs->child;
KINO_START_SET_OR_GET_SWITCH
case 1: Kino1_confess("Can't set sub_term_docs");
/* fall through */
case 2: RETVAL = newSVsv( child->sub_term_docs_avref );
break;
KINO_END_SET_OR_GET_SWITCH
}
OUTPUT: RETVAL
__H__
#ifndef H_KINO_MULTI_TERM_DOCS
#define H_KINO_MULTI_TERM_DOCS 1
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "KinoSearch1IndexTermDocs.h"
#include "KinoSearch1UtilCClass.h"
#include "KinoSearch1UtilMemManager.h"
typedef struct multitermdocschild {
I32 num_subs;
I32 base;
I32 pointer;
SV *sub_term_docs_avref;
U32 *starts;
SV *term_sv;
TermDocs **sub_term_docs;
TermDocs *current;
} MultiTermDocsChild;
void Kino1_MultiTermDocs_init_child(TermDocs*, SV*, AV*);
void Kino1_MultiTermDocs_set_doc_freq_death(TermDocs*, U32);
U32 Kino1_MultiTermDocs_get_doc_freq(TermDocs*);
U32 Kino1_MultiTermDocs_get_doc(TermDocs*);
U32 Kino1_MultiTermDocs_get_freq(TermDocs*);
SV* Kino1_MultiTermDocs_get_positions(TermDocs*);
U32 Kino1_MultiTermDocs_bulk_read(TermDocs*, SV*, SV*, U32);
bool Kino1_MultiTermDocs_next(TermDocs*);
bool Kino1_MultiTermDocs_skip_to(TermDocs*, U32);
void Kino1_MultiTermDocs_destroy(TermDocs*);
( run in 0.563 second using v1.01-cache-2.11-cpan-5511b514fd6 )