Navigation Menu

Skip to content

Commit

Permalink
group: support max
Browse files Browse the repository at this point in the history
  • Loading branch information
kou committed Jan 19, 2015
1 parent 0a09bcf commit 111e785
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 0 deletions.
2 changes: 2 additions & 0 deletions include/groonga/groonga.h
Expand Up @@ -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)

Expand Down
60 changes: 60 additions & 0 deletions lib/db.c
Expand Up @@ -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)) {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 =
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
{
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions lib/grn_db.h
Expand Up @@ -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,
Expand Down
11 changes: 11 additions & 0 deletions lib/grn_rset.h
Expand Up @@ -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);
Expand Down
9 changes: 9 additions & 0 deletions lib/output.c
Expand Up @@ -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);
Expand Down
51 changes: 51 additions & 0 deletions lib/rset.c
Expand Up @@ -98,6 +98,57 @@ grn_rset_recinfo_update_calc_values(grn_ctx *ctx,
GRN_OBJ_FIN(ctx, &value_int64);
}

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,
Expand Down

0 comments on commit 111e785

Please sign in to comment.