#ifndef H_KINO_BOOLEANSCORER
#define H_KINO_BOOLEANSCORER 1

#include "KinoSearch/Search/Scorer.r"

struct kino_Similarity;
struct kino_Tally;
struct kino_VArray;

typedef struct kino_BooleanScorer kino_BooleanScorer;
typedef struct KINO_BOOLEANSCORER_VTABLE KINO_BOOLEANSCORER_VTABLE;

KINO_CLASS("KinoSearch::Search::BooleanScorer", "BoolScorer",
    "KinoSearch::Search::Scorer");

struct kino_BooleanScorer {
    KINO_BOOLEANSCORER_VTABLE *_;
    KINO_SCORER_MEMBER_VARS;
    struct kino_Scorer         *scorer; /**< configurable internal Scorer */
    struct kino_Tally          *tally;
    struct kino_VArray         *and_scorers;
    struct kino_VArray         *or_scorers;
    struct kino_VArray         *not_scorers;
    chy_u32_t                   max_coord;
    float                      *coord_factors;
    kino_Scorer_next_t          do_next;
    kino_Scorer_skip_to_t       do_skip_to;
    chy_bool_t                  first_time;
};

/* Constructor.
 */
kino_BooleanScorer* 
kino_BoolScorer_new(struct kino_Similarity *sim);

void
kino_BoolScorer_destroy(kino_BooleanScorer *self);
KINO_METHOD("Kino_BoolScorer_Destroy");

chy_bool_t
kino_BoolScorer_next(kino_BooleanScorer *self);
KINO_METHOD("Kino_BoolScorer_Next");

chy_bool_t
kino_BoolScorer_skip_to(kino_BooleanScorer *self, chy_u32_t target);
KINO_METHOD("Kino_BoolScorer_Skip_To");

struct kino_Tally*
kino_BoolScorer_tally(kino_BooleanScorer *self);
KINO_METHOD("Kino_BoolScorer_Tally");

chy_u32_t 
kino_BoolScorer_doc(kino_BooleanScorer *self);
KINO_METHOD("Kino_BoolScorer_Doc");

/* Add a scorer for a sub-query.
 */
void
kino_BoolScorer_add_subscorer(kino_BooleanScorer* self, 
                              kino_Scorer* subscorer, 
                              const struct kino_ByteBuf *occur);
KINO_METHOD("Kino_BoolScorer_Add_Subscorer");

KINO_END_CLASS

#endif /* H_KINO_BOOLEANSCORER */

/* Copyright 2005-2007 Marvin Humphrey
 *
 * This program is free software; you can redistribute it and/or modify
 * under the same terms as Perl itself.
 */