[Groonga-commit] groonga/groonga at c23fccc [master] grn_table_group: use vector for key of multi keys group

アーカイブの一覧に戻る

Kouhei Sutou null+****@clear*****
Mon Nov 24 14:37:45 JST 2014


Kouhei Sutou	2014-11-24 14:37:45 +0900 (Mon, 24 Nov 2014)

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

  Message:
    grn_table_group: use vector for key of multi keys group
    
    It is for getting each grouped values from key.

  Modified files:
    lib/db.c
    lib/proc.c

  Modified: lib/db.c (+67 -26)
===================================================================
--- lib/db.c    2014-11-24 12:48:01 +0900 (dc4c666)
+++ lib/db.c    2014-11-24 14:37:45 +0900 (a617352)
@@ -3184,21 +3184,44 @@ grn_table_group_multi_keys_add_record(grn_ctx *ctx,
                                       int n_results,
                                       grn_id id,
                                       grn_rset_recinfo *ri,
+                                      grn_obj *vector,
                                       grn_obj *bulk)
 {
   int r;
   grn_table_group_result *rp;
 
   for (r = 0, rp = results; r < n_results; r++, rp++) {
-    void *key;
     void *value;
-    int begin = keys[rp->key_begin].offset;
-    int end = rp->key_end >= n_keys
-      ? GRN_BULK_VSIZE(bulk)
-      : keys[rp->key_end].offset;
-    key = GRN_BULK_HEAD(bulk) + begin;
+    int i;
+    int end;
+
+    if (rp->key_end > n_keys) {
+      end = n_keys;
+    } else {
+      end = rp->key_end + 1;
+    }
+    GRN_BULK_REWIND(bulk);
+    grn_text_benc(ctx, bulk, end - rp->key_begin);
+    for (i = rp->key_begin; i < end; i++) {
+      grn_section section = vector->u.v.sections[i];
+      grn_text_benc(ctx, bulk, section.length);
+    }
+    {
+      grn_obj *body = vector->u.v.body;
+      if (body) {
+        GRN_TEXT_PUT(ctx, bulk, GRN_BULK_HEAD(body), GRN_BULK_VSIZE(body));
+      }
+    }
+    for (i = rp->key_begin; i < end; i++) {
+      grn_section section = vector->u.v.sections[i];
+      grn_text_benc(ctx, bulk, section.weight);
+      grn_text_benc(ctx, bulk, section.domain);
+    }
+
     // todo : cut off GRN_ID_NIL
-    if (grn_table_add_v_inline(ctx, rp->table, key, end - begin, &value, NULL)) {
+    if (grn_table_add_v_inline(ctx, rp->table,
+                               GRN_BULK_HEAD(bulk), GRN_BULK_VSIZE(bulk),
+                               &value, NULL)) {
       grn_table_add_subrec_inline(rp->table, value, ri ? ri->score : 0,
                                   (grn_rset_posinfo *)&id, 0);
     }
@@ -3216,6 +3239,7 @@ grn_table_group_multi_keys_scalar_records(grn_ctx *ctx,
   grn_id id;
   grn_table_cursor *tc;
   grn_obj bulk;
+  grn_obj vector;
 
   tc = grn_table_cursor_open(ctx, table, NULL, 0, NULL, 0, 0, -1, 0);
   if (!tc) {
@@ -3223,6 +3247,7 @@ grn_table_group_multi_keys_scalar_records(grn_ctx *ctx,
   }
 
   GRN_TEXT_INIT(&bulk, 0);
+  GRN_OBJ_INIT(&vector, GRN_VECTOR, 0, GRN_DB_VOID);
   while ((id = grn_table_cursor_next_inline(ctx, tc))) {
     int k;
     grn_table_sort_key *kp;
@@ -3232,16 +3257,20 @@ grn_table_group_multi_keys_scalar_records(grn_ctx *ctx,
       grn_table_cursor_get_value_inline(ctx, tc, (void **)&ri);
     }
 
-    GRN_BULK_REWIND(&bulk);
-
+    GRN_BULK_REWIND(&vector);
     for (k = 0, kp = keys; k < n_keys; k++, kp++) {
-      kp->offset = GRN_BULK_VSIZE(&bulk);
+      GRN_BULK_REWIND(&bulk);
       grn_obj_get_value(ctx, kp->key, id, &bulk);
+      grn_vector_add_element(ctx, &vector,
+                             GRN_BULK_HEAD(&bulk), GRN_BULK_VSIZE(&bulk),
+                             0,
+                             bulk.header.domain);
     }
 
     grn_table_group_multi_keys_add_record(ctx, keys, n_keys, results, n_results,
-                                          id, ri, &bulk);
+                                          id, ri, &vector, &bulk);
   }
+  GRN_OBJ_FIN(ctx, &vector);
   GRN_OBJ_FIN(ctx, &bulk);
   grn_table_cursor_close(ctx, tc);
 }
@@ -3256,6 +3285,7 @@ grn_table_group_multi_keys_vector_record(grn_ctx *ctx,
                                          int n_results,
                                          grn_id id,
                                          grn_rset_recinfo *ri,
+                                         grn_obj *vector,
                                          grn_obj *bulk)
 {
   int k;
@@ -3264,29 +3294,37 @@ 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 i, n_elements;
+      unsigned int n_vector_elements;
+      unsigned int i, n_key_elements;
 
-      kp->offset = GRN_BULK_VSIZE(bulk);
-      n_elements = grn_vector_size(ctx, key_buffer);
-      for (i = 0; i < n_elements; i++) {
+      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, NULL);
-        GRN_BULK_REWIND(bulk);
-        GRN_BULK_INCR_LEN(bulk, kp->offset);
-        GRN_TEXT_PUT(ctx, bulk, content, content_length);
+                                                &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, bulk);
+                                                 id, ri, vector, bulk);
+        while (grn_vector_size(ctx, vector) != n_vector_elements) {
+          grn_vector_pop_element(ctx, vector, &content, NULL, NULL);
+        }
       }
       return;
     } else {
-      kp->offset = GRN_BULK_VSIZE(bulk);
-      GRN_TEXT_PUT(ctx, bulk,
-                   GRN_BULK_HEAD(key_buffer), GRN_BULK_VSIZE(key_buffer));
+      grn_vector_add_element(ctx, vector,
+                             GRN_BULK_HEAD(key_buffer),
+                             GRN_BULK_VSIZE(key_buffer),
+                             0,
+                             key_buffer->header.domain);
     }
   }
 
@@ -3294,7 +3332,7 @@ grn_table_group_multi_keys_vector_record(grn_ctx *ctx,
     grn_table_group_multi_keys_add_record(ctx,
                                           keys, n_keys,
                                           results, n_results,
-                                          id, ri, bulk);
+                                          id, ri, vector, bulk);
   }
 }
 
@@ -3309,6 +3347,7 @@ grn_table_group_multi_keys_vector_records(grn_ctx *ctx,
   grn_id id;
   grn_table_cursor *tc;
   grn_obj bulk;
+  grn_obj vector;
   grn_obj *key_buffers;
   int k;
 
@@ -3324,6 +3363,7 @@ grn_table_group_multi_keys_vector_records(grn_ctx *ctx,
   }
 
   GRN_TEXT_INIT(&bulk, 0);
+  GRN_OBJ_INIT(&vector, GRN_VECTOR, 0, GRN_DB_VOID);
   for (k = 0; k < n_keys; k++) {
     GRN_VOID_INIT(&(key_buffers[k]));
   }
@@ -3341,16 +3381,17 @@ grn_table_group_multi_keys_vector_records(grn_ctx *ctx,
       grn_obj_get_value(ctx, kp->key, id, key_buffer);
     }
 
-    GRN_BULK_REWIND(&bulk);
+    GRN_BULK_REWIND(&vector);
     grn_table_group_multi_keys_vector_record(ctx,
                                              keys, key_buffers, 0, n_keys,
                                              results, n_results,
-                                             id, ri, &bulk);
+                                             id, ri, &vector, &bulk);
   }
   for (k = 0; k < n_keys; k++) {
     GRN_OBJ_FIN(ctx, &(key_buffers[k]));
   }
   GRN_FREE(key_buffers);
+  GRN_OBJ_FIN(ctx, &vector);
   GRN_OBJ_FIN(ctx, &bulk);
   grn_table_cursor_close(ctx, tc);
 }

  Modified: lib/proc.c (+1 -1)
===================================================================
--- lib/proc.c    2014-11-24 12:48:01 +0900 (437b953)
+++ lib/proc.c    2014-11-24 14:37:45 +0900 (949a86c)
@@ -750,7 +750,7 @@ grn_select_drilldowns(grn_ctx *ctx, grn_obj *table,
     GRN_OUTPUT_STR(drilldown->label, drilldown->label_len);
 
     result.key_begin = 0;
-    result.key_end = n_keys;
+    result.key_end = n_keys - 1;
     grn_table_group(ctx, table, keys, n_keys, &result, 1);
     n_hits = grn_table_size(ctx, result.table);
 
-------------- next part --------------
HTML����������������������������...
ダウンロード 



More information about the Groonga-commit mailing list
アーカイブの一覧に戻る