InverterEntry* InvEntry_init(InverterEntry *self, Schema *schema, String *field, int32_t field_num) { InverterEntryIVARS *const ivars = InvEntry_IVARS(self); ivars->field_num = field_num; ivars->field = field ? Str_Clone(field) : NULL; ivars->inversion = NULL; if (schema) { ivars->analyzer = (Analyzer*)INCREF(Schema_Fetch_Analyzer(schema, field)); ivars->sim = (Similarity*)INCREF(Schema_Fetch_Sim(schema, field)); ivars->type = (FieldType*)INCREF(Schema_Fetch_Type(schema, field)); if (!ivars->type) { THROW(ERR, "Unknown field: '%o'", field); } uint8_t prim_id = FType_Primitive_ID(ivars->type); switch (prim_id & FType_PRIMITIVE_ID_MASK) { case FType_TEXT: ivars->value = NULL; break; case FType_BLOB: ivars->value = (Obj*)ViewBB_new(NULL, 0); break; case FType_INT32: ivars->value = (Obj*)Int32_new(0); break; case FType_INT64: ivars->value = (Obj*)Int64_new(0); break; case FType_FLOAT32: ivars->value = (Obj*)Float32_new(0); break; case FType_FLOAT64: ivars->value = (Obj*)Float64_new(0); break; default: THROW(ERR, "Unrecognized primitive id: %i8", prim_id); } ivars->indexed = FType_Indexed(ivars->type); if (ivars->indexed && FType_Is_A(ivars->type, NUMERICTYPE)) { THROW(ERR, "Field '%o' spec'd as indexed, but numerical types cannot " "be indexed yet", field); } if (FType_Is_A(ivars->type, FULLTEXTTYPE)) { ivars->highlightable = FullTextType_Highlightable((FullTextType*)ivars->type); } } return self; }
NumericSortCache* NumSortCache_init(NumericSortCache *self, const CharBuf *field, FieldType *type, int32_t cardinality, int32_t doc_max, int32_t null_ord, int32_t ord_width, InStream *ord_in, InStream *dat_in) { // Validate. if (!type || !FType_Sortable(type) || !FType_Is_A(type, NUMERICTYPE)) { DECREF(self); THROW(ERR, "'%o' isn't a sortable NumericType field", field); } // Mmap ords and super-init. int64_t ord_len = InStream_Length(ord_in); void *ords = InStream_Buf(ord_in, (size_t)ord_len); SortCache_init((SortCache*)self, field, type, ords, cardinality, doc_max, null_ord, ord_width); // Assign. self->ord_in = (InStream*)INCREF(ord_in); self->dat_in = (InStream*)INCREF(dat_in); // Validate ord file length. double BITS_PER_BYTE = 8.0; double docs_per_byte = BITS_PER_BYTE / self->ord_width; double max_ords = ord_len * docs_per_byte; if (max_ords < self->doc_max + 1) { DECREF(self); THROW(ERR, "Conflict between ord count max %f64 and doc_max %i32 for " "field %o", max_ords, self->doc_max, field); } ABSTRACT_CLASS_CHECK(self, NUMERICSORTCACHE); return self; }
void Indexer_delete_by_term(Indexer *self, CharBuf *field, Obj *term) { Schema *schema = self->schema; FieldType *type = Schema_Fetch_Type(schema, field); // Raise exception if the field isn't indexed. if (!type || !FType_Indexed(type)) THROW(ERR, "%o is not an indexed field", field); // Analyze term if appropriate, then zap. if (FType_Is_A(type, FULLTEXTTYPE)) { CERTIFY(term, CHARBUF); { Analyzer *analyzer = Schema_Fetch_Analyzer(schema, field); VArray *terms = Analyzer_Split(analyzer, (CharBuf*)term); Obj *analyzed_term = VA_Fetch(terms, 0); if (analyzed_term) { DelWriter_Delete_By_Term(self->del_writer, field, analyzed_term); } DECREF(terms); } } else { DelWriter_Delete_By_Term(self->del_writer, field, term); } }
void HLWriter_Add_Inverted_Doc_IMP(HighlightWriter *self, Inverter *inverter, int32_t doc_id) { HighlightWriterIVARS *const ivars = HLWriter_IVARS(self); OutStream *dat_out = S_lazy_init(self); OutStream *ix_out = ivars->ix_out; int64_t filepos = OutStream_Tell(dat_out); uint32_t num_highlightable = 0; int32_t expected = (int32_t)(OutStream_Tell(ix_out) / 8); // Verify doc id. if (doc_id != expected) { THROW(ERR, "Expected doc id %i32 but got %i32", expected, doc_id); } // Write index data. OutStream_Write_I64(ix_out, filepos); // Count, then write number of highlightable fields. Inverter_Iterate(inverter); while (Inverter_Next(inverter)) { FieldType *type = Inverter_Get_Type(inverter); if (FType_Is_A(type, FULLTEXTTYPE) && FullTextType_Highlightable((FullTextType*)type) ) { num_highlightable++; } } OutStream_Write_C32(dat_out, num_highlightable); Inverter_Iterate(inverter); while (Inverter_Next(inverter)) { FieldType *type = Inverter_Get_Type(inverter); if (FType_Is_A(type, FULLTEXTTYPE) && FullTextType_Highlightable((FullTextType*)type) ) { String *field = Inverter_Get_Field_Name(inverter); Inversion *inversion = Inverter_Get_Inversion(inverter); ByteBuf *tv_buf = HLWriter_TV_Buf(self, inversion); Freezer_serialize_string(field, dat_out); Freezer_serialize_bytebuf(tv_buf, dat_out); DECREF(tv_buf); } } }