[Groonga-commit] groonga/groonga at 23eede0 [master] load: support loading array<object> style weight vector column

Back to archive index

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����������������������������...
下载 



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