#include "KinoSearch/Util/ToolSet.h"

#include <stdio.h>

#define KINO_WANT_TERMVECTORSREADER_VTABLE
#include "KinoSearch/Index/TermVectorsReader.r"

#include "KinoSearch/Schema.r"
#include "KinoSearch/Index/SegInfo.r"
#include "KinoSearch/Store/InStream.r"
#include "KinoSearch/Store/OutStream.r"
#include "KinoSearch/Store/Folder.r"
#include "KinoSearch/Util/Native.r"
#include "KinoSearch/Util/IntMap.r"


TermVectorsReader*
TVReader_new(Schema *schema, Folder *folder, SegInfo *seg_info)
{
    ByteBuf *filename = BB_CLONE(seg_info->seg_name);
    CREATE(self, TermVectorsReader, TERMVECTORSREADER);

    /* assign */
    self->schema      = REFCOUNT_INC(schema);
    self->folder      = REFCOUNT_INC(folder);
    self->seg_info    = REFCOUNT_INC(seg_info);

    /* open instreams */
    BB_Cat_Str(filename, ".tv", 3);
    self->tv_in  = Folder_Open_InStream(folder, filename);
    BB_Cat_Str(filename, "x", 1);
    self->tvx_in = Folder_Open_InStream(folder, filename);
    REFCOUNT_DEC(filename);

    return self;
}

void
TVReader_destroy(TermVectorsReader *self)
{
    REFCOUNT_DEC(self->schema);
    REFCOUNT_DEC(self->folder);
    REFCOUNT_DEC(self->seg_info);
    REFCOUNT_DEC(self->tv_in);
    REFCOUNT_DEC(self->tvx_in);
    free(self);
}

void
TVReader_read_record(TermVectorsReader *self, i32_t doc_num, ByteBuf *target)
{
    u64_t filepos;
    u32_t len;
    InStream *tv_in  = self->tv_in;
    InStream *tvx_in = self->tvx_in;

    InStream_SSeek(tvx_in, doc_num * 16);
    filepos = InStream_Read_Long(tvx_in);
    len     = InStream_Read_Long(tvx_in);

    BB_GROW(target, len);

    /* copy the whole record */
    InStream_SSeek(tv_in, filepos);
    InStream_Read_Bytes(tv_in, target->ptr, len);
    target->len = len;
}

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