SortWriter* SortWriter_init(SortWriter *self, Schema *schema, Snapshot *snapshot, Segment *segment, PolyReader *polyreader) { uint32_t field_max = Schema_Num_Fields(schema) + 1; DataWriter_init((DataWriter*)self, schema, snapshot, segment, polyreader); SortWriterIVARS *const ivars = SortWriter_IVARS(self); // Init. ivars->field_writers = Vec_new(field_max); ivars->counts = Hash_new(0); ivars->null_ords = Hash_new(0); ivars->ord_widths = Hash_new(0); ivars->temp_ord_out = NULL; ivars->temp_ix_out = NULL; ivars->temp_dat_out = NULL; ivars->counter = Counter_new(); ivars->mem_thresh = default_mem_thresh; ivars->flush_at_finish = false; return self; }
static void S_flip_run(SortFieldWriter *run, size_t sub_thresh, InStream *ord_in, InStream *ix_in, InStream *dat_in) { SortFieldWriterIVARS *const run_ivars = SortFieldWriter_IVARS(run); if (run_ivars->flipped) { THROW(ERR, "Can't Flip twice"); } run_ivars->flipped = true; // Get our own slice of mem_thresh. DECREF(run_ivars->counter); run_ivars->counter = Counter_new(); run_ivars->mem_thresh = sub_thresh; // Done if we already have a SortCache to read from. if (run_ivars->sort_cache) { return; } // Open the temp files for reading. String *seg_name = Seg_Get_Name(run_ivars->segment); String *ord_alias = Str_newf("%o/sort_ord_temp-%i64-to-%i64", seg_name, run_ivars->ord_start, run_ivars->ord_end); InStream *ord_in_dupe = InStream_Reopen(ord_in, ord_alias, run_ivars->ord_start, run_ivars->ord_end - run_ivars->ord_start); DECREF(ord_alias); InStream *ix_in_dupe = NULL; if (run_ivars->var_width) { String *ix_alias = Str_newf("%o/sort_ix_temp-%i64-to-%i64", seg_name, run_ivars->ix_start, run_ivars->ix_end); ix_in_dupe = InStream_Reopen(ix_in, ix_alias, run_ivars->ix_start, run_ivars->ix_end - run_ivars->ix_start); DECREF(ix_alias); } String *dat_alias = Str_newf("%o/sort_dat_temp-%i64-to-%i64", seg_name, run_ivars->dat_start, run_ivars->dat_end); InStream *dat_in_dupe = InStream_Reopen(dat_in, dat_alias, run_ivars->dat_start, run_ivars->dat_end - run_ivars->dat_start); DECREF(dat_alias); // Get a SortCache. String *field = Seg_Field_Name(run_ivars->segment, run_ivars->field_num); switch (run_ivars->prim_id & FType_PRIMITIVE_ID_MASK) { case FType_TEXT: run_ivars->sort_cache = (SortCache*)TextSortCache_new( field, run_ivars->type, run_ivars->run_cardinality, run_ivars->run_max, run_ivars->null_ord, run_ivars->ord_width, ord_in_dupe, ix_in_dupe, dat_in_dupe); break; case FType_INT32: run_ivars->sort_cache = (SortCache*)I32SortCache_new( field, run_ivars->type, run_ivars->run_cardinality, run_ivars->run_max, run_ivars->null_ord, run_ivars->ord_width, ord_in_dupe, dat_in_dupe); break; case FType_INT64: run_ivars->sort_cache = (SortCache*)I64SortCache_new( field, run_ivars->type, run_ivars->run_cardinality, run_ivars->run_max, run_ivars->null_ord, run_ivars->ord_width, ord_in_dupe, dat_in_dupe); break; case FType_FLOAT32: run_ivars->sort_cache = (SortCache*)F32SortCache_new( field, run_ivars->type, run_ivars->run_cardinality, run_ivars->run_max, run_ivars->null_ord, run_ivars->ord_width, ord_in_dupe, dat_in_dupe); break; case FType_FLOAT64: run_ivars->sort_cache = (SortCache*)F64SortCache_new( field, run_ivars->type, run_ivars->run_cardinality, run_ivars->run_max, run_ivars->null_ord, run_ivars->ord_width, ord_in_dupe, dat_in_dupe); break; default: THROW(ERR, "No SortCache class for %o", run_ivars->type); } DECREF(ord_in_dupe); DECREF(ix_in_dupe); DECREF(dat_in_dupe); }