KinoSearch

 view release on metacpan or  search on metacpan

lib/KinoSearch/Index/Indexer.pm  view on Meta::CPAN

package KinoSearch::Index::Indexer;
use KinoSearch;

1;

__END__

__BINDING__

my $xs_code = <<'END_XS_CODE';
MODULE = KinoSearch  PACKAGE = KinoSearch::Index::Indexer

int32_t
CREATE(...)
CODE:
    CHY_UNUSED_VAR(items);
    RETVAL = kino_Indexer_CREATE;
OUTPUT: RETVAL

int32_t
TRUNCATE(...)
CODE:
    CHY_UNUSED_VAR(items);
    RETVAL = kino_Indexer_TRUNCATE;
OUTPUT: RETVAL

void
add_doc(self, ...)
    kino_Indexer *self;
PPCODE:
{
    kino_Doc *doc = NULL;
    SV *doc_sv = NULL;
    float boost = 1.0;

    if (items == 2) {
        doc_sv = ST(1);
    }
    else if (items > 2) {
        SV* boost_sv = NULL; 
        XSBind_allot_params( &(ST(0)), 1, items, 
            "KinoSearch::Index::Indexer::add_doc_PARAMS", &doc_sv, "doc", 3,
            &boost_sv, "boost", 5, NULL);
        if (boost_sv) {
            boost = (float)SvNV(boost_sv);
        }
    }
    else if (items == 1) {
        CFISH_THROW(KINO_ERR, "Missing required argument 'doc'");
    }

    // Either get a Doc or use the stock doc. 
    if (   sv_isobject(doc_sv) 
        && sv_derived_from(doc_sv, "KinoSearch::Document::Doc")
    ) {
        IV tmp = SvIV( SvRV(doc_sv) );
        doc = INT2PTR(kino_Doc*, tmp);
    }
    else if (XSBind_sv_defined(doc_sv) && SvROK(doc_sv)) {
        HV *maybe_fields = (HV*)SvRV(doc_sv);
        if (SvTYPE((SV*)maybe_fields) == SVt_PVHV) {
            doc = Kino_Indexer_Get_Stock_Doc(self);
            Kino_Doc_Set_Fields(doc, maybe_fields);
        }
    }
    if (!doc) {
        THROW(KINO_ERR, "Need either a hashref or a %o",
            Kino_VTable_Get_Name(KINO_DOC));
    }

    Kino_Indexer_Add_Doc(self, doc, boost);
}
END_XS_CODE

my $synopsis = <<'END_SYNOPSIS';
    my $indexer = KinoSearch::Index::Indexer->new(
        schema => $schema,
        index  => '/path/to/index',
        create => 1,
    );
    while ( my ( $title, $content ) = each %source_docs ) {
        $indexer->add_doc({
            title   => $title,
            content => $content,
        });
    }
    $indexer->commit;
END_SYNOPSIS

my $constructor = <<'END_NEW';



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