KinoSearch1
view release on metacpan or search on metacpan
lib/KinoSearch1/Search/BooleanScorer.pm view on Meta::CPAN
package KinoSearch1::Search::BooleanScorer;
use strict;
use warnings;
use KinoSearch1::Util::ToolSet;
use base qw( KinoSearch1::Search::Scorer );
BEGIN { __PACKAGE__->init_instance_vars() }
our %instance_vars;
sub new {
my $self = shift->SUPER::new;
confess kerror() unless verify_args( \%instance_vars, @_ );
my %args = ( %instance_vars, @_ );
$self->set_similarity( $args{similarity} );
$self->_init_child;
return $self;
}
1;
__END__
__XS__
MODULE = KinoSearch1 PACKAGE = KinoSearch1::Search::BooleanScorer
void
_init_child(scorer)
Scorer *scorer;
PPCODE:
Kino1_BoolScorer_init_child(scorer);
=for comment
Add a scorer for a sub-query of the BooleanQuery.
=cut
void
add_subscorer(scorer, subscorer_sv, occur)
Scorer *scorer;
SV *subscorer_sv;
char *occur;
PREINIT:
BoolScorerChild* child;
Scorer *subscorer;
SV *subscorer_sv_copy;
PPCODE:
child = (BoolScorerChild*)scorer->child;
Kino1_extract_struct(subscorer_sv, subscorer,
Scorer*, "KinoSearch1::Search::Scorer");
subscorer_sv_copy = newSVsv(subscorer_sv);
av_push(child->subscorers_av, subscorer_sv_copy);
Kino1_BoolScorer_add_subscorer(scorer, subscorer, occur);
SV*
_boolean_scorer_set_or_get(scorer, ...)
Scorer* scorer;
ALIAS:
_get_subscorer_storage = 2
CODE:
{
BoolScorerChild* child = (BoolScorerChild*)scorer->child;
KINO_START_SET_OR_GET_SWITCH
case 2: RETVAL = newRV((SV*)child->subscorers_av);
break;
KINO_END_SET_OR_GET_SWITCH
}
OUTPUT: RETVAL
void
DESTROY(scorer)
Scorer *scorer;
PPCODE:
Kino1_BoolScorer_destroy(scorer);
__H__
#ifndef H_KINO_BOOLEAN_SCORER
#define H_KINO_BOOLEAN_SCORER 1
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "KinoSearch1SearchScorer.h"
#include "KinoSearch1UtilMemManager.h"
#define KINO_MATCH_BATCH_SIZE (1 << 11)
#define KINO_MATCH_BATCH_DOC_MASK (KINO_MATCH_BATCH_SIZE - 1)
/* A MatchBatch can hold scoring data for 2048 documents. */
typedef struct matchbatch {
U32 count;
float *scores;
U32 *matcher_counts;
U32 *bool_masks;
U32 *recent_docs;
} MatchBatch;
typedef struct boolsubscorer {
Scorer *scorer;
U32 bool_mask;
bool done;
struct boolsubscorer *next_subscorer;
} BoolSubScorer;
typedef struct boolscorerchild {
U32 doc;
U32 end;
U32 max_coord;
float *coord_factors;
U32 required_mask;
U32 prohibited_mask;
U32 next_mask;
MatchBatch *mbatch;
BoolSubScorer *subscorers; /* linked list */
AV *subscorers_av;
} BoolScorerChild;
void Kino1_BoolScorer_init_child(Scorer*);
MatchBatch* Kino1_BoolScorer_new_mbatch();
void Kino1_BoolScorer_clear_mbatch(MatchBatch*);
void Kino1_BoolScorer_compute_coord_factors(Scorer*);
void Kino1_BoolScorer_add_subscorer(Scorer*, Scorer*, char*);
bool Kino1_BoolScorer_next(Scorer*);
float Kino1_BoolScorer_score(Scorer*);
U32 Kino1_BoolScorer_doc(Scorer*);
void Kino1_BoolScorer_destroy(Scorer*);
#endif /* include guard */
__C__
( run in 0.808 second using v1.01-cache-2.11-cpan-5511b514fd6 )