[Groonga-commit] groonga/groonga at f57039b [master] Support getting column values throw reference vector

Back to archive index

Kouhei Sutou null+****@clear*****
Tue Nov 21 11:57:32 JST 2017


Kouhei Sutou	2017-11-21 11:57:32 +0900 (Tue, 21 Nov 2017)

  New Revision: f57039b09e7e0a3d68199ee9de29f87e140eb34d
  https://github.com/groonga/groonga/commit/f57039b09e7e0a3d68199ee9de29f87e140eb34d

  Message:
    Support getting column values throw reference vector

  Added files:
    test/command/suite/select/function/min/reference_vector_column_uint8.expected
    test/command/suite/select/function/min/reference_vector_column_uint8.test
  Modified files:
    lib/db.c

  Modified: lib/db.c (+41 -3)
===================================================================
--- lib/db.c    2017-11-21 11:11:54 +0900 (f588aa8c8)
+++ lib/db.c    2017-11-21 11:57:32 +0900 (bc2529df2)
@@ -6835,10 +6835,48 @@ grn_accessor_get_value(grn_ctx *ctx, grn_accessor *a, grn_id id, grn_obj *value)
       value->header.domain = GRN_DB_FLOAT;
       break;
     case GRN_ACCESSOR_GET_COLUMN_VALUE :
-      /* todo : support vector */
       grn_obj_get_value(ctx, a->obj, id, value);
-      vp = GRN_BULK_HEAD(value) + size0;
-      vs = GRN_BULK_VSIZE(value) - size0;
+      if (value->header.type == GRN_UVECTOR && a->next) {
+        int i, n;
+        grn_id *sub_ids;
+        grn_obj sub_records;
+        grn_obj sub_value;
+        grn_id sub_value_range;
+
+        n = (GRN_BULK_VSIZE(value) - size0) / sizeof(grn_id);
+        sub_ids = (grn_id *)(GRN_BULK_HEAD(value) + size0);
+        GRN_RECORD_INIT(&sub_records, GRN_OBJ_VECTOR, value->header.domain);
+        for (i = 0; i < n; i++) {
+          GRN_RECORD_PUT(ctx, &sub_records, sub_ids[i]);
+        }
+
+        sub_value_range = grn_obj_get_range(ctx, (grn_obj *)(a->next));
+        grn_obj_reinit(ctx, value, sub_value_range, GRN_OBJ_VECTOR);
+        GRN_VOID_INIT(&sub_value);
+        for (i = 0; i < n; i++) {
+          grn_id sub_id = GRN_RECORD_VALUE_AT(&sub_records, i);
+          GRN_BULK_REWIND(&sub_value);
+          grn_accessor_get_value(ctx, a->next, sub_id, &sub_value);
+          if (value->header.type == GRN_UVECTOR) {
+            grn_bulk_write(ctx,
+                           value,
+                           GRN_BULK_HEAD(&sub_value),
+                           GRN_BULK_VSIZE(&sub_value));
+          } else {
+            grn_vector_add_element(ctx,
+                                   value,
+                                   GRN_BULK_HEAD(&sub_value),
+                                   GRN_BULK_VSIZE(&sub_value),
+                                   0,
+                                   sub_value.header.domain);
+          }
+        }
+        GRN_OBJ_FIN(ctx, &sub_value);
+        return value;
+      } else {
+        vp = GRN_BULK_HEAD(value) + size0;
+        vs = GRN_BULK_VSIZE(value) - size0;
+      }
       break;
     case GRN_ACCESSOR_GET_DB_OBJ :
       value = grn_ctx_at(ctx, id);

  Added: test/command/suite/select/function/min/reference_vector_column_uint8.expected (+22 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/min/reference_vector_column_uint8.expected    2017-11-21 11:57:32 +0900 (8ac882372)
@@ -0,0 +1,22 @@
+table_create Users TABLE_PAT_KEY ShortText
+[[0,0.0,0.0],true]
+column_create Users age COLUMN_SCALAR UInt8
+[[0,0.0,0.0],true]
+table_create Logs TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Logs users COLUMN_VECTOR Users
+[[0,0.0,0.0],true]
+load --table Users
+[
+{"_key": "alice", "age": 12},
+{"_key": "bob",   "age": 29},
+{"_key": "chris", "age": 3}
+]
+[[0,0.0,0.0],3]
+load --table Logs
+[
+{"users": ["bob", "chris", "alice"]}
+]
+[[0,0.0,0.0],1]
+select Logs   --output_columns '_id, min(users.age)'
+[[0,0.0,0.0],[[[1],[["_id","UInt32"],["min",null]],[1,3]]]]

  Added: test/command/suite/select/function/min/reference_vector_column_uint8.test (+20 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/min/reference_vector_column_uint8.test    2017-11-21 11:57:32 +0900 (55115cca9)
@@ -0,0 +1,20 @@
+table_create Users TABLE_PAT_KEY ShortText
+column_create Users age COLUMN_SCALAR UInt8
+
+table_create Logs TABLE_NO_KEY
+column_create Logs users COLUMN_VECTOR Users
+
+load --table Users
+[
+{"_key": "alice", "age": 12},
+{"_key": "bob",   "age": 29},
+{"_key": "chris", "age": 3}
+]
+
+load --table Logs
+[
+{"users": ["bob", "chris", "alice"]}
+]
+
+select Logs \
+  --output_columns '_id, min(users.age)'
-------------- next part --------------
HTML����������������������������...
URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20171121/323348ed/attachment-0001.htm 



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