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����������������������������...ダウンロード