TextSortCache* TextSortCache_init(TextSortCache *self, String *field, FieldType *type, int32_t cardinality, int32_t doc_max, int32_t null_ord, int32_t ord_width, InStream *ord_in, InStream *ix_in, InStream *dat_in) { // Validate. if (!type || !FType_Sortable(type)) { DECREF(self); THROW(ERR, "'%o' isn't a sortable field", field); } // Memory map ords and super-init. int64_t ord_len = InStream_Length(ord_in); const void *ords = InStream_Buf(ord_in, (size_t)ord_len); SortCache_init((SortCache*)self, field, type, ords, cardinality, doc_max, null_ord, ord_width); TextSortCacheIVARS *const ivars = TextSortCache_IVARS(self); // Validate ords file length. double bytes_per_doc = ivars->ord_width / 8.0; double max_ords = ord_len / bytes_per_doc; if (max_ords < ivars->doc_max + 1) { WARN("ORD WIDTH: %i32 %i32", ord_width, ivars->ord_width); THROW(ERR, "Conflict between ord count max %f64 and doc_max %i32 for " "field %o", max_ords, doc_max, field); } // Assign. ivars->ord_in = (InStream*)INCREF(ord_in); ivars->ix_in = (InStream*)INCREF(ix_in); ivars->dat_in = (InStream*)INCREF(dat_in); 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; }
SortCache* SortCache_new(Schema *schema, Folder *folder, Segment *segment, i32_t field_num) { SortCache *self = (SortCache*)VTable_Make_Obj(&SORTCACHE); return SortCache_init(self, schema, folder, segment, field_num); }