[Groonga-commit] groonga/groonga at ad8c5ef [master] dump: support dumping weight reference vector

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index