blob: 8ad0bcf3e4169fc3a90dd27726fc9d2e134cf5f5 [file] [log] [blame]
/* 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_TERMVECTOR
#define C_LUCY_I32ARRAY
#include "Lucy/Util/ToolSet.h"
#include "Lucy/Index/TermVector.h"
#include "Lucy/Store/InStream.h"
#include "Lucy/Store/OutStream.h"
#include "Lucy/Util/Freezer.h"
TermVector*
TV_new(String *field, String *text, I32Array *positions,
I32Array *start_offsets, I32Array *end_offsets) {
TermVector *self = (TermVector*)Class_Make_Obj(TERMVECTOR);
return TV_init(self, field, text, positions, start_offsets, end_offsets);
}
TermVector*
TV_init(TermVector *self, String *field, String *text,
I32Array *positions, I32Array *start_offsets, I32Array *end_offsets) {
TermVectorIVARS *const ivars = TV_IVARS(self);
// Assign.
ivars->field = Str_Clone(field);
ivars->text = Str_Clone(text);
ivars->num_pos = I32Arr_Get_Size(positions);
ivars->positions = (I32Array*)INCREF(positions);
ivars->start_offsets = (I32Array*)INCREF(start_offsets);
ivars->end_offsets = (I32Array*)INCREF(end_offsets);
if (I32Arr_Get_Size(start_offsets) != ivars->num_pos
|| I32Arr_Get_Size(end_offsets) != ivars->num_pos
) {
THROW(ERR, "Unbalanced arrays: %u64 %u64 %u64",
(uint64_t)ivars->num_pos,
(uint64_t)I32Arr_Get_Size(start_offsets),
(uint64_t)I32Arr_Get_Size(end_offsets));
}
return self;
}
void
TV_Destroy_IMP(TermVector *self) {
TermVectorIVARS *const ivars = TV_IVARS(self);
DECREF(ivars->field);
DECREF(ivars->text);
DECREF(ivars->positions);
DECREF(ivars->start_offsets);
DECREF(ivars->end_offsets);
SUPER_DESTROY(self, TERMVECTOR);
}
I32Array*
TV_Get_Positions_IMP(TermVector *self) {
return TV_IVARS(self)->positions;
}
I32Array*
TV_Get_Start_Offsets_IMP(TermVector *self) {
return TV_IVARS(self)->start_offsets;
}
I32Array*
TV_Get_End_Offsets_IMP(TermVector *self) {
return TV_IVARS(self)->end_offsets;
}
void
TV_Serialize_IMP(TermVector *self, OutStream *target) {
TermVectorIVARS *const ivars = TV_IVARS(self);
int32_t *posits = I32Arr_IVARS(ivars->positions)->ints;
int32_t *starts = I32Arr_IVARS(ivars->start_offsets)->ints;
int32_t *ends = I32Arr_IVARS(ivars->start_offsets)->ints;
Freezer_serialize_string(ivars->field, target);
Freezer_serialize_string(ivars->text, target);
OutStream_Write_CU64(target, ivars->num_pos);
for (size_t i = 0; i < ivars->num_pos; i++) {
OutStream_Write_CI32(target, posits[i]);
OutStream_Write_CI32(target, starts[i]);
OutStream_Write_CI32(target, ends[i]);
}
}
TermVector*
TV_Deserialize_IMP(TermVector *self, InStream *instream) {
String *field = Freezer_read_string(instream);
String *text = Freezer_read_string(instream);
size_t num_pos = InStream_Read_CU64(instream);
// Read positional data.
int32_t *posits = (int32_t*)MALLOCATE(num_pos * sizeof(int32_t));
int32_t *starts = (int32_t*)MALLOCATE(num_pos * sizeof(int32_t));
int32_t *ends = (int32_t*)MALLOCATE(num_pos * sizeof(int32_t));
for (size_t i = 0; i < num_pos; i++) {
posits[i] = InStream_Read_CI32(instream);
starts[i] = InStream_Read_CI32(instream);
ends[i] = InStream_Read_CI32(instream);
}
I32Array *positions = I32Arr_new_steal(posits, num_pos);
I32Array *start_offsets = I32Arr_new_steal(starts, num_pos);
I32Array *end_offsets = I32Arr_new_steal(ends, num_pos);
TV_init(self, field, text, positions, start_offsets, end_offsets);
DECREF(positions);
DECREF(start_offsets);
DECREF(end_offsets);
DECREF(text);
DECREF(field);
return self;
}
bool
TV_Equals_IMP(TermVector *self, Obj *other) {
if ((TermVector*)other == self) { return true; }
TermVectorIVARS *const ivars = TV_IVARS(self);
TermVectorIVARS *const ovars = TV_IVARS((TermVector*)other);
if (!Str_Equals(ivars->field, (Obj*)ovars->field)) { return false; }
if (!Str_Equals(ivars->text, (Obj*)ovars->text)) { return false; }
if (ivars->num_pos != ovars->num_pos) { return false; }
int32_t *const posits = I32Arr_IVARS(ivars->positions)->ints;
int32_t *const starts = I32Arr_IVARS(ivars->start_offsets)->ints;
int32_t *const ends = I32Arr_IVARS(ivars->start_offsets)->ints;
int32_t *const other_posits = I32Arr_IVARS(ovars->positions)->ints;
int32_t *const other_starts = I32Arr_IVARS(ovars->start_offsets)->ints;
int32_t *const other_ends = I32Arr_IVARS(ovars->start_offsets)->ints;
for (size_t i = 0; i < ivars->num_pos; i++) {
if (posits[i] != other_posits[i]) { return false; }
if (starts[i] != other_starts[i]) { return false; }
if (ends[i] != other_ends[i]) { return false; }
}
return true;
}