KinoSearch::Index::TermDocs - retrieve list of docs which contain a Term |
sub seek { shift->abstract_death }
sub close { shift->abstract_death }
1;
__END__
__XS__
MODULE = KinoSearch PACKAGE = KinoSearch::Index::TermDocs
void
new(either_sv)
SV *either_sv;
PREINIT:
char *class;
TermDocs *term_docs;
PPCODE:
/* determine the class */
class = sv_isobject(either_sv)
? sv_reftype(either_sv, 0)
: SvPV_nolen(either_sv);
/* build object */ term_docs = Kino_TermDocs_new(); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), class, (void*)term_docs); XSRETURN(1);
void seek_tinfo(term_docs, maybe_tinfo_sv) TermDocs *term_docs; SV *maybe_tinfo_sv; PREINIT: TermInfo *tinfo = NULL; PPCODE: /* if maybe_tinfo_sv is undef, tinfo is NULL */ if (SvOK(maybe_tinfo_sv)) { Kino_extract_struct(maybe_tinfo_sv, tinfo, TermInfo*, ``KinoSearch::Index::TermInfo''); } term_docs->seek_tinfo(term_docs, tinfo);
bool
next(term_docs)
TermDocs *term_docs;
CODE:
RETVAL = term_docs->next(term_docs);
OUTPUT: RETVAL
U32 bulk_read(term_docs, doc_nums_sv, freqs_sv, num_wanted) TermDocs *term_docs SV *doc_nums_sv; SV *freqs_sv; U32 num_wanted; CODE: RETVAL = term_docs->bulk_read(term_docs, doc_nums_sv, freqs_sv, num_wanted); OUTPUT: RETVAL
bool skip_to(term_docs, target) TermDocs *term_docs; U32 target; CODE: RETVAL = term_docs->skip_to(term_docs, target); OUTPUT: RETVAL
SV* _parent_set_or_get(term_docs, ...) TermDocs *term_docs; ALIAS: set_doc = 1 get_doc = 2 set_freq = 3 get_freq = 4 set_positions = 5 get_positions = 6 set_doc_freq = 7 get_doc_freq = 8 PREINIT: U32 num; CODE: { KINO_START_SET_OR_GET_SWITCH
case 1: Kino_confess("Can't set_doc"); /* fall through */ case 2: num = term_docs->get_doc(term_docs); RETVAL = num == KINO_TERM_DOCS_SENTINEL ? &PL_sv_undef : newSVuv(num); break;
case 3: Kino_confess("Can't set_freq"); /* fall through */ case 4: num = term_docs->get_freq(term_docs); RETVAL = num == KINO_TERM_DOCS_SENTINEL ? &PL_sv_undef : newSVuv(num); break;
case 5: Kino_confess("Can't set_positions"); /* fall through */ case 6: RETVAL = newSVsv(term_docs->get_positions(term_docs)); break;
case 7: term_docs->set_doc_freq(term_docs, (U32)SvUV(ST(1)) ); /* fall through */ case 8: num = term_docs->get_doc_freq(term_docs); RETVAL = num == KINO_TERM_DOCS_SENTINEL ? &PL_sv_undef : newSVuv(num); break;
KINO_END_SET_OR_GET_SWITCH } OUTPUT: RETVAL
void
DESTROY(term_docs)
TermDocs *term_docs;
PPCODE:
term_docs->destroy(term_docs);
__H__
#ifndef H_KINO_TERM_DOCS #define H_KINO_TERM_DOCS 1
#define KINO_TERM_DOCS_SENTINEL 0xFFFFFFFF
#include ``EXTERN.h'' #include ``perl.h'' #include ``XSUB.h'' #include ``KinoSearchUtilMemManager.h'' #include ``KinoSearchIndexTermInfo.h''
typedef struct termdocs { void *child; SV *positions; void (*set_doc_freq)(struct termdocs*, U32); U32 (*get_doc_freq)(struct termdocs*); U32 (*get_doc)(struct termdocs*); U32 (*get_freq)(struct termdocs*); SV* (*get_positions)(struct termdocs*); void (*seek_tinfo)(struct termdocs*, TermInfo*); bool (*next)(struct termdocs*); bool (*skip_to)(struct termdocs*, U32); U32 (*bulk_read)(struct termdocs*, SV*, SV*, U32); void (*destroy)(struct termdocs*); } TermDocs;
TermDocs* Kino_TermDocs_new(); void Kino_TermDocs_set_doc_freq_death(TermDocs*, U32); U32 Kino_TermDocs_get_doc_freq_death(TermDocs*); U32 Kino_TermDocs_get_doc_death(TermDocs*); U32 Kino_TermDocs_get_freq_death(TermDocs*); SV* Kino_TermDocs_get_positions_death(TermDocs*); void Kino_TermDocs_seek_tinfo_death(TermDocs*, TermInfo*); bool Kino_TermDocs_next_death(TermDocs*); bool Kino_TermDocs_skip_to_death(TermDocs*, U32); U32 Kino_TermDocs_bulk_read_death(TermDocs*, SV*, SV*, U32); void Kino_TermDocs_destroy(TermDocs*);
#endif /* include guard */
__C__
#include ``KinoSearchIndexTermDocs.h''
TermDocs*
Kino_TermDocs_new()
{
TermDocs* term_docs;
Kino_New(0, term_docs, 1, TermDocs); term_docs->child = NULL;
/* force the subclass to override functions */ term_docs->set_doc_freq = Kino_TermDocs_set_doc_freq_death; term_docs->get_doc_freq = Kino_TermDocs_get_doc_freq_death; term_docs->get_doc = Kino_TermDocs_get_doc_death; term_docs->get_freq = Kino_TermDocs_get_freq_death; term_docs->get_positions = Kino_TermDocs_get_positions_death; term_docs->seek_tinfo = Kino_TermDocs_seek_tinfo_death; term_docs->next = Kino_TermDocs_next_death; term_docs->skip_to = Kino_TermDocs_skip_to_death; term_docs->destroy = Kino_TermDocs_destroy;
return term_docs; }
void Kino_TermDocs_set_doc_freq_death(TermDocs *term_docs, U32 doc_freq) { Kino_confess(``term_docs->set_doc_freq must be defined in a subclass''); }
U32 Kino_TermDocs_get_doc_freq_death(TermDocs *term_docs) { Kino_confess(``term_docs->get_doc_freq must be defined in a subclass''); return 1; }
U32 Kino_TermDocs_get_doc_death(TermDocs *term_docs) { Kino_confess(``term_docs->get_doc must be defined in a subclass''); return 1; }
U32 Kino_TermDocs_get_freq_death(TermDocs *term_docs) { Kino_confess(``term_docs->get_freq must be defined in a subclass''); return 1; }
SV* Kino_TermDocs_get_positions_death(TermDocs *term_docs) { Kino_confess(``term_docs->get_positions must be defined in a subclass''); return &PL_sv_undef; }
void Kino_TermDocs_seek_tinfo_death(TermDocs *term_docs, TermInfo *tinfo) { Kino_confess(``term_docs->seek_tinfo must be defined in a subclass''); }
bool Kino_TermDocs_next_death(TermDocs *term_docs) { Kino_confess(``term_docs->next must be defined in a subclass''); return 1; }
U32 Kino_TermDocs_bulk_read_death(TermDocs* term_docs, SV* doc_nums_sv, SV* freqs_sv, U32 num_wanted) { Kino_confess(``term_docs->bulk_read must be defined in a subclass''); return 1; }
bool Kino_TermDocs_skip_to_death(TermDocs *term_docs, U32 target) { Kino_confess(``term_docs->skip_to must be defined in a subclass''); return 1; }
void Kino_TermDocs_destroy(TermDocs *term_docs) { Kino_Safefree(term_docs); }
__POD__
KinoSearch::Index::TermDocs - retrieve list of docs which contain a Term |