Navigation Menu

Skip to content

Commit

Permalink
Support min in drilldown
Browse files Browse the repository at this point in the history
  • Loading branch information
kou committed Jan 19, 2015
1 parent a1977d3 commit c3cf8b8
Show file tree
Hide file tree
Showing 8 changed files with 251 additions and 7 deletions.
4 changes: 3 additions & 1 deletion include/groonga/groonga.h
@@ -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
Expand Down Expand Up @@ -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)

Expand Down
70 changes: 64 additions & 6 deletions lib/db.c
Expand Up @@ -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)) {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 =
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
{
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions lib/grn_db.h
Expand Up @@ -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,
Expand Down
11 changes: 11 additions & 0 deletions lib/grn_rset.h
Expand Up @@ -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);
Expand Down
9 changes: 9 additions & 0 deletions lib/output.c
Expand Up @@ -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);
Expand Down
55 changes: 55 additions & 0 deletions lib/rset.c
Expand Up @@ -149,6 +149,61 @@ grn_rset_recinfo_set_max(grn_ctx *ctx,
*max_address = max;
}

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,
Expand Down
@@ -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
]
]
}
]
]
25 changes: 25 additions & 0 deletions test/command/suite/select/drilldown/labeled/calc_types/min.test
@@ -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

0 comments on commit c3cf8b8

Please sign in to comment.