#ifndef H_KINO_TERMVECTORSWRITER
#define H_KINO_TERMVECTORSWRITER 1

#include "KinoSearch/Util/Obj.r"

struct kino_InvIndex;
struct kino_SegInfo;
struct kino_ByteBuf;
struct kino_DocVector;
struct kino_TermVectorsReader;
struct kino_TokenBatch;
struct kino_IntMap;

typedef struct kino_TermVectorsWriter kino_TermVectorsWriter;
typedef struct KINO_TERMVECTORSWRITER_VTABLE KINO_TERMVECTORSWRITER_VTABLE;

#define KINO_TVWRITER_FORMAT 1

KINO_FINAL_CLASS("KinoSearch::Index::TermVectorsWriter", "TVWriter", 
    "KinoSearch::Util::Obj");

struct kino_TermVectorsWriter {
    KINO_TERMVECTORSWRITER_VTABLE *_;
    KINO_OBJ_MEMBER_VARS;
    struct kino_InvIndex  *invindex;
    struct kino_SegInfo   *seg_info;
    struct kino_OutStream *tv_out;
    struct kino_OutStream *tvx_out;
};

/* Constructor.
 */
kino_TermVectorsWriter*
kino_TVWriter_new(struct kino_InvIndex *invindex, 
                  struct kino_SegInfo *seg_info);

void
kino_TVWriter_add_segment(kino_TermVectorsWriter *self, 
                          struct kino_TermVectorsReader *tv_reader,
                          struct kino_IntMap *doc_map,
                          chy_u32_t max_doc);
KINO_METHOD("Kino_TVWriter_Add_Segment");

/* Complete writing the segment.  If [doc_remap] is non-NULL, use it to remap
 * document numbers.
 */
void
kino_TVWriter_finish(kino_TermVectorsWriter *self, 
                     struct kino_IntMap *doc_remap);
KINO_METHOD("Kino_TVWriter_Finish");

struct kino_ByteBuf*
kino_TVWriter_tv_string(kino_TermVectorsWriter *self, 
                        struct kino_TokenBatch *batch);
KINO_METHOD("Kino_TVWriter_TV_String");

void
kino_TVWriter_destroy(kino_TermVectorsWriter *self);
KINO_METHOD("Kino_TVWriter_Destroy");

KINO_END_CLASS

#ifdef KINO_USE_SHORT_NAMES
  #define TVWRITER_FORMAT KINO_TVWRITER_FORMAT
#endif

#endif /* H_KINO_TERMVECTORSWRITER */

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