[Groonga-commit] groonga/groonga at 962db9a [master] Extract group code for single key and single result as a function

Back to archive index

Kouhei Sutou null+****@clear*****
Mon Nov 24 21:27:45 JST 2014


Kouhei Sutou	2014-11-24 21:27:45 +0900 (Mon, 24 Nov 2014)

  New Revision: 962db9a5d55b2a5e241da9fc91df0eabdb707765
  https://github.com/groonga/groonga/commit/962db9a5d55b2a5e241da9fc91df0eabdb707765

  Message:
    Extract group code for single key and single result as a function

  Modified files:
    lib/db.c

  Modified: lib/db.c (+78 -68)
===================================================================
--- lib/db.c    2014-11-24 21:19:41 +0900 (fc1d74f)
+++ lib/db.c    2014-11-24 21:27:45 +0900 (9ca83f1)
@@ -3073,6 +3073,82 @@ accelerated_table_group(grn_ctx *ctx, grn_obj *table, grn_obj *key, grn_obj *res
   return GRN_FALSE;
 }
 
+static void
+grn_table_group_single_key_records(grn_ctx *ctx, grn_obj *table,
+                                   grn_obj *key, grn_obj *res)
+{
+  grn_obj bulk;
+  grn_table_cursor *tc;
+
+  GRN_TEXT_INIT(&bulk, 0);
+  if ((tc = grn_table_cursor_open(ctx, table, NULL, 0, NULL, 0, 0, -1, 0))) {
+    grn_id id;
+    grn_obj *range = grn_ctx_at(ctx, grn_obj_get_range(ctx, key));
+    int idp = GRN_OBJ_TABLEP(range);
+    while ((id = grn_table_cursor_next_inline(ctx, tc))) {
+      void *value;
+      grn_rset_recinfo *ri = NULL;
+      GRN_BULK_REWIND(&bulk);
+      if (DB_OBJ(table)->header.flags & GRN_OBJ_WITH_SUBREC) {
+        grn_table_cursor_get_value_inline(ctx, tc, (void **)&ri);
+      }
+      grn_obj_get_value(ctx, key, id, &bulk);
+      switch (bulk.header.type) {
+      case GRN_UVECTOR :
+        {
+          // todo : support objects except grn_id
+          grn_id *v = (grn_id *)GRN_BULK_HEAD(&bulk);
+          grn_id *ve = (grn_id *)GRN_BULK_CURR(&bulk);
+          while (v < ve) {
+            if ((*v != GRN_ID_NIL) &&
+                grn_table_add_v_inline(ctx, res,
+                                       v, sizeof(grn_id), &value, NULL)) {
+              grn_table_add_subrec_inline(res, value, ri ? ri->score : 0,
+                                          (grn_rset_posinfo *)&id, 0);
+            }
+            v++;
+          }
+        }
+        break;
+      case GRN_VECTOR :
+        {
+          unsigned int i, n_elements;
+          n_elements = grn_vector_size(ctx, &bulk);
+          for (i = 0; i < n_elements; i++) {
+            const char *content;
+            unsigned int content_length;
+            content_length = grn_vector_get_element(ctx, &bulk, i,
+                                                    &content, NULL, NULL);
+            if (grn_table_add_v_inline(ctx, res,
+                                       content, content_length,
+                                       &value, NULL)) {
+              grn_table_add_subrec_inline(res, value, ri ? ri->score : 0,
+                                          (grn_rset_posinfo *)&id, 0);
+            }
+          }
+        }
+        break;
+      case GRN_BULK :
+        {
+          if ((!idp || *((grn_id *)GRN_BULK_HEAD(&bulk))) &&
+              grn_table_add_v_inline(ctx, res,
+                                     GRN_BULK_HEAD(&bulk), GRN_BULK_VSIZE(&bulk),
+                                     &value, NULL)) {
+            grn_table_add_subrec_inline(res, value, ri ? ri->score : 0,
+                                        (grn_rset_posinfo *)&id, 0);
+          }
+        }
+        break;
+      default :
+        ERR(GRN_INVALID_ARGUMENT, "invalid column");
+        break;
+      }
+    }
+    grn_table_cursor_close(ctx, tc);
+  }
+  grn_obj_close(ctx, &bulk);
+}
+
 grn_rc
 grn_table_group_with_range_gap(grn_ctx *ctx, grn_obj *table,
                                grn_table_sort_key *group_key,
@@ -3443,8 +3519,6 @@ grn_table_group(grn_ctx *ctx, grn_obj *table,
   GRN_API_ENTER;
   {
     int k, r;
-    grn_obj bulk;
-    grn_table_cursor *tc;
     grn_table_sort_key *kp;
     grn_table_group_result *rp;
     for (k = 0, kp = keys; k < n_keys; k++, kp++) {
@@ -3459,73 +3533,10 @@ grn_table_group(grn_ctx *ctx, grn_obj *table,
         goto exit;
       }
     }
-    GRN_TEXT_INIT(&bulk, 0);
     if (n_keys == 1 && n_results == 1) {
       if (!accelerated_table_group(ctx, table, keys->key, results->table)) {
-        if ((tc = grn_table_cursor_open(ctx, table, NULL, 0, NULL, 0, 0, -1, 0))) {
-          grn_id id;
-          grn_obj *range = grn_ctx_at(ctx, grn_obj_get_range(ctx, keys->key));
-          int idp = GRN_OBJ_TABLEP(range);
-          while ((id = grn_table_cursor_next_inline(ctx, tc))) {
-            void *value;
-            grn_rset_recinfo *ri = NULL;
-            GRN_BULK_REWIND(&bulk);
-            if (DB_OBJ(table)->header.flags & GRN_OBJ_WITH_SUBREC) {
-              grn_table_cursor_get_value_inline(ctx, tc, (void **)&ri);
-            }
-            grn_obj_get_value(ctx, keys->key, id, &bulk);
-            switch (bulk.header.type) {
-            case GRN_UVECTOR :
-              {
-                // todo : support objects except grn_id
-                grn_id *v = (grn_id *)GRN_BULK_HEAD(&bulk);
-                grn_id *ve = (grn_id *)GRN_BULK_CURR(&bulk);
-                while (v < ve) {
-                  if ((*v != GRN_ID_NIL) &&
-                      grn_table_add_v_inline(ctx, results->table, v, sizeof(grn_id), &value, NULL)) {
-                    grn_table_add_subrec_inline(results->table, value, ri ? ri->score : 0,
-                                                (grn_rset_posinfo *)&id, 0);
-                  }
-                  v++;
-                }
-              }
-              break;
-            case GRN_VECTOR :
-              {
-                unsigned int i, n_elements;
-                n_elements = grn_vector_size(ctx, &bulk);
-                for (i = 0; i < n_elements; i++) {
-                  const char *content;
-                  unsigned int content_length;
-                  content_length = grn_vector_get_element(ctx, &bulk, i,
-                                                          &content, NULL, NULL);
-                  if (grn_table_add_v_inline(ctx, results->table,
-                                             content, content_length,
-                                             &value, NULL)) {
-                    grn_table_add_subrec_inline(results->table, value,
-                                                ri ? ri->score : 0,
-                                                (grn_rset_posinfo *)&id, 0);
-                  }
-                }
-              }
-              break;
-            case GRN_BULK :
-              {
-                if ((!idp || *((grn_id *)GRN_BULK_HEAD(&bulk))) &&
-                    grn_table_add_v_inline(ctx, results->table,
-                                           GRN_BULK_HEAD(&bulk), GRN_BULK_VSIZE(&bulk), &value, NULL)) {
-                  grn_table_add_subrec_inline(results->table, value, ri ? ri->score : 0,
-                                              (grn_rset_posinfo *)&id, 0);
-                }
-              }
-              break;
-            default :
-              ERR(GRN_INVALID_ARGUMENT, "invalid column");
-              break;
-            }
-          }
-          grn_table_cursor_close(ctx, tc);
-        }
+        grn_table_group_single_key_records(ctx, table,
+                                           keys->key, results->table);
       }
     } else {
       grn_bool have_vector = GRN_FALSE;
@@ -3548,7 +3559,6 @@ grn_table_group(grn_ctx *ctx, grn_obj *table,
                                                   results, n_results);
       }
     }
-    grn_obj_close(ctx, &bulk);
     for (r = 0, rp = results; r < n_results; r++, rp++) {
       GRN_TABLE_GROUPED_ON(rp->table);
     }
-------------- next part --------------
HTML����������������������������...
下載 



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