Kouhei Sutou
null+****@clear*****
Mon Jan 19 18:30:00 JST 2015
Kouhei Sutou 2015-01-19 18:30:00 +0900 (Mon, 19 Jan 2015) New Revision: 111e785139eebab7659d6c4dcb0ff725a3bb43cf https://github.com/groonga/groonga/commit/111e785139eebab7659d6c4dcb0ff725a3bb43cf Message: group: support max Modified files: include/groonga/groonga.h lib/db.c lib/grn_db.h lib/grn_rset.h lib/output.c lib/rset.c Modified: include/groonga/groonga.h (+2 -0) =================================================================== --- include/groonga/groonga.h 2015-01-19 18:19:39 +0900 (1673733) +++ include/groonga/groonga.h 2015-01-19 18:30:00 +0900 (3b68d0c) @@ -753,6 +753,8 @@ GRN_API unsigned int grn_table_size(grn_ctx *ctx, grn_obj *table); #define GRN_COLUMN_NAME_SCORE_LEN (sizeof(GRN_COLUMN_NAME_SCORE) - 1) #define GRN_COLUMN_NAME_NSUBRECS "_nsubrecs" #define GRN_COLUMN_NAME_NSUBRECS_LEN (sizeof(GRN_COLUMN_NAME_NSUBRECS) - 1) +#define GRN_COLUMN_NAME_MAX "_max" +#define GRN_COLUMN_NAME_MAX_LEN (sizeof(GRN_COLUMN_NAME_MAX) - 1) #define GRN_COLUMN_NAME_SUM "_sum" #define GRN_COLUMN_NAME_SUM_LEN (sizeof(GRN_COLUMN_NAME_SUM) - 1) Modified: lib/db.c (+60 -0) =================================================================== --- lib/db.c 2015-01-19 18:19:39 +0900 (1df6d84) +++ lib/db.c 2015-01-19 18:30:00 +0900 (c4767f6) @@ -4704,6 +4704,7 @@ grn_obj_get_accessor_rset_value(grn_ctx *ctx, grn_obj *obj, goto exit; } break; + case GRN_ACCESSOR_GET_MAX : case GRN_ACCESSOR_GET_SUM : case GRN_ACCESSOR_GET_NSUBRECS : if (GRN_TABLE_IS_GROUPED(obj)) { @@ -4763,6 +4764,7 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned int case GRN_ACCESSOR_GET_VALUE : case GRN_ACCESSOR_GET_SCORE : case GRN_ACCESSOR_GET_NSUBRECS : + case GRN_ACCESSOR_GET_MAX : case GRN_ACCESSOR_GET_SUM : obj = grn_ctx_at(ctx, DB_OBJ(res->obj)->range); break; @@ -4963,6 +4965,18 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned int goto exit; } break; + case 'm' : /* max */ + if (len != GRN_COLUMN_NAME_MAX_LEN || + memcmp(name, + GRN_COLUMN_NAME_MAX, + GRN_COLUMN_NAME_MAX_LEN)) { + goto exit; + } + if (!grn_obj_get_accessor_rset_value(ctx, obj, &res, + GRN_ACCESSOR_GET_MAX)) { + goto exit; + } + break; default : res = NULL; goto exit; @@ -5101,6 +5115,7 @@ grn_obj_get_range_info(grn_ctx *ctx, grn_obj *obj, case GRN_ACCESSOR_GET_NSUBRECS : *range_id = GRN_DB_INT32; break; + case GRN_ACCESSOR_GET_MAX : case GRN_ACCESSOR_GET_SUM : *range_id = GRN_DB_INT64; break; @@ -5141,6 +5156,7 @@ grn_obj_is_persistent(grn_ctx *ctx, grn_obj *obj) switch (a->action) { case GRN_ACCESSOR_GET_SCORE : case GRN_ACCESSOR_GET_NSUBRECS : + case GRN_ACCESSOR_GET_MAX : case GRN_ACCESSOR_GET_SUM : res = 0; break; @@ -5628,6 +5644,15 @@ grn_accessor_get_value_(grn_ctx *ctx, grn_accessor *a, grn_id id, uint32_t *size *size = sizeof(int); } break; + case GRN_ACCESSOR_GET_MAX : + if ((value = grn_obj_get_value_(ctx, a->obj, id, size))) { + value = + (const char *)grn_rset_recinfo_get_max_(ctx, + (grn_rset_recinfo *)value, + a->obj); + *size = GRN_RSET_MAX_SIZE; + } + break; case GRN_ACCESSOR_GET_SUM : if ((value = grn_obj_get_value_(ctx, a->obj, id, size))) { value = @@ -5730,6 +5755,17 @@ grn_accessor_get_value(grn_ctx *ctx, grn_accessor *a, grn_id id, grn_obj *value) } value->header.domain = GRN_DB_INT32; break; + case GRN_ACCESSOR_GET_MAX : + if (id) { + grn_rset_recinfo *ri = (grn_rset_recinfo *)grn_obj_get_value_(ctx, a->obj, id, &vs); + int64_t sum; + sum = grn_rset_recinfo_get_max(ctx, ri, a->obj); + GRN_INT64_PUT(ctx, value, sum); + } else { + GRN_INT64_PUT(ctx, value, 0); + } + value->header.domain = GRN_DB_INT64; + break; case GRN_ACCESSOR_GET_SUM : if (id) { grn_rset_recinfo *ri = (grn_rset_recinfo *)grn_obj_get_value_(ctx, a->obj, id, &vs); @@ -5829,6 +5865,22 @@ grn_accessor_set_value(grn_ctx *ctx, grn_accessor *a, grn_id id, vp = &ri->n_subrecs; } break; + case GRN_ACCESSOR_GET_MAX : + grn_obj_get_value(ctx, a->obj, id, &buf); + { + grn_rset_recinfo *ri = (grn_rset_recinfo *)GRN_BULK_HEAD(&buf); + if (value->header.type == GRN_DB_INT64) { + grn_rset_recinfo_set_max(ctx, ri, a->obj, GRN_INT64_VALUE(value)); + } else { + grn_obj value_int64; + GRN_INT64_INIT(&value_int64, 0); + if (!grn_obj_cast(ctx, value, &value_int64, GRN_FALSE)) { + grn_rset_recinfo_set_max(ctx, ri, a->obj, + GRN_INT64_VALUE(&value_int64)); + } + } + } + break; case GRN_ACCESSOR_GET_SUM : grn_obj_get_value(ctx, a->obj, id, &buf); { @@ -9170,6 +9222,9 @@ grn_column_name(grn_ctx *ctx, grn_obj *obj, char *namebuf, int buf_size) case GRN_ACCESSOR_GET_NSUBRECS : name = GRN_COLUMN_NAME_NSUBRECS; break; + case GRN_ACCESSOR_GET_MAX : + name = GRN_COLUMN_NAME_MAX; + break; case GRN_ACCESSOR_GET_SUM : name = GRN_COLUMN_NAME_SUM; break; @@ -9236,6 +9291,11 @@ grn_column_name_(grn_ctx *ctx, grn_obj *obj, grn_obj *buf) GRN_COLUMN_NAME_NSUBRECS, GRN_COLUMN_NAME_NSUBRECS_LEN); break; + case GRN_ACCESSOR_GET_MAX : + GRN_TEXT_PUT(ctx, buf, + GRN_COLUMN_NAME_MAX, + GRN_COLUMN_NAME_MAX_LEN); + break; case GRN_ACCESSOR_GET_SUM : GRN_TEXT_PUT(ctx, buf, GRN_COLUMN_NAME_SUM, Modified: lib/grn_db.h (+1 -0) =================================================================== --- lib/grn_db.h 2015-01-19 18:19:39 +0900 (a585612) +++ lib/grn_db.h 2015-01-19 18:30:00 +0900 (b6b8d93) @@ -221,6 +221,7 @@ enum { GRN_ACCESSOR_GET_VALUE, GRN_ACCESSOR_GET_SCORE, GRN_ACCESSOR_GET_NSUBRECS, + GRN_ACCESSOR_GET_MAX, GRN_ACCESSOR_GET_SUM, GRN_ACCESSOR_GET_COLUMN_VALUE, GRN_ACCESSOR_GET_DB_OBJ, Modified: lib/grn_rset.h (+11 -0) =================================================================== --- lib/grn_rset.h 2015-01-19 18:19:39 +0900 (1c0b7f8) +++ lib/grn_rset.h 2015-01-19 18:30:00 +0900 (071c02a) @@ -64,6 +64,17 @@ void grn_rset_recinfo_update_calc_values(grn_ctx *ctx, grn_obj *table, grn_obj *value); +int64_t *grn_rset_recinfo_get_max_(grn_ctx *ctx, + grn_rset_recinfo *ri, + grn_obj *table); +int64_t grn_rset_recinfo_get_max(grn_ctx *ctx, + grn_rset_recinfo *ri, + grn_obj *table); +void grn_rset_recinfo_set_max(grn_ctx *ctx, + grn_rset_recinfo *ri, + grn_obj *table, + int64_t max); + int64_t *grn_rset_recinfo_get_sum_(grn_ctx *ctx, grn_rset_recinfo *ri, grn_obj *table); Modified: lib/output.c (+9 -0) =================================================================== --- lib/output.c 2015-01-19 18:19:39 +0900 (e69c8b4) +++ lib/output.c 2015-01-19 18:30:00 +0900 (99934a2) @@ -533,6 +533,15 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, } buf.header.domain = GRN_DB_INT32; break; + case GRN_ACCESSOR_GET_MAX : + { + grn_rset_recinfo *ri = (grn_rset_recinfo *)grn_obj_get_value_(ctx, a->obj, id, &vs); + int64_t max; + max = grn_rset_recinfo_get_max(ctx, ri, a->obj); + GRN_INT64_PUT(ctx, &buf, max); + } + buf.header.domain = GRN_DB_INT64; + break; case GRN_ACCESSOR_GET_SUM : { grn_rset_recinfo *ri = (grn_rset_recinfo *)grn_obj_get_value_(ctx, a->obj, id, &vs); Modified: lib/rset.c (+51 -0) =================================================================== --- lib/rset.c 2015-01-19 18:19:39 +0900 (ea24923) +++ lib/rset.c 2015-01-19 18:30:00 +0900 (0de7b5e) @@ -99,6 +99,57 @@ grn_rset_recinfo_update_calc_values(grn_ctx *ctx, } int64_t * +grn_rset_recinfo_get_max_(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_MAX)) { + return NULL; + } + + values = (((byte *)ri->subrecs) + + GRN_RSET_SUBRECS_SIZE(DB_OBJ(table)->subrec_size, + DB_OBJ(table)->max_n_subrecs)); + + return (int64_t *)values; +} + +int64_t +grn_rset_recinfo_get_max(grn_ctx *ctx, + grn_rset_recinfo *ri, + grn_obj *table) +{ + int64_t *max_address; + + max_address = grn_rset_recinfo_get_max_(ctx, ri, table); + if (max_address) { + return *max_address; + } else { + return 0; + } +} + +void +grn_rset_recinfo_set_max(grn_ctx *ctx, + grn_rset_recinfo *ri, + grn_obj *table, + int64_t max) +{ + int64_t *max_address; + + max_address = grn_rset_recinfo_get_max_(ctx, ri, table); + if (!max_address) { + return; + } + + *max_address = max; +} + +int64_t * grn_rset_recinfo_get_sum_(grn_ctx *ctx, grn_rset_recinfo *ri, grn_obj *table) -------------- next part -------------- HTML����������������������������... 下载