/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define C_LUCY_RAWPOSTING
#define C_LUCY_RAWPOSTINGWRITER
#define C_LUCY_TERMINFO
#include "Lucy/Util/ToolSet.h"
#include <string.h>
#include "Lucy/Index/Posting/RawPosting.h"
#include "Lucy/Index/PolyReader.h"
#include "Lucy/Index/Segment.h"
#include "Lucy/Index/Snapshot.h"
#include "Lucy/Index/TermInfo.h"
#include "Lucy/Plan/Schema.h"
#include "Lucy/Store/OutStream.h"
#include "Lucy/Util/StringHelper.h"
RawPosting RAWPOSTING_BLANK = {
RAWPOSTING,
{1}, // ref.count
0, // doc_id
1, // freq
0, // content_len
0, // aux_len
{ '\0' } // blob
};
RawPosting*
RawPost_new(void *pre_allocated_memory, int32_t doc_id, uint32_t freq,
char *term_text, size_t term_text_len) {
RawPosting *self = (RawPosting*)pre_allocated_memory;
self->vtable = RAWPOSTING;
self->ref.count = 1; // never used
self->doc_id = doc_id;
self->freq = freq;
self->content_len = term_text_len;
self->aux_len = 0;
memcpy(&self->blob, term_text, term_text_len);
return self;
}
void
RawPost_destroy(RawPosting *self) {
UNUSED_VAR(self);
THROW(ERR, "Illegal attempt to destroy RawPosting object");
}
uint32_t
RawPost_get_refcount(RawPosting* self) {
UNUSED_VAR(self);
return 1;
}
RawPosting*
RawPost_inc_refcount(RawPosting* self) {
return self;
}
uint32_t
RawPost_dec_refcount(RawPosting* self) {
UNUSED_VAR(self);
return 1;
}
/***************************************************************************/
RawPostingWriter*
RawPostWriter_new(Schema *schema, Snapshot *snapshot, Segment *segment,
PolyReader *polyreader, OutStream *outstream) {
RawPostingWriter *self
= (RawPostingWriter*)VTable_Make_Obj(RAWPOSTINGWRITER);
return RawPostWriter_init(self, schema, snapshot, segment, polyreader,
outstream);
}
RawPostingWriter*
RawPostWriter_init(RawPostingWriter *self, Schema *schema,
Snapshot *snapshot, Segment *segment,
PolyReader *polyreader, OutStream *outstream) {
const int32_t invalid_field_num = 0;
PostWriter_init((PostingWriter*)self, schema, snapshot, segment,
polyreader, invalid_field_num);
self->outstream = (OutStream*)INCREF(outstream);
self->last_doc_id = 0;
return self;
}
void
RawPostWriter_start_term(RawPostingWriter *self, TermInfo *tinfo) {
self->last_doc_id = 0;
tinfo->post_filepos = OutStream_Tell(self->outstream);
}
void
RawPostWriter_update_skip_info(RawPostingWriter *self, TermInfo *tinfo) {
tinfo->post_filepos = OutStream_Tell(self->outstream);
}
void
RawPostWriter_destroy(RawPostingWriter *self) {
DECREF(self->outstream);
SUPER_DESTROY(self, RAWPOSTINGWRITER);
}
void
RawPostWriter_write_posting(RawPostingWriter *self, RawPosting *posting) {
OutStream *const outstream = self->outstream;
const int32_t doc_id = posting->doc_id;
const uint32_t delta_doc = doc_id - self->last_doc_id;
char *const aux_content = posting->blob + posting->content_len;
if (posting->freq == 1) {
const uint32_t doc_code = (delta_doc << 1) | 1;
OutStream_Write_C32(outstream, doc_code);
}
else {
const uint32_t doc_code = delta_doc << 1;
OutStream_Write_C32(outstream, doc_code);
OutStream_Write_C32(outstream, posting->freq);
}
OutStream_Write_Bytes(outstream, aux_content, posting->aux_len);
self->last_doc_id = doc_id;
}