Kouhei Sutou
null+****@clear*****
Tue Feb 14 19:46:42 JST 2017
Kouhei Sutou 2017-02-14 19:46:42 +0900 (Tue, 14 Feb 2017) New Revision: 23eede0d5fb5b330e28cd1fbcfe709a0cb058f20 https://github.com/groonga/groonga/commit/23eede0d5fb5b330e28cd1fbcfe709a0cb058f20 Message: load: support loading array<object> style weight vector column For example: [{"key": weight}, {"key": weight}] It's only support object style load. Array style load doesn't support yet. Added files: test/command/suite/load/vector/add/weight/object/value_weight_type.expected test/command/suite/load/vector/add/weight/object/value_weight_type.test Modified files: lib/load.c Renamed files: test/command/suite/load/vector/add/weight/object/value_weight_reference.expected (from test/command/suite/load/vector/add/weight/object/value_weight.expected) test/command/suite/load/vector/add/weight/object/value_weight_reference.test (from test/command/suite/load/vector/add/weight/object/value_weight.test) Modified: lib/load.c (+53 -30) =================================================================== --- lib/load.c 2017-02-14 19:44:51 +0900 (4518683) +++ lib/load.c 2017-02-14 19:46:42 +0900 (3a27d28) @@ -88,6 +88,43 @@ loader_add(grn_ctx *ctx, grn_obj *key) } static void +add_weight_vector(grn_ctx *ctx, + grn_obj *column, + grn_obj *value, + grn_obj *vector) +{ + unsigned int i, n; + grn_obj weight_buffer; + + n = GRN_UINT32_VALUE(value); + GRN_UINT32_INIT(&weight_buffer, 0); + for (i = 0; i < n; i += 2) { + grn_rc rc; + grn_obj *key, *weight; + + key = value + 1 + i; + weight = key + 1; + + GRN_BULK_REWIND(&weight_buffer); + rc = grn_obj_cast(ctx, weight, &weight_buffer, GRN_TRUE); + if (rc != GRN_SUCCESS) { + grn_obj *range; + range = grn_ctx_at(ctx, weight_buffer.header.domain); + ERR_CAST(column, range, weight); + grn_obj_unlink(ctx, range); + break; + } + grn_vector_add_element(ctx, + vector, + GRN_BULK_HEAD(key), + GRN_BULK_VSIZE(key), + GRN_UINT32_VALUE(&weight_buffer), + key->header.domain); + } + GRN_OBJ_FIN(ctx, &weight_buffer); +} + +static void set_vector(grn_ctx *ctx, grn_obj *column, grn_id id, grn_obj *vector) { int n = GRN_UINT32_VALUE(vector); @@ -120,7 +157,9 @@ set_vector(grn_ctx *ctx, grn_obj *column, grn_id id, grn_obj *vector) if (((struct _grn_type *)range)->obj.header.flags & GRN_OBJ_KEY_VAR_SIZE) { GRN_TEXT_INIT(&buf, GRN_OBJ_VECTOR); while (n--) { - if (v->header.domain == GRN_DB_TEXT) { + switch (v->header.domain) { + case GRN_DB_TEXT : + { grn_bool cast_failed = GRN_FALSE; grn_obj casted_element, *element = v; if (range_id != element->header.domain) { @@ -134,12 +173,20 @@ set_vector(grn_ctx *ctx, grn_obj *column, grn_id id, grn_obj *vector) if (!cast_failed) { grn_vector_add_element(ctx, &buf, GRN_TEXT_VALUE(element), - GRN_TEXT_LEN(element), 0, + GRN_TEXT_LEN(element), + 0, element->header.domain); } if (element == &casted_element) { GRN_OBJ_FIN(ctx, element); } - } else { - ERR(GRN_INVALID_ARGUMENT, "bad syntax."); + break; + } + case GRN_JSON_LOAD_OPEN_BRACE : + add_weight_vector(ctx, column, v, &buf); + n -= GRN_UINT32_VALUE(v); + break; + default : + ERR(GRN_INVALID_ARGUMENT, "array must contain string or object"); + break; } v = values_next(ctx, v); } @@ -170,7 +217,7 @@ set_vector(grn_ctx *ctx, grn_obj *column, grn_id id, grn_obj *vector) } static void -set_weight_vector(grn_ctx *ctx, grn_obj *column, grn_id id, grn_obj *index_value) +set_weight_vector(grn_ctx *ctx, grn_obj *column, grn_id id, grn_obj *value) { if (!grn_obj_is_weight_vector_column(ctx, column)) { char column_name[GRN_TABLE_MAX_KEY_SIZE]; @@ -184,34 +231,10 @@ set_weight_vector(grn_ctx *ctx, grn_obj *column, grn_id id, grn_obj *index_value } { - unsigned int i, n; grn_obj vector; - grn_obj weight_buffer; - n = GRN_UINT32_VALUE(index_value); GRN_TEXT_INIT(&vector, GRN_OBJ_VECTOR); - GRN_UINT32_INIT(&weight_buffer, 0); - for (i = 0; i < n; i += 2) { - grn_rc rc; - grn_obj *key, *weight; - - key = index_value + 1 + i; - weight = key + 1; - - GRN_BULK_REWIND(&weight_buffer); - rc = grn_obj_cast(ctx, weight, &weight_buffer, GRN_TRUE); - if (rc != GRN_SUCCESS) { - grn_obj *range; - range = grn_ctx_at(ctx, weight_buffer.header.domain); - ERR_CAST(column, range, weight); - grn_obj_unlink(ctx, range); - break; - } - grn_vector_add_element(ctx, &vector, - GRN_BULK_HEAD(key), GRN_BULK_VSIZE(key), - GRN_UINT32_VALUE(&weight_buffer), - key->header.domain); - } + add_weight_vector(ctx, column, value, &vector); grn_obj_set_value(ctx, column, id, &vector, GRN_OBJ_SET); GRN_OBJ_FIN(ctx, &vector); } Renamed: test/command/suite/load/vector/add/weight/object/value_weight_reference.expected (+15 -3) 55% =================================================================== --- test/command/suite/load/vector/add/weight/object/value_weight.expected 2017-02-14 19:44:51 +0900 (15018bd) +++ test/command/suite/load/vector/add/weight/object/value_weight_reference.expected 2017-02-14 19:46:42 +0900 (18b854e) @@ -9,10 +9,22 @@ load --table Memos { "_key": "Groonga is fast", "tags": { - "groonga": 100 + "groonga": 100, + "mroonga": 200 } } ] [[0,0.0,0.0],1] -select Tags -[[0,0.0,0.0],[[[1],[["_id","UInt32"],["_key","ShortText"]],[1,"groonga"]]]] +dump --dump_plugins no --dump_schema no +load --table Memos +[ +["_key","tags"], +["Groonga is fast",{"groonga":100,"mroonga":200}] +] + +load --table Tags +[ +["_key"], +["groonga"], +["mroonga"] +] Renamed: test/command/suite/load/vector/add/weight/object/value_weight_reference.test (+5 -2) 71% =================================================================== --- test/command/suite/load/vector/add/weight/object/value_weight.test 2017-02-14 19:44:51 +0900 (6378c96) +++ test/command/suite/load/vector/add/weight/object/value_weight_reference.test 2017-02-14 19:46:42 +0900 (0bd79a4) @@ -8,9 +8,12 @@ load --table Memos { "_key": "Groonga is fast", "tags": { - "groonga": 100 + "groonga": 100, + "mroonga": 200 } } ] -select Tags +dump \ + --dump_plugins no \ + --dump_schema no Added: test/command/suite/load/vector/add/weight/object/value_weight_type.expected (+21 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/load/vector/add/weight/object/value_weight_type.expected 2017-02-14 19:46:42 +0900 (0be7b4d) @@ -0,0 +1,21 @@ +table_create Memos TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +column_create Memos tags COLUMN_VECTOR|WITH_WEIGHT ShortText +[[0,0.0,0.0],true] +load --table Memos +[ +{ + "_key": "Groonga is fast", + "tags": [ + {"groonga": 100}, + {"mroonga": 200} + ] +} +] +[[0,0.0,0.0],1] +dump --dump_plugins no --dump_schema no +load --table Memos +[ +["_key","tags"], +["Groonga is fast",[{"groonga":100},{"mroonga":200}]] +] Added: test/command/suite/load/vector/add/weight/object/value_weight_type.test (+17 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/load/vector/add/weight/object/value_weight_type.test 2017-02-14 19:46:42 +0900 (081c56e) @@ -0,0 +1,17 @@ +table_create Memos TABLE_HASH_KEY ShortText +column_create Memos tags COLUMN_VECTOR|WITH_WEIGHT ShortText + +load --table Memos +[ +{ + "_key": "Groonga is fast", + "tags": [ + {"groonga": 100}, + {"mroonga": 200} + ] +} +] + +dump \ + --dump_plugins no \ + --dump_schema no -------------- next part -------------- HTML����������������������������...下载