KinoSearch1

 view release on metacpan or  search on metacpan

lib/KinoSearch1/Index/SegTermDocs.pm  view on Meta::CPAN

package KinoSearch1::Index::SegTermDocs;
use strict;
use warnings;
use KinoSearch1::Util::ToolSet;
use base qw( KinoSearch1::Index::TermDocs );

BEGIN {
    __PACKAGE__->init_instance_vars(
        # constructor params
        reader => undef,
    );
}
our %instance_vars;

sub new {
    my $self = shift->SUPER::new;
    confess kerror() unless verify_args( \%instance_vars, @_ );
    my %args = ( %instance_vars, @_ );
    my $reader = $args{reader};

    _init_child($self);

    # dupe some stuff from the parent reader.
    $self->_set_reader($reader);
    $self->_set_skip_interval( $reader->get_skip_interval );
    $self->_set_freq_stream( $reader->get_freq_stream()->clone_stream );
    $self->_set_skip_stream( $reader->get_freq_stream()->clone_stream );
    $self->_set_prox_stream( $reader->get_prox_stream()->clone_stream );
    $self->_set_deldocs( $reader->get_deldocs );

    return $self;
}

sub seek {
    my ( $self, $term ) = @_;
    my $tinfo
        = defined $term
        ? $self->_get_reader()->fetch_term_info($term)
        : undef;
    $self->seek_tinfo($tinfo);
}

sub close {
    my $self = shift;
    $self->_get_freq_stream()->close;
    $self->_get_prox_stream()->close;
    $self->_get_skip_stream()->close;
}

1;

__END__
__XS__

MODULE = KinoSearch1    PACKAGE = KinoSearch1::Index::SegTermDocs

void
_init_child(term_docs)
    TermDocs *term_docs;
PPCODE:
    Kino1_SegTermDocs_init_child(term_docs);

SV*
_set_or_get(term_docs, ...)
    TermDocs *term_docs;
ALIAS:
    _set_count         = 1
    _get_count         = 2
    _set_freq_stream   = 3
    _get_freq_stream   = 4
    _set_prox_stream   = 5
    _get_prox_stream   = 6
    _set_skip_stream   = 7
    _get_skip_stream   = 8
    _set_deldocs       = 9
    _get_deldocs       = 10
    _set_reader        = 11
    _get_reader        = 12
    set_read_positions = 13
    get_read_positions = 14
    _set_skip_interval = 15
    _get_skip_interval = 16
CODE:
{
    SegTermDocsChild *child = (SegTermDocsChild*)term_docs->child;

    KINO_START_SET_OR_GET_SWITCH

    case 1:  child->count = SvUV(ST(1));
             /* fall through */
    case 2:  RETVAL = newSVuv(child->count);
             break;

    case 3:  SvREFCNT_dec(child->freq_stream_sv);
             child->freq_stream_sv = newSVsv( ST(1) );
             Kino1_extract_struct( child->freq_stream_sv, child->freq_stream, 
                InStream*, "KinoSearch1::Store::InStream");
             /* fall through */
    case 4:  RETVAL = newSVsv(child->freq_stream_sv);
             break;

    case 5:  SvREFCNT_dec(child->prox_stream_sv);
             child->prox_stream_sv = newSVsv( ST(1) );
             Kino1_extract_struct( child->prox_stream_sv, child->prox_stream, 
                InStream*, "KinoSearch1::Store::InStream");
             /* fall through */
    case 6:  RETVAL = newSVsv(child->prox_stream_sv);
             break;

    case 7:  SvREFCNT_dec(child->skip_stream_sv);
             child->skip_stream_sv = newSVsv( ST(1) );
             Kino1_extract_struct( child->skip_stream_sv, child->skip_stream, 
                InStream*, "KinoSearch1::Store::InStream");
             /* fall through */
    case 8:  RETVAL = newSVsv(child->skip_stream_sv);
             break;

    case 9:  SvREFCNT_dec(child->deldocs_sv);
             child->deldocs_sv = newSVsv( ST(1) );
             Kino1_extract_struct( child->deldocs_sv, child->deldocs, 



( run in 1.254 second using v1.01-cache-2.11-cpan-5511b514fd6 )