📄 segtermenum.pm
字号:
package KinoSearch::Index::SegTermEnum;use strict;use warnings;use KinoSearch::Util::ToolSet;use base qw( KinoSearch::Util::Class );BEGIN { __PACKAGE__->init_instance_vars( # constructor params finfos => undef, instream => undef, is_index => 0, );}our %instance_vars;use KinoSearch::Index::Term;use KinoSearch::Index::TermInfo;use KinoSearch::Index::TermBuffer;sub new { # verify params my $ignore = shift; my %args = ( %instance_vars, @_ ); confess kerror() unless verify_args( \%instance_vars, %args ); # get a TermBuffer helper object my $term_buffer = KinoSearch::Index::TermBuffer->new( finfos => $args{finfos}, ); return _new_helper( @args{ 'instream', 'is_index', 'finfos', }, $term_buffer );}sub clone_enum { my $self = shift; # dupe instream and seek it to the start of the file, so init works right my $instream = $self->_get_instream; my $new_stream = $instream->clone_stream; $new_stream->seek(0); # create a new object and seek it to the right term/terminfo my $evil_twin = __PACKAGE__->new( finfos => $self->_get_finfos, instream => $new_stream, is_index => $self->is_index, ); $evil_twin->seek( $instream->tell, $self->_get_position, $self->get_termstring, $self->get_term_info ); return $evil_twin;}# Locate the Enum to a particular spot.sub seek { my ( $self, $pointer, $position, $termstring, $tinfo ) = @_; # seek the filehandle my $instream = $self->_get_instream; $instream->seek($pointer); # set values as if we'd scanned here from the start of the Enum $self->_set_position($position); $self->_set_termstring($termstring); $self->_set_term_info($tinfo);}sub close { my $instream = $_[0]->_get_instream; $instream->close;}# return a Term, if the Enum is currently valid.sub get_term { my $self = shift; my $termstring = $self->get_termstring; return unless defined $termstring; return KinoSearch::Index::Term->new_from_string( $termstring, $self->_get_finfos );}1;__END____XS__MODULE = KinoSearch PACKAGE = KinoSearch::Index::SegTermEnum SegTermEnum*_new_helper(instream_sv, is_index, finfos_sv, term_buffer_sv) SV *instream_sv; I32 is_index; SV *finfos_sv SV *term_buffer_sv;CODE: RETVAL = Kino_SegTermEnum_new_helper(instream_sv, is_index, finfos_sv, term_buffer_sv);OUTPUT: RETVAL=for commentfill_cache() loads the entire Enum into memory. This should only be calledfor index Enums -- never for primary Enums.=cutvoidfill_cache(obj) SegTermEnum *obj;PPCODE: Kino_SegTermEnum_fill_cache(obj);=begin commentscan_to() iterates through the Enum until the Enum's state is ge the target.This is called on the main Enum, after seek() has gotten it close. You don'twant to scan through the entire main Enum, just through a small part.Scanning through an Enum is an involved process, due to the heavy datacompression. See the Java Lucene File Format definition for details.=end comment=cutvoidscan_to(obj, target_termstring_sv) SegTermEnum *obj; SV *target_termstring_sv;PREINIT: char *ptr; STRLEN len;PPCODE: ptr = SvPV(target_termstring_sv, len); if (len < 2) Kino_confess("length of termstring < 2: %"UVuf, (UV)len); Kino_SegTermEnum_scan_to(obj, ptr, len);=for commentReset the Enum to the top, so that after next() is called, the Enum is locatedat the first term in the segment.=cutvoidreset(obj) SegTermEnum *obj;PPCODE: Kino_SegTermEnum_reset(obj);=for commentnext() advances the state of the Enum one term. If the current position ofthe Enum is valid, it returns 1; when the Enum is exhausted, it returns 0.=cutIVnext(obj) SegTermEnum *obj;CODE: RETVAL = Kino_SegTermEnum_next(obj);OUTPUT: RETVAL=for commentFor an Enum which has been loaded into memory, scan to the target as quicklyas possible.=cutI32scan_cache(obj, target_termstring_sv) SegTermEnum *obj; SV *target_termstring_sv;PREINIT: char *ptr; STRLEN len;CODE: ptr = SvPV(target_termstring_sv, len); if (len < 2) Kino_confess("length of termstring < 2: %"UVuf, (UV)len); RETVAL = Kino_SegTermEnum_scan_cache(obj, ptr, len);OUTPUT: RETVAL=for commentSetters and getters for members in the SegTermEnum struct. Not all of these are useful.=cutSV*_set_or_get(obj, ...) SegTermEnum *obj;ALIAS: _set_instream = 1 _get_instream = 2 _set_finfos = 3 _get_finfos = 4 _set_size = 5 get_size = 6 _set_termstring = 7 get_termstring = 8 _set_term_info = 9 get_term_info = 10 _set_index_interval = 11 get_index_interval = 12 _set_skip_interval = 13 get_skip_interval = 14 _set_position = 15 _get_position = 16 _set_is_index = 17 is_index = 18CODE:{ KINO_START_SET_OR_GET_SWITCH case 0: croak("can't call _get_or_set on it's own"); break; /* probably unreachable */ case 1: SvREFCNT_dec(obj->instream_sv); obj->instream_sv = newSVsv( ST(1) ); /* fall through */ case 2: RETVAL = newSVsv(obj->instream_sv); break; case 3: SvREFCNT_dec(obj->finfos); obj->finfos = newSVsv( ST(1) ); /* fall through */ case 4: RETVAL = newSVsv(obj->finfos); break; case 5: obj->enum_size = (I32)SvIV( ST(1) ); /* fall through */ case 6: RETVAL = newSViv(obj->enum_size); break; case 7: if ( SvOK( ST(1) ) ) { STRLEN len = SvCUR( ST(1) ); if (len < KINO_FIELD_NUM_LEN) Kino_confess("Internal error: termstring too short"); Kino_TermBuf_set_termstring(obj->term_buf, SvPVX(ST(1)), len); } else { Kino_TermBuf_reset(obj->term_buf); } /* fall through */ case 8: RETVAL = (obj->term_buf->termstring == NULL) ? &PL_sv_undef : newSVpv( obj->term_buf->termstring->ptr, obj->term_buf->termstring->size ); break; case 9: { TermInfo* new_tinfo; Kino_extract_struct( ST(1), new_tinfo, TermInfo*, "KinoSearch::Index::TermInfo"); Kino_TInfo_destroy(obj->tinfo); obj->tinfo = Kino_TInfo_dupe(new_tinfo); } /* fall through */ case 10: { TermInfo* new_tinfo; RETVAL = newSV(0); new_tinfo = Kino_TInfo_dupe(obj->tinfo); sv_setref_pv(RETVAL, "KinoSearch::Index::TermInfo", (void*)new_tinfo); } break; case 11: obj->index_interval = SvIV( ST(1) ); /* fall through */ case 12: RETVAL = newSViv(obj->index_interval); break; case 13: obj->skip_interval = SvIV( ST(1) ); /* fall through */ case 14: RETVAL = newSViv(obj->skip_interval); break; case 15: obj->position = SvIV( ST(1) ); /* fall through */ case 16: RETVAL = newSViv(obj->position); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -