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 )