Kouhei Sutou
null+****@clear*****
Mon Jan 19 18:43:47 JST 2015
Kouhei Sutou 2015-01-19 18:43:47 +0900 (Mon, 19 Jan 2015) New Revision: c3cf8b8d53e054dcfb299f47f6a77d15463390f6 https://github.com/groonga/groonga/commit/c3cf8b8d53e054dcfb299f47f6a77d15463390f6 Message: Support min in drilldown Added files: test/command/suite/select/drilldown/labeled/calc_types/min.expected test/command/suite/select/drilldown/labeled/calc_types/min.test 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 (+3 -1) =================================================================== --- include/groonga/groonga.h 2015-01-19 18:42:53 +0900 (3b68d0c) +++ include/groonga/groonga.h 2015-01-19 18:43:47 +0900 (b02785a) @@ -1,5 +1,5 @@ /* - Copyright(C) 2009-2014 Brazil + 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 @@ -755,6 +755,8 @@ GRN_API unsigned int grn_table_size(grn_ctx *ctx, grn_obj *table); #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_MIN "_min" +#define GRN_COLUMN_NAME_MIN_LEN (sizeof(GRN_COLUMN_NAME_MIN) - 1) #define GRN_COLUMN_NAME_SUM "_sum" #define GRN_COLUMN_NAME_SUM_LEN (sizeof(GRN_COLUMN_NAME_SUM) - 1) Modified: lib/db.c (+64 -6) =================================================================== --- lib/db.c 2015-01-19 18:42:53 +0900 (7a81d35) +++ lib/db.c 2015-01-19 18:43:47 +0900 (be82416) @@ -4705,6 +4705,7 @@ grn_obj_get_accessor_rset_value(grn_ctx *ctx, grn_obj *obj, } break; case GRN_ACCESSOR_GET_MAX : + case GRN_ACCESSOR_GET_MIN : case GRN_ACCESSOR_GET_SUM : case GRN_ACCESSOR_GET_NSUBRECS : if (GRN_TABLE_IS_GROUPED(obj)) { @@ -4765,6 +4766,7 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned int case GRN_ACCESSOR_GET_SCORE : case GRN_ACCESSOR_GET_NSUBRECS : case GRN_ACCESSOR_GET_MAX : + case GRN_ACCESSOR_GET_MIN : case GRN_ACCESSOR_GET_SUM : obj = grn_ctx_at(ctx, DB_OBJ(res->obj)->range); break; @@ -4966,14 +4968,23 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned int } break; case 'm' : /* max */ - if (len != GRN_COLUMN_NAME_MAX_LEN || + 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)) { + GRN_COLUMN_NAME_MAX_LEN) == 0) { + if (!grn_obj_get_accessor_rset_value(ctx, obj, &res, + GRN_ACCESSOR_GET_MAX)) { + goto exit; + } + } else if (len == GRN_COLUMN_NAME_MIN_LEN && + memcmp(name, + GRN_COLUMN_NAME_MIN, + GRN_COLUMN_NAME_MIN_LEN) == 0) { + if (!grn_obj_get_accessor_rset_value(ctx, obj, &res, + GRN_ACCESSOR_GET_MIN)) { + goto exit; + } + } else { goto exit; } break; @@ -5116,6 +5127,7 @@ grn_obj_get_range_info(grn_ctx *ctx, grn_obj *obj, *range_id = GRN_DB_INT32; break; case GRN_ACCESSOR_GET_MAX : + case GRN_ACCESSOR_GET_MIN : case GRN_ACCESSOR_GET_SUM : *range_id = GRN_DB_INT64; break; @@ -5157,6 +5169,7 @@ grn_obj_is_persistent(grn_ctx *ctx, grn_obj *obj) case GRN_ACCESSOR_GET_SCORE : case GRN_ACCESSOR_GET_NSUBRECS : case GRN_ACCESSOR_GET_MAX : + case GRN_ACCESSOR_GET_MIN : case GRN_ACCESSOR_GET_SUM : res = 0; break; @@ -5653,6 +5666,15 @@ grn_accessor_get_value_(grn_ctx *ctx, grn_accessor *a, grn_id id, uint32_t *size *size = GRN_RSET_MAX_SIZE; } break; + case GRN_ACCESSOR_GET_MIN : + if ((value = grn_obj_get_value_(ctx, a->obj, id, size))) { + value = + (const char *)grn_rset_recinfo_get_min_(ctx, + (grn_rset_recinfo *)value, + a->obj); + *size = GRN_RSET_MIN_SIZE; + } + break; case GRN_ACCESSOR_GET_SUM : if ((value = grn_obj_get_value_(ctx, a->obj, id, size))) { value = @@ -5766,6 +5788,17 @@ grn_accessor_get_value(grn_ctx *ctx, grn_accessor *a, grn_id id, grn_obj *value) } value->header.domain = GRN_DB_INT64; break; + case GRN_ACCESSOR_GET_MIN : + if (id) { + grn_rset_recinfo *ri = (grn_rset_recinfo *)grn_obj_get_value_(ctx, a->obj, id, &vs); + int64_t min; + min = grn_rset_recinfo_get_min(ctx, ri, a->obj); + GRN_INT64_PUT(ctx, value, min); + } 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); @@ -5882,6 +5915,23 @@ grn_accessor_set_value(grn_ctx *ctx, grn_accessor *a, grn_id id, } } break; + case GRN_ACCESSOR_GET_MIN : + 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_min(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_min(ctx, ri, a->obj, + GRN_INT64_VALUE(&value_int64)); + } + GRN_OBJ_FIN(ctx, &value_int64); + } + } + break; case GRN_ACCESSOR_GET_SUM : grn_obj_get_value(ctx, a->obj, id, &buf); { @@ -9227,6 +9277,9 @@ grn_column_name(grn_ctx *ctx, grn_obj *obj, char *namebuf, int buf_size) case GRN_ACCESSOR_GET_MAX : name = GRN_COLUMN_NAME_MAX; break; + case GRN_ACCESSOR_GET_MIN : + name = GRN_COLUMN_NAME_MIN; + break; case GRN_ACCESSOR_GET_SUM : name = GRN_COLUMN_NAME_SUM; break; @@ -9298,6 +9351,11 @@ grn_column_name_(grn_ctx *ctx, grn_obj *obj, grn_obj *buf) GRN_COLUMN_NAME_MAX, GRN_COLUMN_NAME_MAX_LEN); break; + case GRN_ACCESSOR_GET_MIN : + GRN_TEXT_PUT(ctx, buf, + GRN_COLUMN_NAME_MIN, + GRN_COLUMN_NAME_MIN_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:42:53 +0900 (b6b8d93) +++ lib/grn_db.h 2015-01-19 18:43:47 +0900 (ed027d7) @@ -222,6 +222,7 @@ enum { GRN_ACCESSOR_GET_SCORE, GRN_ACCESSOR_GET_NSUBRECS, GRN_ACCESSOR_GET_MAX, + GRN_ACCESSOR_GET_MIN, 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:42:53 +0900 (071c02a) +++ lib/grn_rset.h 2015-01-19 18:43:47 +0900 (787eb5b) @@ -75,6 +75,17 @@ void grn_rset_recinfo_set_max(grn_ctx *ctx, grn_obj *table, int64_t max); +int64_t *grn_rset_recinfo_get_min_(grn_ctx *ctx, + grn_rset_recinfo *ri, + grn_obj *table); +int64_t grn_rset_recinfo_get_min(grn_ctx *ctx, + grn_rset_recinfo *ri, + grn_obj *table); +void grn_rset_recinfo_set_min(grn_ctx *ctx, + grn_rset_recinfo *ri, + grn_obj *table, + int64_t min); + 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:42:53 +0900 (99934a2) +++ lib/output.c 2015-01-19 18:43:47 +0900 (2ae4632) @@ -542,6 +542,15 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, } buf.header.domain = GRN_DB_INT64; break; + case GRN_ACCESSOR_GET_MIN : + { + grn_rset_recinfo *ri = (grn_rset_recinfo *)grn_obj_get_value_(ctx, a->obj, id, &vs); + int64_t min; + min = grn_rset_recinfo_get_min(ctx, ri, a->obj); + GRN_INT64_PUT(ctx, &buf, min); + } + 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 (+55 -0) =================================================================== --- lib/rset.c 2015-01-19 18:42:53 +0900 (0de7b5e) +++ lib/rset.c 2015-01-19 18:43:47 +0900 (59e14a8) @@ -150,6 +150,61 @@ grn_rset_recinfo_set_max(grn_ctx *ctx, } int64_t * +grn_rset_recinfo_get_min_(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_MIN)) { + 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; + } + + return (int64_t *)values; +} + +int64_t +grn_rset_recinfo_get_min(grn_ctx *ctx, + grn_rset_recinfo *ri, + grn_obj *table) +{ + int64_t *min_address; + + min_address = grn_rset_recinfo_get_min_(ctx, ri, table); + if (min_address) { + return *min_address; + } else { + return 0; + } +} + +void +grn_rset_recinfo_set_min(grn_ctx *ctx, + grn_rset_recinfo *ri, + grn_obj *table, + int64_t min) +{ + int64_t *min_address; + + min_address = grn_rset_recinfo_get_min_(ctx, ri, table); + if (!min_address) { + return; + } + + *min_address = min; +} + +int64_t * grn_rset_recinfo_get_sum_(grn_ctx *ctx, grn_rset_recinfo *ri, grn_obj *table) Added: test/command/suite/select/drilldown/labeled/calc_types/min.expected (+83 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/drilldown/labeled/calc_types/min.expected 2015-01-19 18:43:47 +0900 (9dbd51f) @@ -0,0 +1,83 @@ +table_create Tags TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +table_create Memos TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +column_create Memos tag COLUMN_SCALAR Tags +[[0,0.0,0.0],true] +column_create Memos priority COLUMN_SCALAR Int64 +[[0,0.0,0.0],true] +load --table Memos +[ +{"_key": "Groonga1", "tag": "Groonga", "priority": 10}, +{"_key": "Groonga2", "tag": "Groonga", "priority": 20}, +{"_key": "Groonga3", "tag": "Groonga", "priority": 40}, +{"_key": "Mroonga1", "tag": "Mroonga", "priority": 50}, +{"_key": "Mroonga2", "tag": "Mroonga", "priority": 25}, +{"_key": "Mroonga3", "tag": "Mroonga", "priority": 5}, +{"_key": "Rroonga1", "tag": "Rroonga", "priority": 25}, +{"_key": "Rroonga2", "tag": "Rroonga", "priority": -25}, +{"_key": "Rroonga3", "tag": "Rroonga", "priority": 0} +] +[[0,0.0,0.0],9] +select Memos --limit 0 --drilldown[tag].keys tag --drilldown[tag].calc_types MIN --drilldown[tag].calc_target priority --drilldown[tag].output_columns _key,_min +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 9 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "_key", + "ShortText" + ], + [ + "priority", + "Int64" + ], + [ + "tag", + "Tags" + ] + ] + ], + { + "tag": [ + [ + 3 + ], + [ + [ + "_key", + "ShortText" + ], + [ + "_min", + "Int64" + ] + ], + [ + "Groonga", + 10 + ], + [ + "Mroonga", + 5 + ], + [ + "Rroonga", + -25 + ] + ] + } + ] +] Added: test/command/suite/select/drilldown/labeled/calc_types/min.test (+25 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/drilldown/labeled/calc_types/min.test 2015-01-19 18:43:47 +0900 (4fc67ff) @@ -0,0 +1,25 @@ +table_create Tags TABLE_PAT_KEY ShortText + +table_create Memos TABLE_HASH_KEY ShortText +column_create Memos tag COLUMN_SCALAR Tags +column_create Memos priority COLUMN_SCALAR Int64 + +load --table Memos +[ +{"_key": "Groonga1", "tag": "Groonga", "priority": 10}, +{"_key": "Groonga2", "tag": "Groonga", "priority": 20}, +{"_key": "Groonga3", "tag": "Groonga", "priority": 40}, +{"_key": "Mroonga1", "tag": "Mroonga", "priority": 50}, +{"_key": "Mroonga2", "tag": "Mroonga", "priority": 25}, +{"_key": "Mroonga3", "tag": "Mroonga", "priority": 5}, +{"_key": "Rroonga1", "tag": "Rroonga", "priority": 25}, +{"_key": "Rroonga2", "tag": "Rroonga", "priority": -25}, +{"_key": "Rroonga3", "tag": "Rroonga", "priority": 0} +] + +select Memos \ + --limit 0 \ + --drilldown[tag].keys tag \ + --drilldown[tag].calc_types MIN \ + --drilldown[tag].calc_target priority \ + --drilldown[tag].output_columns _key,_min -------------- next part -------------- HTML����������������������������...ダウンロード