From e3c9fa8baa23c077cac7f59e99de41e8f26c89d7 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Fri, 22 May 2015 15:32:43 +0200 Subject: [PATCH 1/7] Convert call to Obj_Mimic --- core/Lucy/Plan/TextType.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/Lucy/Plan/TextType.c b/core/Lucy/Plan/TextType.c index 4552e1e28..3553641b0 100644 --- a/core/Lucy/Plan/TextType.c +++ b/core/Lucy/Plan/TextType.c @@ -65,7 +65,7 @@ void TextTermStepper_Set_Value_IMP(TextTermStepper *self, Obj *value) { TextTermStepperIVARS *const ivars = TextTermStepper_IVARS(self); CERTIFY(value, STRING); - Obj_Mimic(ivars->value, value); + CB_Mimic((CharBuf*)ivars->value, value); // Invalidate string. DECREF(ivars->string); ivars->string = NULL; From 684e52b002ae71ec2f94a6373d5b17f4ef4ac0f2 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Sat, 23 May 2015 16:35:24 +0200 Subject: [PATCH 2/7] Store number fields in documents as Perl IVs and NVs Inverter_Invert_Doc expects IVs or NVs in number fields. It would be more efficient if Clownfish::Objs were supported as well. But this matters only in the unusual case of creating documents from C space like in the test suite. --- perl/xs/Lucy/Document/Doc.c | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/perl/xs/Lucy/Document/Doc.c b/perl/xs/Lucy/Document/Doc.c index d65062d35..97ab055fe 100644 --- a/perl/xs/Lucy/Document/Doc.c +++ b/perl/xs/Lucy/Document/Doc.c @@ -60,11 +60,7 @@ LUCY_Doc_Store_IMP(lucy_Doc *self, cfish_String *field, cfish_Obj *value) { const char *key = CFISH_Str_Get_Ptr8(field); size_t key_size = CFISH_Str_Get_Size(field); SV *key_sv = newSVpvn(key, key_size); - SV *val_sv = value == NULL - ? newSV(0) - : CFISH_Obj_Is_A(value, CFISH_STRING) - ? XSBind_str_to_sv(aTHX_ (cfish_String*)value) - : (SV*)CFISH_Obj_To_Host(value); + SV *val_sv = XSBind_cfish_to_perl(aTHX_ value); SvUTF8_on(key_sv); (void)hv_store_ent((HV*)ivars->fields, key_sv, val_sv, 0); // TODO: make this a thread-local instead of creating it every time? @@ -155,17 +151,8 @@ LUCY_Doc_Extract_IMP(lucy_Doc *self, cfish_String *field) { SV **sv_ptr = hv_fetch((HV*)ivars->fields, CFISH_Str_Get_Ptr8(field), CFISH_Str_Get_Size(field), 0); - if (sv_ptr && XSBind_sv_defined(aTHX_ *sv_ptr)) { - SV *const sv = *sv_ptr; - if (sv_isobject(sv) && sv_derived_from(sv, "Clownfish::Obj")) { - IV tmp = SvIV(SvRV(sv)); - retval = CFISH_INCREF(INT2PTR(cfish_Obj*, tmp)); - } - else { - STRLEN size; - char *ptr = SvPVutf8(sv, size); - retval = (cfish_Obj*)cfish_Str_new_wrap_trusted_utf8(ptr, size); - } + if (sv_ptr) { + retval = XSBind_perl_to_cfish(aTHX_ *sv_ptr); } return retval; From dbcce56917b4fd2acba8931a9e95a56f54959511 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Sat, 23 May 2015 16:56:17 +0200 Subject: [PATCH 3/7] Make TestSortSpec store Num objects in number fields --- core/Lucy/Test/Search/TestSortSpec.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/core/Lucy/Test/Search/TestSortSpec.c b/core/Lucy/Test/Search/TestSortSpec.c index a148d9a47..dde3f3250 100644 --- a/core/Lucy/Test/Search/TestSortSpec.c +++ b/core/Lucy/Test/Search/TestSortSpec.c @@ -237,16 +237,15 @@ S_add_vehicle(Indexer *indexer, String *name, int32_t speed, int32_t sloth, Doc_Store(doc, home_str, (Obj*)home); Doc_Store(doc, cat_str, (Obj*)cat); - String *string; - string = Str_newf("%i32", speed); - Doc_Store(doc, speed_str, (Obj*)string); - DECREF(string); - string = Str_newf("%i32", sloth); - Doc_Store(doc, sloth_str, (Obj*)string); - DECREF(string); - string = Str_newf("%i32", weight); - Doc_Store(doc, weight_str, (Obj*)string); - DECREF(string); + Integer32 *speed_obj = Int32_new(speed); + Doc_Store(doc, speed_str, (Obj*)speed_obj); + DECREF(speed_obj); + Integer32 *sloth_obj = Int32_new(sloth); + Doc_Store(doc, sloth_str, (Obj*)sloth_obj); + DECREF(sloth_obj); + Integer32 *weight_obj = Int32_new(weight); + Doc_Store(doc, weight_str, (Obj*)weight_obj); + DECREF(weight_obj); Indexer_Add_Doc(indexer, doc, 1.0f); @@ -254,13 +253,13 @@ S_add_vehicle(Indexer *indexer, String *name, int32_t speed, int32_t sloth, } static void -S_add_doc(Indexer *indexer, Obj *name_obj, String *cat, String *field_name) { +S_add_doc(Indexer *indexer, Obj *value, String *cat, String *field_name) { Doc *doc = Doc_new(NULL, 0); - String *name = Obj_To_String(name_obj); + String *name = Obj_To_String(value); Doc_Store(doc, name_str, (Obj*)name); Doc_Store(doc, cat_str, (Obj*)cat); if (field_name) { - Doc_Store(doc, field_name, (Obj*)name); + Doc_Store(doc, field_name, value); } Indexer_Add_Doc(indexer, doc, 1.0f); DECREF(name); From c0ab70d3eef4932987c3bcffe0f115effb8659f0 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Sat, 23 May 2015 16:57:37 +0200 Subject: [PATCH 4/7] Switch to Num_Mimic in C version of Inverter Simplifies the code and removes calls to Obj_To_[FI]64. As a side effect, the C bindings don't accept Strings in a document's Num field anymore. --- c/src/Lucy/Index/Inverter.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/c/src/Lucy/Index/Inverter.c b/c/src/Lucy/Index/Inverter.c index 23622d8cc..efcaa5844 100644 --- a/c/src/Lucy/Index/Inverter.c +++ b/c/src/Lucy/Index/Inverter.c @@ -92,27 +92,23 @@ Inverter_Invert_Doc_IMP(Inverter *self, Doc *doc) { 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); + Int32_Mimic(value, obj); break; } case FType_INT64: { - int64_t int_val = Obj_To_I64(obj); Integer64* value = (Integer64*)inventry_ivars->value; - Int64_Set_Value(value, int_val); + Int64_Mimic(value, obj); break; } case FType_FLOAT32: { - float float_val = (float)Obj_To_F64(obj); Float32* value = (Float32*)inventry_ivars->value; - Float32_Set_Value(value, float_val); + Float32_Mimic(value, obj); break; } case FType_FLOAT64: { - double float_val = Obj_To_F64(obj); Float64* value = (Float64*)inventry_ivars->value; - Float64_Set_Value(value, float_val); + Float64_Mimic(value, obj); break; } default: From 46dd03cda42c08d049ba1413a236b9beb1598a97 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Fri, 22 May 2015 15:50:03 +0200 Subject: [PATCH 5/7] Convert calls to Obj_To_[FI]64 in Json.c --- core/Lucy/Util/Json.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/Lucy/Util/Json.c b/core/Lucy/Util/Json.c index 20a93a88e..f9b9930cc 100644 --- a/core/Lucy/Util/Json.c +++ b/core/Lucy/Util/Json.c @@ -282,10 +282,10 @@ S_to_json(Obj *dump, CharBuf *buf, int32_t depth) { S_append_json_string((String*)dump, buf); } else if (Obj_Is_A(dump, INTNUM)) { - CB_catf(buf, "%i64", Obj_To_I64(dump)); + CB_catf(buf, "%i64", IntNum_To_I64((IntNum*)dump)); } else if (Obj_Is_A(dump, FLOATNUM)) { - CB_catf(buf, "%f64", Obj_To_F64(dump)); + CB_catf(buf, "%f64", FloatNum_To_F64((FloatNum*)dump)); } else if (Obj_Is_A(dump, VECTOR)) { Vector *array = (Vector*)dump; From 8b4f06069348c6f2aff545fcc63b2bc551c7cdec Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Sat, 23 May 2015 15:11:30 +0200 Subject: [PATCH 6/7] Helper functions to extract numbers from JSON data Prepare for the removal of Obj_To_I64, Obj_To_F64, and Obj_To_Bool. --- core/Lucy/Util/Json.c | 63 +++++++++++++++++++++++++++++++++++++++++ core/Lucy/Util/Json.cfh | 18 ++++++++++++ 2 files changed, 81 insertions(+) diff --git a/core/Lucy/Util/Json.c b/core/Lucy/Util/Json.c index f9b9930cc..4b589eaa5 100644 --- a/core/Lucy/Util/Json.c +++ b/core/Lucy/Util/Json.c @@ -701,3 +701,66 @@ S_set_error(CharBuf *buf, const char *json, const char *limit, int line, Err_set_error(Err_new(mess)); } +int64_t +Json_obj_to_i64(Obj *obj) { + int64_t retval = 0; + + if (!obj) { + THROW(ERR, "Can't extract integer from NULL"); + } + else if (Obj_Is_A(obj, STRING)) { + retval = Str_To_I64((String*)obj); + } + else if (Obj_Is_A(obj, NUM)) { + retval = Num_To_I64((Num*)obj); + } + else { + THROW(ERR, "Can't extract integer from object of type %o", + Obj_Get_Class_Name(obj)); + } + + return retval; +} + +double +Json_obj_to_f64(Obj *obj) { + double retval = 0; + + if (!obj) { + THROW(ERR, "Can't extract float from NULL"); + } + else if (Obj_Is_A(obj, STRING)) { + retval = Str_To_F64((String*)obj); + } + else if (Obj_Is_A(obj, NUM)) { + retval = Num_To_F64((Num*)obj); + } + else { + THROW(ERR, "Can't extract float from object of type %o", + Obj_Get_Class_Name(obj)); + } + + return retval; +} + +bool +Json_obj_to_bool(Obj *obj) { + bool retval = false; + + if (!obj) { + THROW(ERR, "Can't extract bool from NULL"); + } + else if (Obj_Is_A(obj, STRING)) { + retval = (Str_To_I64((String*)obj) != 0); + } + else if (Obj_Is_A(obj, NUM)) { + retval = Num_To_Bool((Num*)obj); + } + else { + THROW(ERR, "Can't extract bool from object of type %o", + Obj_Get_Class_Name(obj)); + } + + return retval; +} + diff --git a/core/Lucy/Util/Json.cfh b/core/Lucy/Util/Json.cfh index ff8d32eb5..6a0e6a660 100644 --- a/core/Lucy/Util/Json.cfh +++ b/core/Lucy/Util/Json.cfh @@ -57,6 +57,24 @@ class Lucy::Util::Json inherits Clownfish::Obj { */ inert void set_tolerant(bool tolerant); + + /** Extract an integer value from an object that is part of a JSON + * structure. Throws an error if the object isn't a String or Num. + */ + inert int64_t + obj_to_i64(Obj *obj); + + /** Extract a float value from an object that is part of a JSON + * structure. Throws an error if the object isn't a String or Num. + */ + inert double + obj_to_f64(Obj *obj); + + /** Extract a bool value from an object that is part of a JSON + * structure. Throws an error if the object isn't a String or Num. + */ + inert bool + obj_to_bool(Obj *obj); } From b5c9cf9c5fea59fc25c35540fd4ca241c35087d6 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Sat, 23 May 2015 15:24:43 +0200 Subject: [PATCH 7/7] Convert calls to Obj_To_* to Json helpers --- core/Lucy/Analysis/Normalizer.c | 5 +++-- core/Lucy/Document/HitDoc.c | 3 ++- core/Lucy/Index/DeletionsReader.c | 3 ++- core/Lucy/Index/DeletionsWriter.c | 3 ++- core/Lucy/Index/DocReader.c | 3 ++- core/Lucy/Index/FilePurger.c | 3 ++- core/Lucy/Index/HighlightReader.c | 5 +++-- core/Lucy/Index/Indexer.c | 4 ++-- core/Lucy/Index/PostingListReader.c | 5 +++-- core/Lucy/Index/SegLexicon.c | 7 ++++--- core/Lucy/Index/Segment.c | 2 +- core/Lucy/Index/Snapshot.c | 4 ++-- core/Lucy/Index/SortReader.c | 9 +++++---- core/Lucy/Plan/BlobType.c | 7 ++++--- core/Lucy/Plan/FullTextType.c | 11 ++++++----- core/Lucy/Plan/NumericType.c | 9 +++++---- core/Lucy/Plan/Schema.c | 2 +- core/Lucy/Plan/StringType.c | 9 +++++---- core/Lucy/Search/NoMatchQuery.c | 3 ++- core/Lucy/Search/Query.c | 3 ++- core/Lucy/Search/RangeQuery.c | 5 +++-- core/Lucy/Store/CompoundFileReader.c | 8 ++++---- core/Lucy/Test/Store/TestCompoundFileWriter.c | 2 +- core/LucyX/Search/ProximityQuery.c | 3 ++- perl/xs/Lucy/Document/Doc.c | 3 ++- 25 files changed, 70 insertions(+), 51 deletions(-) diff --git a/core/Lucy/Analysis/Normalizer.c b/core/Lucy/Analysis/Normalizer.c index 8ea50ba8d..7f2382e3e 100644 --- a/core/Lucy/Analysis/Normalizer.c +++ b/core/Lucy/Analysis/Normalizer.c @@ -22,6 +22,7 @@ #include "Lucy/Analysis/Normalizer.h" #include "Lucy/Analysis/Token.h" #include "Lucy/Analysis/Inversion.h" +#include "Lucy/Util/Json.h" #include "utf8proc.h" @@ -154,9 +155,9 @@ Normalizer_Load_IMP(Normalizer *self, Obj *dump) { Obj *obj = Hash_Fetch_Utf8(source, "normalization_form", 18); String *form = (String*)CERTIFY(obj, STRING); obj = Hash_Fetch_Utf8(source, "case_fold", 9); - bool case_fold = Obj_To_Bool(CERTIFY(obj, OBJ)); + bool case_fold = Json_obj_to_bool(CERTIFY(obj, OBJ)); obj = Hash_Fetch_Utf8(source, "strip_accents", 13); - bool strip_accents = Obj_To_Bool(CERTIFY(obj, OBJ)); + bool strip_accents = Json_obj_to_bool(CERTIFY(obj, OBJ)); return Normalizer_init(loaded, form, case_fold, strip_accents); } diff --git a/core/Lucy/Document/HitDoc.c b/core/Lucy/Document/HitDoc.c index 391b931cb..98d3123e0 100644 --- a/core/Lucy/Document/HitDoc.c +++ b/core/Lucy/Document/HitDoc.c @@ -20,6 +20,7 @@ #include "Lucy/Document/HitDoc.h" #include "Lucy/Store/InStream.h" #include "Lucy/Store/OutStream.h" +#include "Lucy/Util/Json.h" HitDoc* HitDoc_new(void *fields, int32_t doc_id, float score) { @@ -82,7 +83,7 @@ HitDoc_Load_IMP(HitDoc *self, Obj *dump) { HitDoc *loaded = super_load(self, dump); HitDocIVARS *const loaded_ivars = HitDoc_IVARS(loaded); Obj *score = CERTIFY(Hash_Fetch_Utf8(source, "score", 5), OBJ); - loaded_ivars->score = (float)Obj_To_F64(score); + loaded_ivars->score = (float)Json_obj_to_f64(score); return loaded; } diff --git a/core/Lucy/Index/DeletionsReader.c b/core/Lucy/Index/DeletionsReader.c index 5c1ed67c8..c7118c5ca 100644 --- a/core/Lucy/Index/DeletionsReader.c +++ b/core/Lucy/Index/DeletionsReader.c @@ -30,6 +30,7 @@ #include "Lucy/Store/Folder.h" #include "Lucy/Store/InStream.h" #include "Lucy/Util/IndexFileNames.h" +#include "Lucy/Util/Json.h" DeletionsReader* DelReader_init(DeletionsReader *self, Schema *schema, Folder *folder, @@ -177,7 +178,7 @@ DefDelReader_Read_Deletions_IMP(DefaultDeletionsReader *self) { Obj *count = (Obj*)CERTIFY( Hash_Fetch_Utf8(seg_files_data, "count", 5), OBJ); - del_count = (int32_t)Obj_To_I64(count); + del_count = (int32_t)Json_obj_to_i64(count); del_file = (String*)CERTIFY( Hash_Fetch_Utf8(seg_files_data, "filename", 8), STRING); diff --git a/core/Lucy/Index/DeletionsWriter.c b/core/Lucy/Index/DeletionsWriter.c index 2d93bab8d..b62618889 100644 --- a/core/Lucy/Index/DeletionsWriter.c +++ b/core/Lucy/Index/DeletionsWriter.c @@ -38,6 +38,7 @@ #include "Lucy/Search/Query.h" #include "Lucy/Store/Folder.h" #include "Lucy/Store/OutStream.h" +#include "Lucy/Util/Json.h" DeletionsWriter* DelWriter_init(DeletionsWriter *self, Schema *schema, Snapshot *snapshot, @@ -371,7 +372,7 @@ DefDelWriter_Merge_Segment_IMP(DefaultDeletionsWriter *self, * merge away the most recent deletions file * pointing at this target segment -- so force a * new file to be written out. */ - int32_t count = (int32_t)Obj_To_I64(Hash_Fetch_Utf8(mini_meta, "count", 5)); + int32_t count = (int32_t)Json_obj_to_i64(Hash_Fetch_Utf8(mini_meta, "count", 5)); DeletionsReader *del_reader = (DeletionsReader*)SegReader_Obtain( candidate, Class_Get_Name(DELETIONSREADER)); diff --git a/core/Lucy/Index/DocReader.c b/core/Lucy/Index/DocReader.c index 0df3798ae..8759074ad 100644 --- a/core/Lucy/Index/DocReader.c +++ b/core/Lucy/Index/DocReader.c @@ -28,6 +28,7 @@ #include "Lucy/Plan/Schema.h" #include "Lucy/Store/Folder.h" #include "Lucy/Store/InStream.h" +#include "Lucy/Util/Json.h" DocReader* DocReader_init(DocReader *self, Schema *schema, Folder *folder, @@ -150,7 +151,7 @@ DefDocReader_init(DefaultDocReader *self, Schema *schema, Folder *folder, // Check format. if (!format) { THROW(ERR, "Missing 'format' var"); } else { - int64_t format_val = Obj_To_I64(format); + int64_t format_val = Json_obj_to_i64(format); if (format_val < DocWriter_current_file_format) { THROW(ERR, "Obsolete doc storage format %i64; " "Index regeneration is required", format_val); diff --git a/core/Lucy/Index/FilePurger.c b/core/Lucy/Index/FilePurger.c index 3e3bc2830..a128961b9 100644 --- a/core/Lucy/Index/FilePurger.c +++ b/core/Lucy/Index/FilePurger.c @@ -26,6 +26,7 @@ #include "Lucy/Store/DirHandle.h" #include "Lucy/Store/Folder.h" #include "Lucy/Store/Lock.h" +#include "Lucy/Util/Json.h" // Place unused files into purgables array and obsolete Snapshots into // snapshots array. @@ -153,7 +154,7 @@ S_zap_dead_merge(FilePurger *self, Hash *candidates) { : NULL; if (cutoff) { - String *cutoff_seg = Seg_num_to_name(Obj_To_I64(cutoff)); + String *cutoff_seg = Seg_num_to_name(Json_obj_to_i64(cutoff)); if (Folder_Exists(ivars->folder, cutoff_seg)) { String *merge_json = SSTR_WRAP_UTF8("merge.json", 10); DirHandle *dh = Folder_Open_Dir(ivars->folder, cutoff_seg); diff --git a/core/Lucy/Index/HighlightReader.c b/core/Lucy/Index/HighlightReader.c index eff0e325d..0d443c363 100644 --- a/core/Lucy/Index/HighlightReader.c +++ b/core/Lucy/Index/HighlightReader.c @@ -31,6 +31,7 @@ #include "Lucy/Store/OutStream.h" #include "Lucy/Store/Folder.h" #include "Lucy/Util/Freezer.h" +#include "Lucy/Util/Json.h" HighlightReader* HLReader_init(HighlightReader *self, Schema *schema, Folder *folder, @@ -130,9 +131,9 @@ DefHLReader_init(DefaultHighlightReader *self, Schema *schema, Obj *format = Hash_Fetch_Utf8(metadata, "format", 6); if (!format) { THROW(ERR, "Missing 'format' var"); } else { - if (Obj_To_I64(format) != HLWriter_current_file_format) { + if (Json_obj_to_i64(format) != HLWriter_current_file_format) { THROW(ERR, "Unsupported highlight data format: %i64", - Obj_To_I64(format)); + Json_obj_to_i64(format)); } } } diff --git a/core/Lucy/Index/Indexer.c b/core/Lucy/Index/Indexer.c index efaec72cd..2226b849d 100644 --- a/core/Lucy/Index/Indexer.c +++ b/core/Lucy/Index/Indexer.c @@ -184,7 +184,7 @@ Indexer_init(Indexer *self, Schema *schema, Obj *index, THROW(ERR, "Background merge detected, but can't read merge data"); } else { - int64_t cutoff = Obj_To_I64(cutoff_obj); + int64_t cutoff = Json_obj_to_i64(cutoff_obj); if (cutoff >= new_seg_num) { new_seg_num = cutoff + 1; } @@ -414,7 +414,7 @@ S_maybe_merge(Indexer *self, Vector *seg_readers) { if (merge_data) { Obj *cutoff_obj = Hash_Fetch_Utf8(merge_data, "cutoff", 6); if (cutoff_obj) { - cutoff = Obj_To_I64(cutoff_obj); + cutoff = Json_obj_to_i64(cutoff_obj); } else { cutoff = INT64_MAX; diff --git a/core/Lucy/Index/PostingListReader.c b/core/Lucy/Index/PostingListReader.c index dbaa17154..b2b08e142 100644 --- a/core/Lucy/Index/PostingListReader.c +++ b/core/Lucy/Index/PostingListReader.c @@ -29,6 +29,7 @@ #include "Lucy/Plan/FieldType.h" #include "Lucy/Plan/Schema.h" #include "Lucy/Store/Folder.h" +#include "Lucy/Util/Json.h" PostingListReader* PListReader_init(PostingListReader *self, Schema *schema, Folder *folder, @@ -80,9 +81,9 @@ DefPListReader_init(DefaultPostingListReader *self, Schema *schema, Obj *format = Hash_Fetch_Utf8(my_meta, "format", 6); if (!format) { THROW(ERR, "Missing 'format' var"); } else { - if (Obj_To_I64(format) != PListWriter_current_file_format) { + if (Json_obj_to_i64(format) != PListWriter_current_file_format) { THROW(ERR, "Unsupported postings format: %i64", - Obj_To_I64(format)); + Json_obj_to_i64(format)); } } } diff --git a/core/Lucy/Index/SegLexicon.c b/core/Lucy/Index/SegLexicon.c index c30bf0677..5a5692071 100644 --- a/core/Lucy/Index/SegLexicon.c +++ b/core/Lucy/Index/SegLexicon.c @@ -31,6 +31,7 @@ #include "Lucy/Plan/Schema.h" #include "Lucy/Store/Folder.h" #include "Lucy/Store/InStream.h" +#include "Lucy/Util/Json.h" // Iterate until the state is greater than or equal to the target. static void @@ -63,9 +64,9 @@ SegLex_init(SegLexicon *self, Schema *schema, Folder *folder, // Check format. if (!format) { THROW(ERR, "Missing 'format'"); } else { - if (Obj_To_I64(format) > LexWriter_current_file_format) { + if (Json_obj_to_i64(format) > LexWriter_current_file_format) { THROW(ERR, "Unsupported lexicon format: %i64", - Obj_To_I64(format)); + Json_obj_to_i64(format)); } } @@ -73,7 +74,7 @@ SegLex_init(SegLexicon *self, Schema *schema, Folder *folder, if (!counts) { THROW(ERR, "Failed to extract 'counts'"); } else { Obj *count = CERTIFY(Hash_Fetch(counts, field), OBJ); - ivars->size = (int32_t)Obj_To_I64(count); + ivars->size = (int32_t)Json_obj_to_i64(count); } // Assign. diff --git a/core/Lucy/Index/Segment.c b/core/Lucy/Index/Segment.c index 0e96acbb6..fdf46fc2b 100644 --- a/core/Lucy/Index/Segment.c +++ b/core/Lucy/Index/Segment.c @@ -113,7 +113,7 @@ Seg_Read_File_IMP(Segment *self, Folder *folder) { Obj *count = Hash_Fetch_Utf8(my_metadata, "count", 5); if (!count) { count = Hash_Fetch_Utf8(my_metadata, "doc_count", 9); } if (!count) { THROW(ERR, "Missing 'count'"); } - else { ivars->count = Obj_To_I64(count); } + else { ivars->count = Json_obj_to_i64(count); } // Get list of field nums. Vector *source_by_num = (Vector*)Hash_Fetch_Utf8(my_metadata, diff --git a/core/Lucy/Index/Snapshot.c b/core/Lucy/Index/Snapshot.c index 9d710df49..90a91c7c8 100644 --- a/core/Lucy/Index/Snapshot.c +++ b/core/Lucy/Index/Snapshot.c @@ -115,10 +115,10 @@ Snapshot_Read_File_IMP(Snapshot *self, Folder *folder, String *path) { = (Hash*)CERTIFY(Json_slurp_json(folder, ivars->path), HASH); Obj *format_obj = CERTIFY(Hash_Fetch_Utf8(snap_data, "format", 6), OBJ); - int32_t format = (int32_t)Obj_To_I64(format_obj); + int32_t format = (int32_t)Json_obj_to_i64(format_obj); Obj *subformat_obj = Hash_Fetch_Utf8(snap_data, "subformat", 9); int32_t subformat = subformat_obj - ? (int32_t)Obj_To_I64(subformat_obj) + ? (int32_t)Json_obj_to_i64(subformat_obj) : 0; // Verify that we can read the index properly. diff --git a/core/Lucy/Index/SortReader.c b/core/Lucy/Index/SortReader.c index b8359bf54..2d391256d 100644 --- a/core/Lucy/Index/SortReader.c +++ b/core/Lucy/Index/SortReader.c @@ -28,6 +28,7 @@ #include "Lucy/Plan/Schema.h" #include "Lucy/Store/Folder.h" #include "Lucy/Store/InStream.h" +#include "Lucy/Util/Json.h" SortReader* SortReader_init(SortReader *self, Schema *schema, Folder *folder, @@ -71,7 +72,7 @@ DefSortReader_init(DefaultSortReader *self, Schema *schema, Folder *folder, Obj *format = Hash_Fetch_Utf8(metadata, "format", 6); if (!format) { THROW(ERR, "Missing 'format' var"); } else { - ivars->format = (int32_t)Obj_To_I64(format); + ivars->format = (int32_t)Json_obj_to_i64(format); if (ivars->format < 2 || ivars->format > 3) { THROW(ERR, "Unsupported sort cache format: %i32", ivars->format); @@ -160,7 +161,7 @@ S_lazy_init_sort_cache(DefaultSortReader *self, String *field) { // See if we have any values. Obj *count_obj = Hash_Fetch(ivars->counts, field); - int32_t count = count_obj ? (int32_t)Obj_To_I64(count_obj) : 0; + int32_t count = count_obj ? (int32_t)Json_obj_to_i64(count_obj) : 0; if (!count) { return NULL; } // Get a FieldType and sanity check that the field is sortable. @@ -205,10 +206,10 @@ S_lazy_init_sort_cache(DefaultSortReader *self, String *field) { } Obj *null_ord_obj = Hash_Fetch(ivars->null_ords, field); - int32_t null_ord = null_ord_obj ? (int32_t)Obj_To_I64(null_ord_obj) : -1; + int32_t null_ord = null_ord_obj ? (int32_t)Json_obj_to_i64(null_ord_obj) : -1; Obj *ord_width_obj = Hash_Fetch(ivars->ord_widths, field); int32_t ord_width = ord_width_obj - ? (int32_t)Obj_To_I64(ord_width_obj) + ? (int32_t)Json_obj_to_i64(ord_width_obj) : S_calc_ord_width(count); int32_t doc_max = (int32_t)Seg_Get_Count(segment); diff --git a/core/Lucy/Plan/BlobType.c b/core/Lucy/Plan/BlobType.c index a9a219232..ab0048cf9 100644 --- a/core/Lucy/Plan/BlobType.c +++ b/core/Lucy/Plan/BlobType.c @@ -18,6 +18,7 @@ #include "Lucy/Util/ToolSet.h" #include "Lucy/Plan/BlobType.h" +#include "Lucy/Util/Json.h" BlobType* BlobType_new(bool stored) { @@ -107,13 +108,13 @@ BlobType_Load_IMP(BlobType *self, Obj *dump) { BlobType_init(loaded, false); BlobTypeIVARS *const loaded_ivars = BlobType_IVARS(loaded); if (boost_dump) { - loaded_ivars->boost = (float)Obj_To_F64(boost_dump); + loaded_ivars->boost = (float)Json_obj_to_f64(boost_dump); } if (indexed_dump) { - loaded_ivars->indexed = Obj_To_Bool(indexed_dump); + loaded_ivars->indexed = Json_obj_to_bool(indexed_dump); } if (stored_dump){ - loaded_ivars->stored = Obj_To_Bool(stored_dump); + loaded_ivars->stored = Json_obj_to_bool(stored_dump); } return loaded; diff --git a/core/Lucy/Plan/FullTextType.c b/core/Lucy/Plan/FullTextType.c index 893b1b63a..00cc5780d 100644 --- a/core/Lucy/Plan/FullTextType.c +++ b/core/Lucy/Plan/FullTextType.c @@ -22,6 +22,7 @@ #include "Lucy/Index/Posting/ScorePosting.h" #include "Lucy/Index/Similarity.h" #include "Lucy/Util/Freezer.h" +#include "Lucy/Util/Json.h" FullTextType* FullTextType_new(Analyzer *analyzer) { @@ -129,17 +130,17 @@ FullTextType_Load_IMP(FullTextType *self, Obj *dump) { // Extract boost. Obj *boost_dump = Hash_Fetch_Utf8(source, "boost", 5); - float boost = boost_dump ? (float)Obj_To_F64(boost_dump) : 1.0f; + float boost = boost_dump ? (float)Json_obj_to_f64(boost_dump) : 1.0f; // Find boolean properties. Obj *indexed_dump = Hash_Fetch_Utf8(source, "indexed", 7); Obj *stored_dump = Hash_Fetch_Utf8(source, "stored", 6); Obj *sort_dump = Hash_Fetch_Utf8(source, "sortable", 8); Obj *hl_dump = Hash_Fetch_Utf8(source, "highlightable", 13); - bool indexed = indexed_dump ? Obj_To_Bool(indexed_dump) : true; - bool stored = stored_dump ? Obj_To_Bool(stored_dump) : true; - bool sortable = sort_dump ? Obj_To_Bool(sort_dump) : false; - bool hl = hl_dump ? Obj_To_Bool(hl_dump) : false; + bool indexed = indexed_dump ? Json_obj_to_bool(indexed_dump) : true; + bool stored = stored_dump ? Json_obj_to_bool(stored_dump) : true; + bool sortable = sort_dump ? Json_obj_to_bool(sort_dump) : false; + bool hl = hl_dump ? Json_obj_to_bool(hl_dump) : false; // Extract an Analyzer. Obj *analyzer_dump = Hash_Fetch_Utf8(source, "analyzer", 8); diff --git a/core/Lucy/Plan/NumericType.c b/core/Lucy/Plan/NumericType.c index a802d3226..217ea494e 100644 --- a/core/Lucy/Plan/NumericType.c +++ b/core/Lucy/Plan/NumericType.c @@ -18,6 +18,7 @@ #include "Lucy/Util/ToolSet.h" #include "Lucy/Plan/NumericType.h" +#include "Lucy/Util/Json.h" NumericType* NumType_init(NumericType *self) { @@ -108,15 +109,15 @@ NumType_Load_IMP(NumericType *self, Obj *dump) { // Extract boost. Obj *boost_dump = Hash_Fetch_Utf8(source, "boost", 5); - float boost = boost_dump ? (float)Obj_To_F64(boost_dump) : 1.0f; + float boost = boost_dump ? (float)Json_obj_to_f64(boost_dump) : 1.0f; // Find boolean properties. Obj *indexed_dump = Hash_Fetch_Utf8(source, "indexed", 7); Obj *stored_dump = Hash_Fetch_Utf8(source, "stored", 6); Obj *sort_dump = Hash_Fetch_Utf8(source, "sortable", 8); - bool indexed = indexed_dump ? Obj_To_Bool(indexed_dump) : true; - bool stored = stored_dump ? Obj_To_Bool(stored_dump) : true; - bool sortable = sort_dump ? Obj_To_Bool(sort_dump) : false; + bool indexed = indexed_dump ? Json_obj_to_bool(indexed_dump) : true; + bool stored = stored_dump ? Json_obj_to_bool(stored_dump) : true; + bool sortable = sort_dump ? Json_obj_to_bool(sort_dump) : false; return NumType_init2(loaded, boost, indexed, stored, sortable); } diff --git a/core/Lucy/Plan/Schema.c b/core/Lucy/Plan/Schema.c index db3a83846..77d968006 100644 --- a/core/Lucy/Plan/Schema.c +++ b/core/Lucy/Plan/Schema.c @@ -336,7 +336,7 @@ Schema_Load_IMP(Schema *self, Obj *dump) { = CERTIFY(Hash_Fetch_Utf8(type_dump, "analyzer", 8), OBJ); Analyzer *analyzer = (Analyzer*)Vec_Fetch(analyzers, - (uint32_t)Obj_To_I64(tick)); + (uint32_t)Json_obj_to_i64(tick)); if (!analyzer) { THROW(ERR, "Can't find analyzer for '%o'", field); } diff --git a/core/Lucy/Plan/StringType.c b/core/Lucy/Plan/StringType.c index e7f6f95a6..d6262a3d7 100644 --- a/core/Lucy/Plan/StringType.c +++ b/core/Lucy/Plan/StringType.c @@ -20,6 +20,7 @@ #include "Lucy/Plan/StringType.h" #include "Lucy/Index/Posting/ScorePosting.h" #include "Lucy/Index/Similarity.h" +#include "Lucy/Util/Json.h" StringType* StringType_new() { @@ -101,10 +102,10 @@ StringType_Load_IMP(StringType *self, Obj *dump) { Obj *sortable_dump = Hash_Fetch_Utf8(source, "sortable", 8); UNUSED_VAR(self); - float boost = boost_dump ? (float)Obj_To_F64(boost_dump) : 1.0f; - bool indexed = indexed_dump ? Obj_To_Bool(indexed_dump) : true; - bool stored = stored_dump ? Obj_To_Bool(stored_dump) : true; - bool sortable = sortable_dump ? Obj_To_Bool(sortable_dump) : false; + float boost = boost_dump ? (float)Json_obj_to_f64(boost_dump) : 1.0f; + bool indexed = indexed_dump ? Json_obj_to_bool(indexed_dump) : true; + bool stored = stored_dump ? Json_obj_to_bool(stored_dump) : true; + bool sortable = sortable_dump ? Json_obj_to_bool(sortable_dump) : false; return StringType_init2(loaded, boost, indexed, stored, sortable); } diff --git a/core/Lucy/Search/NoMatchQuery.c b/core/Lucy/Search/NoMatchQuery.c index 55fb008f2..408358d7e 100644 --- a/core/Lucy/Search/NoMatchQuery.c +++ b/core/Lucy/Search/NoMatchQuery.c @@ -26,6 +26,7 @@ #include "Lucy/Store/InStream.h" #include "Lucy/Store/OutStream.h" #include "Lucy/Util/Freezer.h" +#include "Lucy/Util/Json.h" NoMatchQuery* NoMatchQuery_new() { @@ -96,7 +97,7 @@ NoMatchQuery_Load_IMP(NoMatchQuery *self, Obj *dump) { NoMatchQuery *loaded = super_load(self, dump); Obj *fails = CFISH_Hash_Fetch_Utf8(source, "fails_to_match", 14); NoMatchQuery_IVARS(loaded)->fails_to_match - = fails ? Obj_To_Bool(fails) : true; + = fails ? Json_obj_to_bool(fails) : true; return loaded; } diff --git a/core/Lucy/Search/Query.c b/core/Lucy/Search/Query.c index 49b41cbb1..b82776ea9 100644 --- a/core/Lucy/Search/Query.c +++ b/core/Lucy/Search/Query.c @@ -22,6 +22,7 @@ #include "Lucy/Search/Searcher.h" #include "Lucy/Store/InStream.h" #include "Lucy/Store/OutStream.h" +#include "Lucy/Util/Json.h" Query* Query_init(Query *self, float boost) { @@ -71,7 +72,7 @@ Query_Load_IMP(Query *self, Obj *dump) { Class *klass = Class_singleton(class_name, NULL); Query *loaded = (Query*)Class_Make_Obj(klass); Obj *boost = CERTIFY(Hash_Fetch_Utf8(source, "boost", 5), OBJ); - Query_IVARS(loaded)->boost = (float)Obj_To_F64(boost); + Query_IVARS(loaded)->boost = (float)Json_obj_to_f64(boost); return (Obj*)loaded; } diff --git a/core/Lucy/Search/RangeQuery.c b/core/Lucy/Search/RangeQuery.c index a2c3699e1..63cc997af 100644 --- a/core/Lucy/Search/RangeQuery.c +++ b/core/Lucy/Search/RangeQuery.c @@ -31,6 +31,7 @@ #include "Lucy/Store/InStream.h" #include "Lucy/Store/OutStream.h" #include "Lucy/Util/Freezer.h" +#include "Lucy/Util/Json.h" // Determine the lowest ordinal that should match. static int32_t @@ -203,10 +204,10 @@ RangeQuery_Load_IMP(RangeQuery *self, Obj *dump) { } Obj *include_lower = CERTIFY(Hash_Fetch_Utf8(source, "include_lower", 13), OBJ); - loaded_ivars->include_lower = Obj_To_Bool(include_lower); + loaded_ivars->include_lower = Json_obj_to_bool(include_lower); Obj *include_upper = CERTIFY(Hash_Fetch_Utf8(source, "include_upper", 13), OBJ); - loaded_ivars->include_upper = Obj_To_Bool(include_upper); + loaded_ivars->include_upper = Json_obj_to_bool(include_upper); return (Obj*)loaded; } diff --git a/core/Lucy/Store/CompoundFileReader.c b/core/Lucy/Store/CompoundFileReader.c index 2add656bc..396eabed0 100644 --- a/core/Lucy/Store/CompoundFileReader.c +++ b/core/Lucy/Store/CompoundFileReader.c @@ -51,7 +51,7 @@ CFReader_do_open(CompoundFileReader *self, Folder *folder) { } else { Obj *format = Hash_Fetch_Utf8(metadata, "format", 6); - ivars->format = format ? (int32_t)Obj_To_I64(format) : 0; + ivars->format = format ? (int32_t)Json_obj_to_i64(format) : 0; ivars->records = (Hash*)INCREF(Hash_Fetch_Utf8(metadata, "files", 5)); if (ivars->format < 1) { error = Err_new(Str_newf("Corrupt %o file: Missing or invalid 'format'", @@ -206,13 +206,13 @@ CFReader_Local_Open_In_IMP(CompoundFileReader *self, String *name) { else if (Str_Get_Size(ivars->path)) { String *fullpath = Str_newf("%o/%o", ivars->path, name); InStream *instream = InStream_Reopen(ivars->instream, fullpath, - Obj_To_I64(offset), Obj_To_I64(len)); + Json_obj_to_i64(offset), Json_obj_to_i64(len)); DECREF(fullpath); return instream; } else { - return InStream_Reopen(ivars->instream, name, Obj_To_I64(offset), - Obj_To_I64(len)); + return InStream_Reopen(ivars->instream, name, Json_obj_to_i64(offset), + Json_obj_to_i64(len)); } } } diff --git a/core/Lucy/Test/Store/TestCompoundFileWriter.c b/core/Lucy/Test/Store/TestCompoundFileWriter.c index c633a8307..28b551bbf 100644 --- a/core/Lucy/Test/Store/TestCompoundFileWriter.c +++ b/core/Lucy/Test/Store/TestCompoundFileWriter.c @@ -128,7 +128,7 @@ test_offsets(TestBatchRunner *runner) { String *file = HashIter_Get_Key(iter); Hash *stats = (Hash*)CERTIFY(HashIter_Get_Value(iter), HASH); Obj *offset = CERTIFY(Hash_Fetch_Utf8(stats, "offset", 6), OBJ); - int64_t offs = Obj_To_I64(offset); + int64_t offs = Json_obj_to_i64(offset); if (offs % 8 != 0) { offsets_ok = false; FAIL(runner, "Offset %" PRId64 " for %s not a multiple of 8", diff --git a/core/LucyX/Search/ProximityQuery.c b/core/LucyX/Search/ProximityQuery.c index 027d1062b..6173acc0e 100644 --- a/core/LucyX/Search/ProximityQuery.c +++ b/core/LucyX/Search/ProximityQuery.c @@ -39,6 +39,7 @@ #include "Lucy/Store/InStream.h" #include "Lucy/Store/OutStream.h" #include "Lucy/Util/Freezer.h" +#include "Lucy/Util/Json.h" // Shared initialization routine which assumes that it's ok to assume control // over [field] and [terms], eating their refcounts. @@ -123,7 +124,7 @@ ProximityQuery_Load_IMP(ProximityQuery *self, Obj *dump) { Obj *terms = CERTIFY(Hash_Fetch_Utf8(source, "terms", 5), OBJ); loaded_ivars->terms = (Vector*)CERTIFY(Freezer_load(terms), VECTOR); Obj *within = CERTIFY(Hash_Fetch_Utf8(source, "within", 6), OBJ); - loaded_ivars->within = (uint32_t)Obj_To_I64(within); + loaded_ivars->within = (uint32_t)Json_obj_to_i64(within); return (Obj*)loaded; } diff --git a/perl/xs/Lucy/Document/Doc.c b/perl/xs/Lucy/Document/Doc.c index 97ab055fe..651e140f4 100644 --- a/perl/xs/Lucy/Document/Doc.c +++ b/perl/xs/Lucy/Document/Doc.c @@ -19,6 +19,7 @@ #include "Lucy/Document/Doc.h" #include "Lucy/Store/InStream.h" #include "Lucy/Store/OutStream.h" +#include "Lucy/Util/Json.h" #include "Clownfish/Util/Memory.h" lucy_Doc* @@ -191,7 +192,7 @@ LUCY_Doc_Load_IMP(lucy_Doc *self, cfish_Obj *dump) { CFISH_UNUSED_VAR(self); lucy_DocIVARS *const loaded_ivars = lucy_Doc_IVARS(loaded); - loaded_ivars->doc_id = (int32_t)CFISH_Obj_To_I64(doc_id); + loaded_ivars->doc_id = (int32_t)lucy_Json_obj_to_i64(doc_id); loaded_ivars->fields = SvREFCNT_inc(SvRV(fields_sv)); SvREFCNT_dec(fields_sv);