[Groonga-commit] groonga/groonga at 111e785 [master] group: support max

Back to archive index

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����������������������������...
下载 



More information about the Groonga-commit mailing list
Back to archive index