[Groonga-commit] groonga/groonga [master] Support X + Y, X >> Y and X >>> Y operations for Int8 type

アーカイブの一覧に戻る

Kouhei Sutou null+****@clear*****
Wed Feb 27 18:26:02 JST 2013


Kouhei Sutou	2013-02-27 18:26:02 +0900 (Wed, 27 Feb 2013)

  New Revision: d647a80714e9ec19366e1126ead4c450cefb5f1e
  https://github.com/groonga/groonga/commit/d647a80714e9ec19366e1126ead4c450cefb5f1e

  Merged d686f72: Merge pull request #56 from groonga/support-numeric-arithmetic-operations-for-small-value-types

  Log:
    Support X + Y, X >> Y and X >>> Y operations for Int8 type
    
    Other operations such as X - Y will be also supported by this
    change. But they are not tested yet.
    
    I wanted to support one operation per a commit but this change is the
    minimum change. :<

  Added files:
    test/command/suite/select/operation/plus/int8.expected
    test/command/suite/select/operation/plus/int8.test
    test/command/suite/select/operation/shift_r/int8.expected
    test/command/suite/select/operation/shift_r/int8.test
    test/command/suite/select/operation/shift_rr/int8.expected
    test/command/suite/select/operation/shift_rr/int8.test
  Modified files:
    lib/expr.c

  Modified: lib/expr.c (+53 -2)
===================================================================
--- lib/expr.c    2013-02-26 15:50:31 +0900 (dfcc0bf)
+++ lib/expr.c    2013-02-27 18:26:02 +0900 (d7a0ee6)
@@ -1847,6 +1847,8 @@ grn_proc_call(grn_ctx *ctx, grn_obj *proc, int nargs, grn_obj *caller)
 #define INTEGER_ARITHMETIC_OPERATION_SHIFTR(x, y) ((x) >> (y))
 #define FLOAT_ARITHMETIC_OPERATION_SHIFTR(x, y)                         \
   ((long long int)(x) >> (long long int)(y))
+#define INTEGER8_ARITHMETIC_OPERATION_SHIFTRR(x, y)             \
+  ((uint8_t)(x) >> (y))
 #define INTEGER32_ARITHMETIC_OPERATION_SHIFTRR(x, y)            \
   ((unsigned int)(x) >> (y))
 #define INTEGER64_ARITHMETIC_OPERATION_SHIFTRR(x, y)            \
@@ -1914,6 +1916,14 @@ grn_proc_call(grn_ctx *ctx, grn_obj *proc, int nargs, grn_obj *caller)
                                               right_expression_check,   \
                                               invalid_type_error) do {  \
   switch (y->header.domain) {                                           \
+  case GRN_DB_INT8 :                                                    \
+    {                                                                   \
+      int8_t y_;                                                        \
+      y_ = GRN_INT8_VALUE(y);                                           \
+      right_expression_check(y_);                                       \
+      set(ctx, res, integer_operation(x_, y_));                         \
+    }                                                                   \
+    break;                                                              \
   case GRN_DB_INT32 :                                                   \
     {                                                                   \
       int y_;                                                           \
@@ -1983,6 +1993,7 @@ grn_proc_call(grn_ctx *ctx, grn_obj *proc, int nargs, grn_obj *caller)
 
 
 #define ARITHMETIC_OPERATION_DISPATCH(x, y, res,                        \
+                                      integer8_operation,               \
                                       integer32_operation,              \
                                       integer64_operation,              \
                                       float_operation,                  \
@@ -1991,6 +2002,20 @@ grn_proc_call(grn_ctx *ctx, grn_obj *proc, int nargs, grn_obj *caller)
                                       text_operation,                   \
                                       invalid_type_error) do {          \
   switch (x->header.domain) {                                           \
+  case GRN_DB_INT8 :                                                    \
+    {                                                                   \
+      int8_t x_;                                                        \
+      x_ = GRN_INT8_VALUE(x);                                           \
+      left_expression_check(x_);                                        \
+      NUMERIC_ARITHMETIC_OPERATION_DISPATCH(GRN_INT8_SET,               \
+                                            GRN_INT8_VALUE,             \
+                                            x_, y, res,                 \
+                                            integer8_operation,         \
+                                            float_operation,            \
+                                            right_expression_check,     \
+                                            invalid_type_error);        \
+    }                                                                   \
+    break;                                                              \
   case GRN_DB_INT32 :                                                   \
     {                                                                   \
       int x_;                                                           \
@@ -2087,7 +2112,8 @@ grn_proc_call(grn_ctx *ctx, grn_obj *proc, int nargs, grn_obj *caller)
   code++;                                                               \
 } while (0)
 
-#define ARITHMETIC_BINARY_OPERATION_DISPATCH(integer32_operation,       \
+#define ARITHMETIC_BINARY_OPERATION_DISPATCH(integer8_operation,        \
+                                             integer32_operation,       \
                                              integer64_operation,       \
                                              float_operation,           \
                                              left_expression_check,     \
@@ -2099,6 +2125,7 @@ grn_proc_call(grn_ctx *ctx, grn_obj *proc, int nargs, grn_obj *caller)
   POP2ALLOC1(x, y, res);                                                \
   res->header.domain = x->header.domain;                                \
   ARITHMETIC_OPERATION_DISPATCH(x, y, res,                              \
+                                integer8_operation,                     \
                                 integer32_operation,                    \
                                 integer64_operation,                    \
                                 float_operation,                        \
@@ -2244,7 +2271,8 @@ grn_proc_call(grn_ctx *ctx, grn_obj *proc, int nargs, grn_obj *caller)
   code++;                                                               \
 } while (0)
 
-#define ARITHMETIC_OPERATION_AND_ASSIGN_DISPATCH(integer32_operation,   \
+#define ARITHMETIC_OPERATION_AND_ASSIGN_DISPATCH(integer8_operation,    \
+                                                 integer32_operation,   \
                                                  integer64_operation,   \
                                                  float_operation,       \
                                                  left_expression_check, \
@@ -2281,6 +2309,7 @@ grn_proc_call(grn_ctx *ctx, grn_obj *proc, int nargs, grn_obj *caller)
     grn_obj_reinit(ctx, res, domain, 0);                                \
     ARITHMETIC_OPERATION_DISPATCH((&variable_value), (&casted_value),   \
                                   res,                                  \
+                                  integer8_operation,                   \
                                   integer32_operation,                  \
                                   integer64_operation,                  \
                                   float_operation,                      \
@@ -2537,6 +2566,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_OPERATION_AND_ASSIGN_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_STAR,
           INTEGER_ARITHMETIC_OPERATION_STAR,
+          INTEGER_ARITHMETIC_OPERATION_STAR,
           FLOAT_ARITHMETIC_OPERATION_STAR,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -2549,6 +2579,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_OPERATION_AND_ASSIGN_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_SLASH,
           INTEGER_ARITHMETIC_OPERATION_SLASH,
+          INTEGER_ARITHMETIC_OPERATION_SLASH,
           FLOAT_ARITHMETIC_OPERATION_SLASH,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -2561,6 +2592,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_OPERATION_AND_ASSIGN_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_MOD,
           INTEGER_ARITHMETIC_OPERATION_MOD,
+          INTEGER_ARITHMETIC_OPERATION_MOD,
           FLOAT_ARITHMETIC_OPERATION_MOD,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -2573,6 +2605,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_OPERATION_AND_ASSIGN_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_PLUS,
           INTEGER_ARITHMETIC_OPERATION_PLUS,
+          INTEGER_ARITHMETIC_OPERATION_PLUS,
           FLOAT_ARITHMETIC_OPERATION_PLUS,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -2585,6 +2618,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_OPERATION_AND_ASSIGN_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_MINUS,
           INTEGER_ARITHMETIC_OPERATION_MINUS,
+          INTEGER_ARITHMETIC_OPERATION_MINUS,
           FLOAT_ARITHMETIC_OPERATION_MINUS,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -2597,6 +2631,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_OPERATION_AND_ASSIGN_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_SHIFTL,
           INTEGER_ARITHMETIC_OPERATION_SHIFTL,
+          INTEGER_ARITHMETIC_OPERATION_SHIFTL,
           FLOAT_ARITHMETIC_OPERATION_SHIFTL,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -2609,6 +2644,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_OPERATION_AND_ASSIGN_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_SHIFTR,
           INTEGER_ARITHMETIC_OPERATION_SHIFTR,
+          INTEGER_ARITHMETIC_OPERATION_SHIFTR,
           FLOAT_ARITHMETIC_OPERATION_SHIFTR,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -2619,6 +2655,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         break;
       case GRN_OP_SHIFTRR_ASSIGN :
         ARITHMETIC_OPERATION_AND_ASSIGN_DISPATCH(
+          INTEGER8_ARITHMETIC_OPERATION_SHIFTRR,
           INTEGER32_ARITHMETIC_OPERATION_SHIFTRR,
           INTEGER64_ARITHMETIC_OPERATION_SHIFTRR,
           FLOAT_ARITHMETIC_OPERATION_SHIFTRR,
@@ -2634,6 +2671,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_OPERATION_AND_ASSIGN_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_BITWISE_AND,
           INTEGER_ARITHMETIC_OPERATION_BITWISE_AND,
+          INTEGER_ARITHMETIC_OPERATION_BITWISE_AND,
           FLOAT_ARITHMETIC_OPERATION_BITWISE_AND,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -2646,6 +2684,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_OPERATION_AND_ASSIGN_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_BITWISE_OR,
           INTEGER_ARITHMETIC_OPERATION_BITWISE_OR,
+          INTEGER_ARITHMETIC_OPERATION_BITWISE_OR,
           FLOAT_ARITHMETIC_OPERATION_BITWISE_OR,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -2658,6 +2697,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_OPERATION_AND_ASSIGN_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_BITWISE_XOR,
           INTEGER_ARITHMETIC_OPERATION_BITWISE_XOR,
+          INTEGER_ARITHMETIC_OPERATION_BITWISE_XOR,
           FLOAT_ARITHMETIC_OPERATION_BITWISE_XOR,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -3239,6 +3279,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_BINARY_OPERATION_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_PLUS,
           INTEGER_ARITHMETIC_OPERATION_PLUS,
+          INTEGER_ARITHMETIC_OPERATION_PLUS,
           FLOAT_ARITHMETIC_OPERATION_PLUS,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -3277,6 +3318,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
           ARITHMETIC_BINARY_OPERATION_DISPATCH(
             INTEGER_ARITHMETIC_OPERATION_MINUS,
             INTEGER_ARITHMETIC_OPERATION_MINUS,
+            INTEGER_ARITHMETIC_OPERATION_MINUS,
             FLOAT_ARITHMETIC_OPERATION_MINUS,
             ARITHMETIC_OPERATION_NO_CHECK,
             ARITHMETIC_OPERATION_NO_CHECK,
@@ -3293,6 +3335,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_BINARY_OPERATION_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_STAR,
           INTEGER_ARITHMETIC_OPERATION_STAR,
+          INTEGER_ARITHMETIC_OPERATION_STAR,
           FLOAT_ARITHMETIC_OPERATION_STAR,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -3308,6 +3351,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_BINARY_OPERATION_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_SLASH,
           INTEGER_ARITHMETIC_OPERATION_SLASH,
+          INTEGER_ARITHMETIC_OPERATION_SLASH,
           FLOAT_ARITHMETIC_OPERATION_SLASH,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_ZERO_DIVISION_CHECK,
@@ -3323,6 +3367,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_BINARY_OPERATION_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_MOD,
           INTEGER_ARITHMETIC_OPERATION_MOD,
+          INTEGER_ARITHMETIC_OPERATION_MOD,
           FLOAT_ARITHMETIC_OPERATION_MOD,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_ZERO_DIVISION_CHECK,
@@ -3346,6 +3391,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_BINARY_OPERATION_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_BITWISE_OR,
           INTEGER_ARITHMETIC_OPERATION_BITWISE_OR,
+          INTEGER_ARITHMETIC_OPERATION_BITWISE_OR,
           FLOAT_ARITHMETIC_OPERATION_BITWISE_OR,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -3355,6 +3401,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_BINARY_OPERATION_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_BITWISE_XOR,
           INTEGER_ARITHMETIC_OPERATION_BITWISE_XOR,
+          INTEGER_ARITHMETIC_OPERATION_BITWISE_XOR,
           FLOAT_ARITHMETIC_OPERATION_BITWISE_XOR,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -3364,6 +3411,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_BINARY_OPERATION_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_BITWISE_AND,
           INTEGER_ARITHMETIC_OPERATION_BITWISE_AND,
+          INTEGER_ARITHMETIC_OPERATION_BITWISE_AND,
           FLOAT_ARITHMETIC_OPERATION_BITWISE_AND,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -3373,6 +3421,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_BINARY_OPERATION_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_SHIFTL,
           INTEGER_ARITHMETIC_OPERATION_SHIFTL,
+          INTEGER_ARITHMETIC_OPERATION_SHIFTL,
           FLOAT_ARITHMETIC_OPERATION_SHIFTL,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -3382,6 +3431,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         ARITHMETIC_BINARY_OPERATION_DISPATCH(
           INTEGER_ARITHMETIC_OPERATION_SHIFTR,
           INTEGER_ARITHMETIC_OPERATION_SHIFTR,
+          INTEGER_ARITHMETIC_OPERATION_SHIFTR,
           FLOAT_ARITHMETIC_OPERATION_SHIFTR,
           ARITHMETIC_OPERATION_NO_CHECK,
           ARITHMETIC_OPERATION_NO_CHECK,
@@ -3389,6 +3439,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)
         break;
       case GRN_OP_SHIFTRR :
         ARITHMETIC_BINARY_OPERATION_DISPATCH(
+          INTEGER8_ARITHMETIC_OPERATION_SHIFTRR,
           INTEGER32_ARITHMETIC_OPERATION_SHIFTRR,
           INTEGER64_ARITHMETIC_OPERATION_SHIFTRR,
           FLOAT_ARITHMETIC_OPERATION_SHIFTRR,

  Added: test/command/suite/select/operation/plus/int8.expected (+45 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/operation/plus/int8.expected    2013-02-27 18:26:02 +0900 (4452f45)
@@ -0,0 +1,45 @@
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values value1 COLUMN_SCALAR Int8
+[[0,0.0,0.0],true]
+column_create Values value2 COLUMN_SCALAR Int8
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"value1": -1, "value2": 5}
+]
+[[0,0.0,0.0],1]
+select Values   --filter true   --scorer '_score = value1 + value2'   --output_columns 'value1, value2, _score'
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  [
+    [
+      [
+        1
+      ],
+      [
+        [
+          "value1",
+          "Int8"
+        ],
+        [
+          "value2",
+          "Int8"
+        ],
+        [
+          "_score",
+          "Int32"
+        ]
+      ],
+      [
+        -1,
+        5,
+        4
+      ]
+    ]
+  ]
+]

  Added: test/command/suite/select/operation/plus/int8.test (+13 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/operation/plus/int8.test    2013-02-27 18:26:02 +0900 (70d0abc)
@@ -0,0 +1,13 @@
+table_create Values TABLE_NO_KEY
+column_create Values value1 COLUMN_SCALAR Int8
+column_create Values value2 COLUMN_SCALAR Int8
+
+load --table Values
+[
+{"value1": -1, "value2": 5}
+]
+
+select Values \
+  --filter true \
+  --scorer '_score = value1 + value2' \
+  --output_columns 'value1, value2, _score'

  Added: test/command/suite/select/operation/shift_r/int8.expected (+11 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/operation/shift_r/int8.expected    2013-02-27 18:26:02 +0900 (cee95c9)
@@ -0,0 +1,11 @@
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values value COLUMN_SCALAR Int8
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"value": -14}
+]
+[[0,0.0,0.0],1]
+select Values   --filter true   --scorer '_score = value >> 2'   --output_columns 'value, _score'
+[[0,0.0,0.0],[[[1],[["value","Int8"],["_score","Int32"]],[-14,-4]]]]

  Added: test/command/suite/select/operation/shift_r/int8.test (+12 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/operation/shift_r/int8.test    2013-02-27 18:26:02 +0900 (07e5542)
@@ -0,0 +1,12 @@
+table_create Values TABLE_NO_KEY
+column_create Values value COLUMN_SCALAR Int8
+
+load --table Values
+[
+{"value": -14}
+]
+
+select Values \
+  --filter true \
+  --scorer '_score = value >> 2' \
+  --output_columns 'value, _score'

  Added: test/command/suite/select/operation/shift_rr/int8.expected (+11 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/operation/shift_rr/int8.expected    2013-02-27 18:26:02 +0900 (5b1ddcb)
@@ -0,0 +1,11 @@
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values value COLUMN_SCALAR Int8
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"value": -14}
+]
+[[0,0.0,0.0],1]
+select Values   --filter true   --scorer '_score = value >>> 2'   --output_columns 'value, _score'
+[[0,0.0,0.0],[[[1],[["value","Int8"],["_score","Int32"]],[-14,60]]]]

  Added: test/command/suite/select/operation/shift_rr/int8.test (+12 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/operation/shift_rr/int8.test    2013-02-27 18:26:02 +0900 (a00b452)
@@ -0,0 +1,12 @@
+table_create Values TABLE_NO_KEY
+column_create Values value COLUMN_SCALAR Int8
+
+load --table Values
+[
+{"value": -14}
+]
+
+select Values \
+  --filter true \
+  --scorer '_score = value >>> 2' \
+  --output_columns 'value, _score'
-------------- next part --------------
HTML����������������������������...
ダウンロード 



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