[Groonga-commit] groonga/groonga at c3cf8b8 [master] Support min in drilldown

アーカイブの一覧に戻る

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����������������������������...
ダウンロード 



More information about the Groonga-commit mailing list
アーカイブの一覧に戻る