[Groonga-commit] groonga/groonga at e652e86 [master] select drilldown[].keys: support reference vector

Back to archive index

Kouhei Sutou null+****@clear*****
Mon Nov 24 18:34:50 JST 2014


Kouhei Sutou	2014-11-24 18:34:50 +0900 (Mon, 24 Nov 2014)

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

  Message:
    select drilldown[].keys: support reference vector

  Added files:
    test/command/suite/select/drilldown/labeled/keys/reference_vector.expected
    test/command/suite/select/drilldown/labeled/keys/reference_vector.test
  Modified files:
    lib/db.c

  Modified: lib/db.c (+58 -24)
===================================================================
--- lib/db.c    2014-11-24 17:43:21 +0900 (03475e1)
+++ lib/db.c    2014-11-24 18:34:50 +0900 (d30656d)
@@ -3293,33 +3293,67 @@ grn_table_group_multi_keys_vector_record(grn_ctx *ctx,
 
   for (k = nth_key, kp = &(keys[nth_key]); k < n_keys; k++, kp++) {
     grn_obj *key_buffer = &(key_buffers[k]);
-    if (key_buffer->header.type == GRN_VECTOR) {
-      unsigned int n_vector_elements;
-      unsigned int i, n_key_elements;
-
-      n_vector_elements = grn_vector_size(ctx, vector);
-      n_key_elements = grn_vector_size(ctx, key_buffer);
-      for (i = 0; i < n_key_elements; i++) {
-        const char *content;
-        unsigned int content_length;
+    switch (key_buffer->header.type) {
+    case GRN_UVECTOR :
+      {
+        unsigned int n_vector_elements;
         grn_id domain;
-        content_length = grn_vector_get_element(ctx, key_buffer, i,
-                                                &content, NULL, &domain);
-        grn_vector_add_element(ctx, vector,
-                               content, content_length,
-                               0,
-                               domain);
-        grn_table_group_multi_keys_vector_record(ctx,
-                                                 keys, key_buffers,
-                                                 k + 1, n_keys,
-                                                 results, n_results,
-                                                 id, ri, vector, bulk);
-        while (grn_vector_size(ctx, vector) != n_vector_elements) {
-          grn_vector_pop_element(ctx, vector, &content, NULL, NULL);
+        grn_id *ids;
+        unsigned int i, n_ids;
+
+        n_vector_elements = grn_vector_size(ctx, vector);
+        domain = key_buffer->header.domain;
+        ids = (grn_id *)GRN_BULK_HEAD(key_buffer);
+        n_ids = GRN_BULK_VSIZE(key_buffer) / sizeof(grn_id);
+        for (i = 0; i < n_ids; i++) {
+          grn_id element_id = ids[i];
+          grn_vector_add_element(ctx, vector,
+                                 (const char *)(&element_id), sizeof(grn_id),
+                                 0,
+                                 domain);
+          grn_table_group_multi_keys_vector_record(ctx,
+                                                   keys, key_buffers,
+                                                   k + 1, n_keys,
+                                                   results, n_results,
+                                                   id, ri, vector, bulk);
+          while (grn_vector_size(ctx, vector) != n_vector_elements) {
+            const char *content;
+            grn_vector_pop_element(ctx, vector, &content, NULL, NULL);
+          }
         }
+        return;
       }
-      return;
-    } else {
+      break;
+    case GRN_VECTOR :
+      {
+        unsigned int n_vector_elements;
+        unsigned int i, n_key_elements;
+
+        n_vector_elements = grn_vector_size(ctx, vector);
+        n_key_elements = grn_vector_size(ctx, key_buffer);
+        for (i = 0; i < n_key_elements; i++) {
+          const char *content;
+          unsigned int content_length;
+          grn_id domain;
+          content_length = grn_vector_get_element(ctx, key_buffer, i,
+                                                  &content, NULL, &domain);
+          grn_vector_add_element(ctx, vector,
+                                 content, content_length,
+                                 0,
+                                 domain);
+          grn_table_group_multi_keys_vector_record(ctx,
+                                                   keys, key_buffers,
+                                                   k + 1, n_keys,
+                                                   results, n_results,
+                                                   id, ri, vector, bulk);
+          while (grn_vector_size(ctx, vector) != n_vector_elements) {
+            grn_vector_pop_element(ctx, vector, &content, NULL, NULL);
+          }
+        }
+        return;
+      }
+      break;
+    default :
       grn_vector_add_element(ctx, vector,
                              GRN_BULK_HEAD(key_buffer),
                              GRN_BULK_VSIZE(key_buffer),

  Added: test/command/suite/select/drilldown/labeled/keys/reference_vector.expected (+84 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/drilldown/labeled/keys/reference_vector.expected    2014-11-24 18:34:50 +0900 (0bca7d9)
@@ -0,0 +1,84 @@
+table_create Tags TABLE_HASH_KEY ShortText
+[[0,0.0,0.0],true]
+table_create Memos TABLE_HASH_KEY ShortText
+[[0,0.0,0.0],true]
+column_create Memos date COLUMN_SCALAR Time
+[[0,0.0,0.0],true]
+column_create Memos tags COLUMN_VECTOR Tags
+[[0,0.0,0.0],true]
+load --table Memos
+[
+{"_key": "Groonga is fast!", "date": "2014-11-16 00:00:00",
+ "tags": ["Groonga"]},
+{"_key": "Mroonga is fast!", "date": "2014-11-16 00:00:00",
+ "tags": ["Mroonga", "Groonga"]},
+{"_key": "Groonga sticker!", "date": "2014-11-16 00:00:00",
+ "tags": ["Groonga"]},
+{"_key": "Rroonga is fast!", "date": "2014-11-17 00:00:00",
+ "tags": ["Rroonga", "Groonga"]},
+{"_key": "Groonga is good!", "date": "2014-11-17 00:00:00",
+ "tags": ["Groonga"]}
+]
+[[0,0.0,0.0],5]
+select Memos   --limit 0   --output_columns _id   --command_version 2   --drilldown[vector].keys date,tags   --drilldown[vector].output_columns _key[0],_key[1],_nsubrecs   --drilldown[vector].sortby -_nsubrecs,_id
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  [
+    [
+      [
+        5
+      ],
+      [
+        [
+          "_id",
+          "UInt32"
+        ]
+      ]
+    ],
+    {
+      "vector": [
+        [
+          4
+        ],
+        [
+          [
+            "_key[0]",
+            null
+          ],
+          [
+            "_key[1]",
+            null
+          ],
+          [
+            "_nsubrecs",
+            "Int32"
+          ]
+        ],
+        [
+          1416063600.0,
+          "Groonga",
+          3
+        ],
+        [
+          1416150000.0,
+          "Groonga",
+          2
+        ],
+        [
+          1416063600.0,
+          "Mroonga",
+          1
+        ],
+        [
+          1416150000.0,
+          "Rroonga",
+          1
+        ]
+      ]
+    }
+  ]
+]

  Added: test/command/suite/select/drilldown/labeled/keys/reference_vector.test (+27 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/drilldown/labeled/keys/reference_vector.test    2014-11-24 18:34:50 +0900 (c12922f)
@@ -0,0 +1,27 @@
+table_create Tags TABLE_HASH_KEY ShortText
+
+table_create Memos TABLE_HASH_KEY ShortText
+column_create Memos date COLUMN_SCALAR Time
+column_create Memos tags COLUMN_VECTOR Tags
+
+load --table Memos
+[
+{"_key": "Groonga is fast!", "date": "2014-11-16 00:00:00",
+ "tags": ["Groonga"]},
+{"_key": "Mroonga is fast!", "date": "2014-11-16 00:00:00",
+ "tags": ["Mroonga", "Groonga"]},
+{"_key": "Groonga sticker!", "date": "2014-11-16 00:00:00",
+ "tags": ["Groonga"]},
+{"_key": "Rroonga is fast!", "date": "2014-11-17 00:00:00",
+ "tags": ["Rroonga", "Groonga"]},
+{"_key": "Groonga is good!", "date": "2014-11-17 00:00:00",
+ "tags": ["Groonga"]}
+]
+
+select Memos \
+  --limit 0 \
+  --output_columns _id \
+  --command_version 2 \
+  --drilldown[vector].keys date,tags \
+  --drilldown[vector].output_columns _key[0],_key[1],_nsubrecs \
+  --drilldown[vector].sortby -_nsubrecs,_id
-------------- next part --------------
HTML����������������������������...
Download 



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