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