void Inverter_Invert_Doc_IMP(Inverter *self, Doc *doc) { InverterIVARS *const ivars = Inverter_IVARS(self); Hash *const fields = (Hash*)Doc_Get_Fields(doc); // Prepare for the new doc. Inverter_Set_Doc(self, doc); // Extract and invert the doc's fields. HashIterator *iter = HashIter_new(fields); while (HashIter_Next(iter)) { String *field = HashIter_Get_Key(iter); Obj *obj = HashIter_Get_Value(iter); InverterEntry *inventry = S_fetch_entry(ivars, field); InverterEntryIVARS *inventry_ivars = InvEntry_IVARS(inventry); FieldType *type = inventry_ivars->type; // Get the field value. switch (FType_Primitive_ID(type) & FType_PRIMITIVE_ID_MASK) { case FType_TEXT: { CERTIFY(obj, STRING); break; } case FType_BLOB: { CERTIFY(obj, BLOB); break; } case FType_INT32: case FType_INT64: { CERTIFY(obj, INTEGER); break; } case FType_FLOAT32: case FType_FLOAT64: { CERTIFY(obj, FLOAT); break; } default: THROW(ERR, "Unrecognized type: %o", type); } if (inventry_ivars->value != obj) { DECREF(inventry_ivars->value); inventry_ivars->value = INCREF(obj); } Inverter_Add_Field(self, inventry); } DECREF(iter); }
void Inverter_invert_doc(Inverter *self, Doc *doc) { InverterIVARS *const ivars = Inverter_IVARS(self); Hash *const fields = (Hash*)Doc_Get_Fields(doc); uint32_t num_keys = Hash_Iterate(fields); // Prepare for the new doc. Inverter_Set_Doc(self, doc); // Extract and invert the doc's fields. while (num_keys--) { Obj *key, *obj; Hash_Next(fields, &key, &obj); CharBuf *field = (CharBuf*)CERTIFY(key, CHARBUF); InverterEntry *inventry = S_fetch_entry(ivars, field); InverterEntryIVARS *inventry_ivars = InvEntry_IVARS(inventry); FieldType *type = inventry_ivars->type; // Get the field value. switch (FType_Primitive_ID(type) & FType_PRIMITIVE_ID_MASK) { case FType_TEXT: { CharBuf *char_buf = (CharBuf*)CERTIFY(obj, CHARBUF); ViewCharBuf *value = (ViewCharBuf*)inventry_ivars->value; ViewCB_Assign(value, char_buf); break; } case FType_BLOB: { ByteBuf *byte_buf = (ByteBuf*)CERTIFY(obj, BYTEBUF); ViewByteBuf *value = (ViewByteBuf*)inventry_ivars->value; ViewBB_Assign(value, byte_buf); break; } case FType_INT32: { int32_t int_val = (int32_t)Obj_To_I64(obj); Integer32* value = (Integer32*)inventry_ivars->value; Int32_Set_Value(value, int_val); break; } case FType_INT64: { int64_t int_val = Obj_To_I64(obj); Integer64* value = (Integer64*)inventry_ivars->value; Int64_Set_Value(value, int_val); break; } case FType_FLOAT32: { float float_val = (float)Obj_To_F64(obj); Float32* value = (Float32*)inventry_ivars->value; Float32_Set_Value(value, float_val); break; } case FType_FLOAT64: { double float_val = Obj_To_F64(obj); Float64* value = (Float64*)inventry_ivars->value; Float64_Set_Value(value, float_val); break; } default: THROW(ERR, "Unrecognized type: %o", type); } Inverter_Add_Field(self, inventry); } }
void LUCY_Inverter_Invert_Doc_IMP(lucy_Inverter *self, lucy_Doc *doc) { dTHX; HV *const fields = (HV*)LUCY_Doc_Get_Fields(doc); I32 num_keys = hv_iterinit(fields); // Prepare for the new doc. LUCY_Inverter_Set_Doc(self, doc); // Extract and invert the doc's fields. while (num_keys--) { HE *hash_entry = hv_iternext(fields); lucy_InverterEntry *inv_entry = S_fetch_entry(aTHX_ self, hash_entry); SV *value_sv = HeVAL(hash_entry); lucy_InverterEntryIVARS *const entry_ivars = lucy_InvEntry_IVARS(inv_entry); lucy_FieldType *type = entry_ivars->type; cfish_Obj *obj = NULL; // Get the field value, forcing text fields to UTF-8. switch (LUCY_FType_Primitive_ID(type) & lucy_FType_PRIMITIVE_ID_MASK) { case lucy_FType_TEXT: { STRLEN val_len; char *val_ptr = SvPVutf8(value_sv, val_len); obj = (cfish_Obj*)cfish_Str_new_wrap_trusted_utf8(val_ptr, val_len); break; } case lucy_FType_BLOB: { STRLEN val_len; char *val_ptr = SvPV(value_sv, val_len); obj = (cfish_Obj*)cfish_Blob_new_wrap(val_ptr, val_len); break; } case lucy_FType_INT32: { obj = (cfish_Obj*)cfish_Int_new(SvIV(value_sv)); break; } case lucy_FType_INT64: { // nwellnhof: Using SvNOK could avoid a int/float/int // round-trip with 32-bit IVs. int64_t val = sizeof(IV) == 8 ? SvIV(value_sv) : (int64_t)SvNV(value_sv); // lossy obj = (cfish_Obj*)cfish_Int_new(val); break; } case lucy_FType_FLOAT32: case lucy_FType_FLOAT64: { obj = (cfish_Obj*)cfish_Float_new(SvNV(value_sv)); break; } default: THROW(CFISH_ERR, "Unrecognized type: %o", type); } CFISH_DECREF(entry_ivars->value); entry_ivars->value = obj; LUCY_Inverter_Add_Field(self, inv_entry); } }