[Groonga-commit] groonga/groonga at a745503 [master] Move grn_rset_* related code to rset.c

アーカイブの一覧に戻る

Kouhei Sutou null+****@clear*****
Mon Jan 19 17:06:23 JST 2015


Kouhei Sutou	2015-01-19 17:06:23 +0900 (Mon, 19 Jan 2015)

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

  Message:
    Move grn_rset_* related code to rset.c

  Added files:
    lib/rset.c
  Modified files:
    lib/db.c
    lib/grn_rset.h
    lib/output.c
    lib/sources.am

  Modified: lib/db.c (+13 -93)
===================================================================
--- lib/db.c    2015-01-19 16:39:29 +0900 (dc2c40c)
+++ lib/db.c    2015-01-19 17:06:23 +0900 (8597c5d)
@@ -3058,10 +3058,7 @@ grn_table_group_add_subrec(grn_ctx *ctx,
                            grn_obj *calc_target)
 {
   grn_table_group_flags flags;
-  byte *values;
   grn_obj value;
-  grn_obj value_int64;
-  grn_obj value_float;
 
   if (!(DB_OBJ(table)->header.flags & GRN_OBJ_WITH_SUBREC)) {
     return;
@@ -3078,54 +3075,9 @@ grn_table_group_add_subrec(grn_ctx *ctx,
     return;
   }
 
-  values = (((byte *)ri->subrecs) +
-            GRN_RSET_SUBRECS_SIZE(DB_OBJ(table)->subrec_size,
-                                  DB_OBJ(table)->max_n_subrecs));
-
   GRN_VOID_INIT(&value);
-  GRN_INT64_INIT(&value_int64, 0);
-  GRN_FLOAT_INIT(&value_float, 0);
-
   grn_obj_get_value(ctx, calc_target, pi->rid, &value);
-  if (flags & (GRN_TABLE_GROUP_CALC_MAX |
-               GRN_TABLE_GROUP_CALC_MIN |
-               GRN_TABLE_GROUP_CALC_SUM)) {
-    grn_obj_cast(ctx, &value, &value_int64, GRN_FALSE);
-  }
-  if (flags & GRN_TABLE_GROUP_CALC_AVG) {
-    grn_obj_cast(ctx, &value, &value_float, GRN_FALSE);
-  }
-
-  if (flags & GRN_TABLE_GROUP_CALC_MAX) {
-    int64_t current_max = *((int64_t *)values);
-    int64_t value_raw = GRN_INT64_VALUE(&value_int64);
-    if (ri->n_subrecs == 1 || value_raw > current_max) {
-      *((int64_t *)values) = value_raw;
-    }
-    values += GRN_RSET_MAX_SIZE;
-  }
-  if (flags & GRN_TABLE_GROUP_CALC_MIN) {
-    int64_t current_min = *((int64_t *)values);
-    int64_t value_raw = GRN_INT64_VALUE(&value_int64);
-    if (ri->n_subrecs == 1 || value_raw < current_min) {
-      *((int64_t *)values) = value_raw;
-    }
-    values += GRN_RSET_MIN_SIZE;
-  }
-  if (flags & GRN_TABLE_GROUP_CALC_SUM) {
-    int64_t value_raw = GRN_INT64_VALUE(&value_int64);
-    *((int64_t *)values) += value_raw;
-    values += GRN_RSET_SUM_SIZE;
-  }
-  if (flags & GRN_TABLE_GROUP_CALC_AVG) {
-    double current_average = *((double *)values);
-    int64_t value_raw = GRN_FLOAT_VALUE(&value_float);
-    *((double *)values) += (value_raw - current_average) / ri->n_subrecs;
-    values += GRN_RSET_AVG_SIZE;
-  }
-
-  GRN_OBJ_FIN(ctx, &value_float);
-  GRN_OBJ_FIN(ctx, &value_int64);
+  grn_rset_recinfo_update_calc_values(ctx, ri, table, &value);
   GRN_OBJ_FIN(ctx, &value);
 }
 
@@ -3690,7 +3642,7 @@ grn_table_group(grn_ctx *ctx, grn_obj *table,
       if (!rp->table) {
         grn_obj_flags flags;
         grn_obj *key_type = NULL;
-        uint32_t additional_value_size = 0;
+        uint32_t additional_value_size;
 
         flags = GRN_TABLE_HASH_KEY|
           GRN_OBJ_WITH_SUBREC|
@@ -3700,18 +3652,8 @@ grn_table_group(grn_ctx *ctx, grn_obj *table,
         } else {
           flags |= GRN_OBJ_KEY_VAR_SIZE;
         }
-        if (rp->flags & GRN_TABLE_GROUP_CALC_MAX) {
-          additional_value_size += GRN_RSET_MAX_SIZE;
-        }
-        if (rp->flags & GRN_TABLE_GROUP_CALC_MIN) {
-          additional_value_size += GRN_RSET_MIN_SIZE;
-        }
-        if (rp->flags & GRN_TABLE_GROUP_CALC_SUM) {
-          additional_value_size += GRN_RSET_SUM_SIZE;
-        }
-        if (rp->flags & GRN_TABLE_GROUP_CALC_AVG) {
-          additional_value_size += GRN_RSET_AVG_SIZE;
-        }
+        additional_value_size = grn_rset_recinfo_calc_values_size(ctx,
+                                                                  rp->flags);
         rp->table = grn_table_create_with_max_n_subrecs(ctx, NULL, 0, NULL,
                                                         flags,
                                                         key_type, table,
@@ -5701,15 +5643,9 @@ grn_accessor_get_value_(grn_ctx *ctx, grn_accessor *a, grn_id id, uint32_t *size
       break;
     case GRN_ACCESSOR_GET_SUM :
       if ((value = grn_obj_get_value_(ctx, a->obj, id, size))) {
-        value = ((const char *)(((grn_rset_recinfo *)value)->subrecs) +
-                 GRN_RSET_SUBRECS_SIZE(DB_OBJ(a->obj)->subrec_size,
-                                       DB_OBJ(a->obj)->max_n_subrecs));
-        if (DB_OBJ(a->obj)->flags.group & GRN_TABLE_GROUP_CALC_MAX) {
-          value += GRN_RSET_MAX_SIZE;
-        }
-        if (DB_OBJ(a->obj)->flags.group & GRN_TABLE_GROUP_CALC_MIN) {
-          value += GRN_RSET_MIN_SIZE;
-        }
+        value = grn_rset_recinfo_get_sum_(ctx,
+                                          (grn_rset_recinfo *)value,
+                                          a->obj);
         *size = GRN_RSET_SUM_SIZE;
       }
       break;
@@ -5809,17 +5745,9 @@ grn_accessor_get_value(grn_ctx *ctx, grn_accessor *a, grn_id id, grn_obj *value)
     case GRN_ACCESSOR_GET_SUM :
       if (id) {
         grn_rset_recinfo *ri = (grn_rset_recinfo *)grn_obj_get_value_(ctx, a->obj, id, &vs);
-        byte *values;
-        values = ((char *)(ri->subrecs) +
-                  GRN_RSET_SUBRECS_SIZE(DB_OBJ(a->obj)->subrec_size,
-                                        DB_OBJ(a->obj)->max_n_subrecs));
-        if (DB_OBJ(a->obj)->flags.group & GRN_TABLE_GROUP_CALC_MAX) {
-          values += GRN_RSET_MAX_SIZE;
-        }
-        if (DB_OBJ(a->obj)->flags.group & GRN_TABLE_GROUP_CALC_MIN) {
-          values += GRN_RSET_MIN_SIZE;
-        }
-        GRN_INT64_PUT(ctx, value, *((int64_t *)values));
+        int64_t sum;
+        sum = grn_rset_recinfo_get_sum(ctx, ri, a->obj);
+        GRN_INT64_PUT(ctx, value, sum);
       } else {
         GRN_INT64_PUT(ctx, value, 0);
       }
@@ -5917,17 +5845,9 @@ grn_accessor_set_value(grn_ctx *ctx, grn_accessor *a, grn_id id,
         grn_obj_get_value(ctx, a->obj, id, &buf);
         {
           grn_rset_recinfo *ri = (grn_rset_recinfo *)GRN_BULK_HEAD(&buf);
-          char *values;
-          values = ((char *)(ri->subrecs) +
-                    GRN_RSET_SUBRECS_SIZE(DB_OBJ(a->obj)->subrec_size,
-                                          DB_OBJ(a->obj)->max_n_subrecs));
-          if (DB_OBJ(a->obj)->flags.group & GRN_TABLE_GROUP_CALC_MAX) {
-            values += GRN_RSET_MAX_SIZE;
-          }
-          if (DB_OBJ(a->obj)->flags.group & GRN_TABLE_GROUP_CALC_MIN) {
-            values += GRN_RSET_MIN_SIZE;
-          }
-          vp = values;
+          int64_t *sum;
+          sum = grn_rset_recinfo_get_sum_(ctx, ri, a->obj);
+          vp = sum;
         }
         break;
       case GRN_ACCESSOR_GET_COLUMN_VALUE :

  Modified: lib/grn_rset.h (+13 -0)
===================================================================
--- lib/grn_rset.h    2015-01-19 16:39:29 +0900 (969407c)
+++ lib/grn_rset.h    2015-01-19 17:06:23 +0900 (081bae6)
@@ -57,6 +57,19 @@ typedef struct {
 #define GRN_RSET_SUBRECS_SIZE(subrec_size,n) \
   (GRN_RSET_SUBREC_SIZE(subrec_size) * n)
 
+uint32_t grn_rset_recinfo_calc_values_size(grn_ctx *ctx,
+                                           grn_table_group_flags flags);
+void grn_rset_recinfo_update_calc_values(grn_ctx *ctx,
+                                         grn_rset_recinfo *ri,
+                                         grn_obj *table,
+                                         grn_obj *value);
+
+int64_t *grn_rset_recinfo_get_sum_(grn_ctx *ctx,
+                                   grn_rset_recinfo *ri,
+                                   grn_obj *table);
+int64_t grn_rset_recinfo_get_sum(grn_ctx *ctx,
+                                 grn_rset_recinfo *ri,
+                                 grn_obj *table);
 
 #ifdef __cplusplus
 }

  Modified: lib/output.c (+3 -11)
===================================================================
--- lib/output.c    2015-01-19 16:39:29 +0900 (97a9ce2)
+++ lib/output.c    2015-01-19 17:06:23 +0900 (e69c8b4)
@@ -536,17 +536,9 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
       case GRN_ACCESSOR_GET_SUM :
         {
           grn_rset_recinfo *ri = (grn_rset_recinfo *)grn_obj_get_value_(ctx, a->obj, id, &vs);
-          byte *values;
-          values = ((char *)(ri->subrecs) +
-                    GRN_RSET_SUBRECS_SIZE(DB_OBJ(a->obj)->subrec_size,
-                                          DB_OBJ(a->obj)->max_n_subrecs));
-          if (DB_OBJ(a->obj)->flags.group & GRN_TABLE_GROUP_CALC_MAX) {
-            values += GRN_RSET_MAX_SIZE;
-          }
-          if (DB_OBJ(a->obj)->flags.group & GRN_TABLE_GROUP_CALC_MIN) {
-            values += GRN_RSET_MIN_SIZE;
-          }
-          GRN_INT64_PUT(ctx, &buf, *((int64_t *)values));
+          int64_t sum;
+          sum = grn_rset_recinfo_get_sum(ctx, ri, a->obj);
+          GRN_INT64_PUT(ctx, &buf, sum);
         }
         buf.header.domain = GRN_DB_INT64;
         break;

  Added: lib/rset.c (+141 -0) 100644
===================================================================
--- /dev/null
+++ lib/rset.c    2015-01-19 17:06:23 +0900 (c3249e9)
@@ -0,0 +1,141 @@
+/* -*- c-basic-offset: 2 -*- */
+/* Copyright(C) 2009-2015 Brazil
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License version 2.1 as published by the Free Software Foundation.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+#include "grn_db.h"
+
+uint32_t
+grn_rset_recinfo_calc_values_size(grn_ctx *ctx, grn_table_group_flags flags)
+{
+  uint32_t size = 0;
+
+  if (flags & GRN_TABLE_GROUP_CALC_MAX) {
+    size += GRN_RSET_MAX_SIZE;
+  }
+  if (flags & GRN_TABLE_GROUP_CALC_MIN) {
+    size += GRN_RSET_MIN_SIZE;
+  }
+  if (flags & GRN_TABLE_GROUP_CALC_SUM) {
+    size += GRN_RSET_SUM_SIZE;
+  }
+  if (flags & GRN_TABLE_GROUP_CALC_AVG) {
+    size += GRN_RSET_AVG_SIZE;
+  }
+
+  return size;
+}
+
+void
+grn_rset_recinfo_update_calc_values(grn_ctx *ctx,
+                                    grn_rset_recinfo *ri,
+                                    grn_obj *table,
+                                    grn_obj *value)
+{
+  grn_table_group_flags flags;
+  byte *values;
+  grn_obj value_int64;
+  grn_obj value_float;
+
+  flags = DB_OBJ(table)->flags.group;
+
+  values = (((byte *)ri->subrecs) +
+            GRN_RSET_SUBRECS_SIZE(DB_OBJ(table)->subrec_size,
+                                  DB_OBJ(table)->max_n_subrecs));
+
+  GRN_INT64_INIT(&value_int64, 0);
+  GRN_FLOAT_INIT(&value_float, 0);
+
+  if (flags & (GRN_TABLE_GROUP_CALC_MAX |
+               GRN_TABLE_GROUP_CALC_MIN |
+               GRN_TABLE_GROUP_CALC_SUM)) {
+    grn_obj_cast(ctx, value, &value_int64, GRN_FALSE);
+  }
+  if (flags & GRN_TABLE_GROUP_CALC_AVG) {
+    grn_obj_cast(ctx, value, &value_float, GRN_FALSE);
+  }
+
+  if (flags & GRN_TABLE_GROUP_CALC_MAX) {
+    int64_t current_max = *((int64_t *)values);
+    int64_t value_raw = GRN_INT64_VALUE(&value_int64);
+    if (ri->n_subrecs == 1 || value_raw > current_max) {
+      *((int64_t *)values) = value_raw;
+    }
+    values += GRN_RSET_MAX_SIZE;
+  }
+  if (flags & GRN_TABLE_GROUP_CALC_MIN) {
+    int64_t current_min = *((int64_t *)values);
+    int64_t value_raw = GRN_INT64_VALUE(&value_int64);
+    if (ri->n_subrecs == 1 || value_raw < current_min) {
+      *((int64_t *)values) = value_raw;
+    }
+    values += GRN_RSET_MIN_SIZE;
+  }
+  if (flags & GRN_TABLE_GROUP_CALC_SUM) {
+    int64_t value_raw = GRN_INT64_VALUE(&value_int64);
+    *((int64_t *)values) += value_raw;
+    values += GRN_RSET_SUM_SIZE;
+  }
+  if (flags & GRN_TABLE_GROUP_CALC_AVG) {
+    double current_average = *((double *)values);
+    int64_t value_raw = GRN_FLOAT_VALUE(&value_float);
+    *((double *)values) += (value_raw - current_average) / ri->n_subrecs;
+    values += GRN_RSET_AVG_SIZE;
+  }
+
+  GRN_OBJ_FIN(ctx, &value_float);
+  GRN_OBJ_FIN(ctx, &value_int64);
+}
+
+int64_t *
+grn_rset_recinfo_get_sum_(grn_ctx *ctx,
+                          grn_rset_recinfo *ri,
+                          grn_obj *table)
+{
+  grn_table_group_flags flags;
+  byte *values;
+
+  flags = DB_OBJ(table)->flags.group;
+  if (!(flags & GRN_TABLE_GROUP_CALC_SUM)) {
+    return NULL;
+  }
+
+  values = (((byte *)ri->subrecs) +
+            GRN_RSET_SUBRECS_SIZE(DB_OBJ(table)->subrec_size,
+                                  DB_OBJ(table)->max_n_subrecs));
+
+  if (flags & GRN_TABLE_GROUP_CALC_MAX) {
+    values += GRN_RSET_MAX_SIZE;
+  }
+  if (flags & GRN_TABLE_GROUP_CALC_MIN) {
+    values += GRN_RSET_MIN_SIZE;
+  }
+
+  return (int64_t *)values;
+}
+
+int64_t
+grn_rset_recinfo_get_sum(grn_ctx *ctx,
+                         grn_rset_recinfo *ri,
+                         grn_obj *table)
+{
+  int64_t *sum;
+
+  sum = grn_rset_recinfo_get_sum_(ctx, ri, table);
+  if (sum) {
+    return *sum;
+  } else {
+    return 0;
+  }
+}

  Modified: lib/sources.am (+1 -0)
===================================================================
--- lib/sources.am    2015-01-19 16:39:29 +0900 (f49baed)
+++ lib/sources.am    2015-01-19 17:06:23 +0900 (185b64b)
@@ -40,6 +40,7 @@ libgroonga_la_SOURCES =				\
 	grn_proc.h				\
 	request_canceler.c			\
 	grn_request_canceler.h			\
+	rset.c					\
 	grn_rset.h				\
 	snip.c					\
 	grn_snip.h				\
-------------- next part --------------
HTML����������������������������...
ダウンロード 



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