Kouhei Sutou
null+****@clear*****
Tue Feb 14 19:44:51 JST 2017
Kouhei Sutou 2017-02-14 19:44:51 +0900 (Tue, 14 Feb 2017) New Revision: ad8c5efb3184193cbd1220052cb0d8ddcf45ca6b https://github.com/groonga/groonga/commit/ad8c5efb3184193cbd1220052cb0d8ddcf45ca6b Message: dump: support dumping weight reference vector Modified files: lib/proc/proc_dump.c lib/str.c test/command/suite/dump/record/weight_vector_reference.expected test/command/suite/dump/record/weight_vector_reference.test Modified: lib/proc/proc_dump.c (+9 -7) =================================================================== --- lib/proc/proc_dump.c 2017-02-14 19:25:47 +0900 (92b77cf) +++ lib/proc/proc_dump.c 2017-02-14 19:44:51 +0900 (ec81f3b) @@ -391,24 +391,26 @@ dump_record_column_vector(grn_ctx *ctx, grn_dumper *dumper, grn_id id, grn_obj *column, grn_id range_id, grn_obj *buf) { grn_obj *range; + grn_obj_format *format_argument = NULL; + grn_obj_format format; range = grn_ctx_at(ctx, range_id); + if (column->header.flags & GRN_OBJ_WITH_WEIGHT) { + format.flags = GRN_OBJ_FORMAT_WITH_WEIGHT; + format_argument = &format; + } + if (grn_obj_is_table(ctx, range) || (range->header.flags & GRN_OBJ_KEY_VAR_SIZE) == 0) { GRN_OBJ_INIT(buf, GRN_UVECTOR, 0, range_id); grn_obj_get_value(ctx, column, id, buf); - grn_text_otoj(ctx, dumper->output, buf, NULL); + grn_text_otoj(ctx, dumper->output, buf, format_argument); } else { - grn_obj_format *format_argument = NULL; - grn_obj_format format; - if (column->header.flags & GRN_OBJ_WITH_WEIGHT) { - format.flags = GRN_OBJ_FORMAT_WITH_WEIGHT; - format_argument = &format; - } GRN_OBJ_INIT(buf, GRN_VECTOR, 0, range_id); grn_obj_get_value(ctx, column, id, buf); grn_text_otoj(ctx, dumper->output, buf, format_argument); } + grn_obj_unlink(ctx, range); grn_obj_unlink(ctx, buf); } Modified: lib/str.c (+81 -45) =================================================================== --- lib/str.c 2017-02-14 19:25:47 +0900 (91bc6af) +++ lib/str.c 2017-02-14 19:44:51 +0900 (09d0a2b) @@ -2845,62 +2845,98 @@ grn_text_otoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_obj_format *format) break; case GRN_UVECTOR : if (format) { - int i, j; - grn_id *v = (grn_id *)GRN_BULK_HEAD(obj), *ve = (grn_id *)GRN_BULK_CURR(obj); - int ncolumns = GRN_BULK_VSIZE(&format->columns) / sizeof(grn_obj *); - grn_obj **columns = (grn_obj **)GRN_BULK_HEAD(&format->columns); - GRN_TEXT_PUTS(ctx, bulk, "[["); - grn_text_itoa(ctx, bulk, ve - v); - GRN_TEXT_PUTC(ctx, bulk, ']'); - if (v < ve) { - if (format->flags & GRN_OBJ_FORMAT_WITH_COLUMN_NAMES) { - GRN_TEXT_PUTS(ctx, bulk, ",["); - for (j = 0; j < ncolumns; j++) { - grn_id range_id; - if (j) { GRN_TEXT_PUTC(ctx, bulk, ','); } - GRN_TEXT_PUTS(ctx, bulk, "["); - GRN_BULK_REWIND(&buf); - grn_column_name_(ctx, columns[j], &buf); - grn_text_otoj(ctx, bulk, &buf, NULL); + if (format->flags & GRN_OBJ_FORMAT_WITH_WEIGHT) { + int i, n; + grn_obj *domain; + + n = grn_uvector_size(ctx, obj); + domain = grn_ctx_at(ctx, obj->header.domain); + GRN_TEXT_PUTS(ctx, bulk, "{"); + for (i = 0; i < n; i++) { + grn_id id; + unsigned int weight; + + if (i > 0) { GRN_TEXT_PUTC(ctx, bulk, ','); - /* column range */ - range_id = grn_obj_get_range(ctx, columns[j]); - if (range_id == GRN_ID_NIL) { - GRN_TEXT_PUTS(ctx, bulk, "null"); + } + id = grn_uvector_get_element(ctx, obj, i, &weight); + if (domain) { + if (domain->header.type == GRN_TABLE_NO_KEY) { + GRN_TEXT_PUTC(ctx, bulk, '"'); + grn_text_ulltoa(ctx, bulk, id); + GRN_TEXT_PUTC(ctx, bulk, '"'); } else { - int name_len; - grn_obj *range_obj; - char name_buf[GRN_TABLE_MAX_KEY_SIZE]; - - range_obj = grn_ctx_at(ctx, range_id); - name_len = grn_obj_name(ctx, range_obj, name_buf, - GRN_TABLE_MAX_KEY_SIZE); GRN_BULK_REWIND(&buf); - GRN_TEXT_PUT(ctx, &buf, name_buf, name_len); + grn_table_get_key2(ctx, domain, id, &buf); grn_text_otoj(ctx, bulk, &buf, NULL); } - GRN_TEXT_PUTS(ctx, bulk, "]"); + } else { + GRN_TEXT_PUTC(ctx, bulk, '"'); + grn_text_ulltoa(ctx, bulk, id); + GRN_TEXT_PUTC(ctx, bulk, '"'); } - GRN_TEXT_PUTC(ctx, bulk, ']'); + GRN_TEXT_PUTC(ctx, bulk, ':'); + grn_text_ulltoa(ctx, bulk, weight); } - for (i = 0;; i++) { - GRN_TEXT_PUTS(ctx, bulk, ",["); - for (j = 0; j < ncolumns; j++) { - if (j) { GRN_TEXT_PUTC(ctx, bulk, ','); } - GRN_BULK_REWIND(&buf); - grn_obj_get_value(ctx, columns[j], *v, &buf); - grn_text_otoj(ctx, bulk, &buf, NULL); + GRN_TEXT_PUTS(ctx, bulk, "}"); + } else { + int i, j; + grn_id *v = (grn_id *)GRN_BULK_HEAD(obj), *ve = (grn_id *)GRN_BULK_CURR(obj); + int ncolumns = GRN_BULK_VSIZE(&format->columns) / sizeof(grn_obj *); + grn_obj **columns = (grn_obj **)GRN_BULK_HEAD(&format->columns); + GRN_TEXT_PUTS(ctx, bulk, "[["); + grn_text_itoa(ctx, bulk, ve - v); + GRN_TEXT_PUTC(ctx, bulk, ']'); + if (v < ve) { + if (format->flags & GRN_OBJ_FORMAT_WITH_COLUMN_NAMES) { + GRN_TEXT_PUTS(ctx, bulk, ",["); + for (j = 0; j < ncolumns; j++) { + grn_id range_id; + if (j) { GRN_TEXT_PUTC(ctx, bulk, ','); } + GRN_TEXT_PUTS(ctx, bulk, "["); + GRN_BULK_REWIND(&buf); + grn_column_name_(ctx, columns[j], &buf); + grn_text_otoj(ctx, bulk, &buf, NULL); + GRN_TEXT_PUTC(ctx, bulk, ','); + /* column range */ + range_id = grn_obj_get_range(ctx, columns[j]); + if (range_id == GRN_ID_NIL) { + GRN_TEXT_PUTS(ctx, bulk, "null"); + } else { + int name_len; + grn_obj *range_obj; + char name_buf[GRN_TABLE_MAX_KEY_SIZE]; + + range_obj = grn_ctx_at(ctx, range_id); + name_len = grn_obj_name(ctx, range_obj, name_buf, + GRN_TABLE_MAX_KEY_SIZE); + GRN_BULK_REWIND(&buf); + GRN_TEXT_PUT(ctx, &buf, name_buf, name_len); + grn_text_otoj(ctx, bulk, &buf, NULL); + } + GRN_TEXT_PUTS(ctx, bulk, "]"); + } + GRN_TEXT_PUTC(ctx, bulk, ']'); } - GRN_TEXT_PUTC(ctx, bulk, ']'); - v++; - if (v < ve) { - GRN_TEXT_PUTC(ctx, bulk, ','); - } else { - break; + for (i = 0;; i++) { + GRN_TEXT_PUTS(ctx, bulk, ",["); + for (j = 0; j < ncolumns; j++) { + if (j) { GRN_TEXT_PUTC(ctx, bulk, ','); } + GRN_BULK_REWIND(&buf); + grn_obj_get_value(ctx, columns[j], *v, &buf); + grn_text_otoj(ctx, bulk, &buf, NULL); + } + GRN_TEXT_PUTC(ctx, bulk, ']'); + v++; + if (v < ve) { + GRN_TEXT_PUTC(ctx, bulk, ','); + } else { + break; + } } } + GRN_TEXT_PUTC(ctx, bulk, ']'); } - GRN_TEXT_PUTC(ctx, bulk, ']'); } else { grn_obj *range = grn_ctx_at(ctx, obj->header.domain); if (range && range->header.type == GRN_TYPE) { Modified: test/command/suite/dump/record/weight_vector_reference.expected (+13 -10) =================================================================== --- test/command/suite/dump/record/weight_vector_reference.expected 2017-02-14 19:25:47 +0900 (3ccee09) +++ test/command/suite/dump/record/weight_vector_reference.expected 2017-02-14 19:44:51 +0900 (d3b6a93) @@ -10,24 +10,27 @@ load --table Memos "_key": "Groonga is fast", "tags": { "groonga": 100, - "full text serach": 10 + "full text search": 10 } } ] [[0,0.0,0.0],1] dump -table_create Tags TABLE_PAT_KEY ShortText table_create Memos TABLE_HASH_KEY ShortText -column_create Memos tags COLUMN_INDEX|WITH_WEIGHT Tags -load --table Tags -[ -["_key"], -["full text serach"], -["groonga"] -] + +table_create Tags TABLE_PAT_KEY ShortText + +column_create Memos tags COLUMN_VECTOR|WITH_WEIGHT Tags + load --table Memos [ ["_key","tags"], -["Groonga is fast",{"groonga":100,"full text serach":10}] +["Groonga is fast",{"groonga":100,"full text search":10}] ] +load --table Tags +[ +["_key"], +["full text search"], +["groonga"] +] Modified: test/command/suite/dump/record/weight_vector_reference.test (+1 -3) =================================================================== --- test/command/suite/dump/record/weight_vector_reference.test 2017-02-14 19:25:47 +0900 (03a6c96) +++ test/command/suite/dump/record/weight_vector_reference.test 2017-02-14 19:44:51 +0900 (a78fa86) @@ -1,5 +1,3 @@ -#@omit "weight vector for reference type will be supported in the future" - table_create Tags TABLE_PAT_KEY ShortText table_create Memos TABLE_HASH_KEY ShortText @@ -11,7 +9,7 @@ load --table Memos "_key": "Groonga is fast", "tags": { "groonga": 100, - "full text serach": 10 + "full text search": 10 } } ] -------------- next part -------------- HTML����������������������������...Download