Kouhei Sutou
null+****@clear*****
Sun Feb 8 18:57:20 JST 2015
Kouhei Sutou 2015-02-08 18:57:20 +0900 (Sun, 08 Feb 2015) New Revision: 80c5a6ec19bbd5fa74ab38e67e1d55e8e3847481 https://github.com/groonga/groonga/commit/80c5a6ec19bbd5fa74ab38e67e1d55e8e3847481 Message: Extract equal and not equal operation codes as a function It's for reusing these operations in plugin without creating grn_expr. Modified files: include/groonga/groonga.h lib/expr.c lib/operator.c Modified: include/groonga/groonga.h (+3 -0) =================================================================== --- include/groonga/groonga.h 2015-02-07 00:20:24 +0900 (88a0908) +++ include/groonga/groonga.h 2015-02-08 18:57:20 +0900 (35438be) @@ -711,6 +711,9 @@ typedef enum { } grn_operator; GRN_API const char *grn_operator_to_string(grn_operator op); +GRN_API grn_bool grn_operator_exec_equal(grn_ctx *ctx, grn_obj *x, grn_obj *y); +GRN_API grn_bool grn_operator_exec_not_equal(grn_ctx *ctx, + grn_obj *x, grn_obj *y); struct _grn_table_group_result { grn_obj *table; Modified: lib/expr.c (+7 -219) =================================================================== --- lib/expr.c 2015-02-07 00:20:24 +0900 (eada9b7) +++ lib/expr.c 2015-02-08 18:57:20 +0900 (186b407) @@ -1,6 +1,6 @@ /* -*- c-basic-offset: 2 -*- */ /* - Copyright(C) 2010-2014 Brazil + Copyright(C) 2010-2015 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -1451,218 +1451,6 @@ grn_expr_compile(grn_ctx *ctx, grn_obj *expr) }\ } while (0) -#define DO_EQ_SUB do {\ - switch (y->header.domain) {\ - case GRN_DB_INT8 :\ - r = (x_ == GRN_INT8_VALUE(y));\ - break;\ - case GRN_DB_UINT8 :\ - r = (x_ == GRN_UINT8_VALUE(y));\ - break;\ - case GRN_DB_INT16 :\ - r = (x_ == GRN_INT16_VALUE(y));\ - break;\ - case GRN_DB_UINT16 :\ - r = (x_ == GRN_UINT16_VALUE(y));\ - break;\ - case GRN_DB_INT32 :\ - r = (x_ == GRN_INT32_VALUE(y));\ - break;\ - case GRN_DB_UINT32 :\ - r = (x_ == GRN_UINT32_VALUE(y));\ - break;\ - case GRN_DB_INT64 :\ - r = (x_ == GRN_INT64_VALUE(y));\ - break;\ - case GRN_DB_TIME :\ - r = (GRN_TIME_PACK(x_,0) == GRN_INT64_VALUE(y));\ - break;\ - case GRN_DB_UINT64 :\ - r = (x_ == GRN_UINT64_VALUE(y));\ - break;\ - case GRN_DB_FLOAT :\ - r = ((x_ <= GRN_FLOAT_VALUE(y)) && (x_ >= GRN_FLOAT_VALUE(y)));\ - break;\ - case GRN_DB_SHORT_TEXT :\ - case GRN_DB_TEXT :\ - case GRN_DB_LONG_TEXT :\ - {\ - const char *p_ = GRN_TEXT_VALUE(y);\ - int i_ = grn_atoi(p_, p_ + GRN_TEXT_LEN(y), NULL);\ - r = (x_ == i_);\ - }\ - break;\ - default :\ - r = 0;\ - break;\ - }\ -} while (0) - -#define DO_EQ(x,y,r) do {\ - switch (x->header.domain) {\ - case GRN_DB_VOID :\ - r = 0;\ - break;\ - case GRN_DB_INT8 :\ - {\ - int8_t x_ = GRN_INT8_VALUE(x);\ - DO_EQ_SUB;\ - }\ - break;\ - case GRN_DB_UINT8 :\ - {\ - uint8_t x_ = GRN_UINT8_VALUE(x);\ - DO_EQ_SUB;\ - }\ - break;\ - case GRN_DB_INT16 :\ - {\ - int16_t x_ = GRN_INT16_VALUE(x);\ - DO_EQ_SUB;\ - }\ - break;\ - case GRN_DB_UINT16 :\ - {\ - uint16_t x_ = GRN_UINT16_VALUE(x);\ - DO_EQ_SUB;\ - }\ - break;\ - case GRN_DB_INT32 :\ - {\ - int32_t x_ = GRN_INT32_VALUE(x);\ - DO_EQ_SUB;\ - }\ - break;\ - case GRN_DB_UINT32 :\ - {\ - uint32_t x_ = GRN_UINT32_VALUE(x);\ - DO_EQ_SUB;\ - }\ - break;\ - case GRN_DB_INT64 :\ - {\ - int64_t x_ = GRN_INT64_VALUE(x);\ - DO_EQ_SUB;\ - }\ - break;\ - case GRN_DB_TIME :\ - {\ - int64_t x_ = GRN_INT64_VALUE(x);\ - switch (y->header.domain) {\ - case GRN_DB_INT32 :\ - r = (x_ == GRN_TIME_PACK(GRN_INT32_VALUE(y), 0));\ - break;\ - case GRN_DB_UINT32 :\ - r = (x_ == GRN_TIME_PACK(GRN_UINT32_VALUE(y), 0));\ - break;\ - case GRN_DB_INT64 :\ - case GRN_DB_TIME :\ - r = (x_ == GRN_INT64_VALUE(y));\ - break;\ - case GRN_DB_UINT64 :\ - r = (x_ == GRN_UINT64_VALUE(y));\ - break;\ - case GRN_DB_FLOAT :\ - r = (x_ == GRN_TIME_PACK(GRN_FLOAT_VALUE(y), 0));\ - break;\ - case GRN_DB_SHORT_TEXT :\ - case GRN_DB_TEXT :\ - case GRN_DB_LONG_TEXT :\ - {\ - grn_obj time_value_;\ - GRN_TIME_INIT(&time_value_, 0);\ - if (grn_obj_cast(ctx, y, &time_value_, GRN_FALSE) == GRN_SUCCESS) {\ - r = (x_ == GRN_TIME_VALUE(&time_value_));\ - } else {\ - r = 0;\ - }\ - GRN_OBJ_FIN(ctx, &time_value_);\ - }\ - break;\ - default :\ - r = 0;\ - break;\ - }\ - }\ - break;\ - case GRN_DB_UINT64 :\ - {\ - uint64_t x_ = GRN_UINT64_VALUE(x);\ - DO_EQ_SUB;\ - }\ - break;\ - case GRN_DB_FLOAT :\ - {\ - double x_ = GRN_FLOAT_VALUE(x);\ - switch (y->header.domain) {\ - case GRN_DB_INT32 :\ - r = ((x_ <= GRN_INT32_VALUE(y)) && (x_ >= GRN_INT32_VALUE(y)));\ - break;\ - case GRN_DB_UINT32 :\ - r = ((x_ <= GRN_UINT32_VALUE(y)) && (x_ >= GRN_UINT32_VALUE(y)));\ - break;\ - case GRN_DB_INT64 :\ - case GRN_DB_TIME :\ - r = ((x_ <= GRN_INT64_VALUE(y)) && (x_ >= GRN_INT64_VALUE(y)));\ - break;\ - case GRN_DB_UINT64 :\ - r = ((x_ <= GRN_UINT64_VALUE(y)) && (x_ >= GRN_UINT64_VALUE(y)));\ - break;\ - case GRN_DB_FLOAT :\ - r = ((x_ <= GRN_FLOAT_VALUE(y)) && (x_ >= GRN_FLOAT_VALUE(y)));\ - break;\ - case GRN_DB_SHORT_TEXT :\ - case GRN_DB_TEXT :\ - case GRN_DB_LONG_TEXT :\ - {\ - const char *p_ = GRN_TEXT_VALUE(y);\ - int i_ = grn_atoi(p_, p_ + GRN_TEXT_LEN(y), NULL);\ - r = (x_ <= i_ && x_ >= i_);\ - }\ - break;\ - default :\ - r = 0;\ - break;\ - }\ - }\ - break;\ - case GRN_DB_SHORT_TEXT :\ - case GRN_DB_TEXT :\ - case GRN_DB_LONG_TEXT :\ - if (GRN_DB_SHORT_TEXT <= y->header.domain && y->header.domain <= GRN_DB_LONG_TEXT) {\ - uint32_t la = GRN_TEXT_LEN(x), lb = GRN_TEXT_LEN(y);\ - r = (la == lb && !memcmp(GRN_TEXT_VALUE(x), GRN_TEXT_VALUE(y), lb));\ - } else {\ - const char *q_ = GRN_TEXT_VALUE(x);\ - int x_ = grn_atoi(q_, q_ + GRN_TEXT_LEN(x), NULL);\ - DO_EQ_SUB;\ - }\ - break;\ - default :\ - if ((x->header.domain == y->header.domain)) {\ - r = (GRN_BULK_VSIZE(x) == GRN_BULK_VSIZE(y) &&\ - !(memcmp(GRN_BULK_HEAD(x), GRN_BULK_HEAD(y), GRN_BULK_VSIZE(x))));\ - } else {\ - grn_obj dest;\ - if (x->header.domain < y->header.domain) {\ - GRN_OBJ_INIT(&dest, GRN_BULK, 0, y->header.domain);\ - if (!grn_obj_cast(ctx, x, &dest, GRN_FALSE)) {\ - r = (GRN_BULK_VSIZE(&dest) == GRN_BULK_VSIZE(y) &&\ - !memcmp(GRN_BULK_HEAD(&dest), GRN_BULK_HEAD(y), GRN_BULK_VSIZE(y))); \ - }\ - } else {\ - GRN_OBJ_INIT(&dest, GRN_BULK, 0, x->header.domain);\ - if (!grn_obj_cast(ctx, y, &dest, GRN_FALSE)) {\ - r = (GRN_BULK_VSIZE(&dest) == GRN_BULK_VSIZE(x) &&\ - !memcmp(GRN_BULK_HEAD(&dest), GRN_BULK_HEAD(x), GRN_BULK_VSIZE(x))); \ - }\ - }\ - GRN_OBJ_FIN(ctx, &dest);\ - }\ - break;\ - }\ -} while (0) - #define GEO_RESOLUTION 3600000 #define GEO_RADIOUS 6357303 #define GEO_BES_C1 6334834 @@ -3622,23 +3410,23 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs) break; case GRN_OP_EQUAL : { - int r = GRN_FALSE; + grn_bool equal_p; grn_obj *x, *y; POP2ALLOC1(x, y, res); - DO_EQ(x, y, r); + equal_p = grn_operator_exec_equal(ctx, x, y); grn_obj_reinit(ctx, res, GRN_DB_INT32, 0); - GRN_INT32_SET(ctx, res, r); + GRN_INT32_SET(ctx, res, equal_p ? 1 : 0); } code++; break; case GRN_OP_NOT_EQUAL : { - int r = GRN_FALSE; + grn_bool not_equal_p; grn_obj *x, *y; POP2ALLOC1(x, y, res); - DO_EQ(x, y, r); + not_equal_p = grn_operator_exec_not_equal(ctx, x, y); grn_obj_reinit(ctx, res, GRN_DB_INT32, 0); - GRN_INT32_SET(ctx, res, 1 - r); + GRN_INT32_SET(ctx, res, not_equal_p ? 1 : 0); } code++; break; Modified: lib/operator.c (+235 -1) =================================================================== --- lib/operator.c 2015-02-07 00:20:24 +0900 (9587b58) +++ lib/operator.c 2015-02-08 18:57:20 +0900 (4e07c59) @@ -1,6 +1,6 @@ /* -*- c-basic-offset: 2 -*- */ /* - Copyright(C) 2014 Brazil + Copyright(C) 2014-2015 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -17,6 +17,10 @@ */ #include "grn.h" +#include "grn_db.h" +#include "grn_str.h" + +#include <string.h> static const char *operator_names[] = { "push", @@ -107,3 +111,233 @@ grn_operator_to_string(grn_operator op) return "unknown"; } } + +#define DO_EQ_SUB do {\ + switch (y->header.domain) {\ + case GRN_DB_INT8 :\ + r = (x_ == GRN_INT8_VALUE(y));\ + break;\ + case GRN_DB_UINT8 :\ + r = (x_ == GRN_UINT8_VALUE(y));\ + break;\ + case GRN_DB_INT16 :\ + r = (x_ == GRN_INT16_VALUE(y));\ + break;\ + case GRN_DB_UINT16 :\ + r = (x_ == GRN_UINT16_VALUE(y));\ + break;\ + case GRN_DB_INT32 :\ + r = (x_ == GRN_INT32_VALUE(y));\ + break;\ + case GRN_DB_UINT32 :\ + r = (x_ == GRN_UINT32_VALUE(y));\ + break;\ + case GRN_DB_INT64 :\ + r = (x_ == GRN_INT64_VALUE(y));\ + break;\ + case GRN_DB_TIME :\ + r = (GRN_TIME_PACK(x_,0) == GRN_INT64_VALUE(y));\ + break;\ + case GRN_DB_UINT64 :\ + r = (x_ == GRN_UINT64_VALUE(y));\ + break;\ + case GRN_DB_FLOAT :\ + r = ((x_ <= GRN_FLOAT_VALUE(y)) && (x_ >= GRN_FLOAT_VALUE(y)));\ + break;\ + case GRN_DB_SHORT_TEXT :\ + case GRN_DB_TEXT :\ + case GRN_DB_LONG_TEXT :\ + {\ + const char *p_ = GRN_TEXT_VALUE(y);\ + int i_ = grn_atoi(p_, p_ + GRN_TEXT_LEN(y), NULL);\ + r = (x_ == i_);\ + }\ + break;\ + default :\ + r = GRN_FALSE;\ + break;\ + }\ +} while (0) + +#define DO_EQ(x,y,r) do {\ + switch (x->header.domain) {\ + case GRN_DB_VOID :\ + r = GRN_FALSE;\ + break;\ + case GRN_DB_INT8 :\ + {\ + int8_t x_ = GRN_INT8_VALUE(x);\ + DO_EQ_SUB;\ + }\ + break;\ + case GRN_DB_UINT8 :\ + {\ + uint8_t x_ = GRN_UINT8_VALUE(x);\ + DO_EQ_SUB;\ + }\ + break;\ + case GRN_DB_INT16 :\ + {\ + int16_t x_ = GRN_INT16_VALUE(x);\ + DO_EQ_SUB;\ + }\ + break;\ + case GRN_DB_UINT16 :\ + {\ + uint16_t x_ = GRN_UINT16_VALUE(x);\ + DO_EQ_SUB;\ + }\ + break;\ + case GRN_DB_INT32 :\ + {\ + int32_t x_ = GRN_INT32_VALUE(x);\ + DO_EQ_SUB;\ + }\ + break;\ + case GRN_DB_UINT32 :\ + {\ + uint32_t x_ = GRN_UINT32_VALUE(x);\ + DO_EQ_SUB;\ + }\ + break;\ + case GRN_DB_INT64 :\ + {\ + int64_t x_ = GRN_INT64_VALUE(x);\ + DO_EQ_SUB;\ + }\ + break;\ + case GRN_DB_TIME :\ + {\ + int64_t x_ = GRN_INT64_VALUE(x);\ + switch (y->header.domain) {\ + case GRN_DB_INT32 :\ + r = (x_ == GRN_TIME_PACK(GRN_INT32_VALUE(y), 0));\ + break;\ + case GRN_DB_UINT32 :\ + r = (x_ == GRN_TIME_PACK(GRN_UINT32_VALUE(y), 0));\ + break;\ + case GRN_DB_INT64 :\ + case GRN_DB_TIME :\ + r = (x_ == GRN_INT64_VALUE(y));\ + break;\ + case GRN_DB_UINT64 :\ + r = (x_ == GRN_UINT64_VALUE(y));\ + break;\ + case GRN_DB_FLOAT :\ + r = (x_ == GRN_TIME_PACK(GRN_FLOAT_VALUE(y), 0));\ + break;\ + case GRN_DB_SHORT_TEXT :\ + case GRN_DB_TEXT :\ + case GRN_DB_LONG_TEXT :\ + {\ + grn_obj time_value_;\ + GRN_TIME_INIT(&time_value_, 0);\ + if (grn_obj_cast(ctx, y, &time_value_, GRN_FALSE) == GRN_SUCCESS) {\ + r = (x_ == GRN_TIME_VALUE(&time_value_));\ + } else {\ + r = GRN_FALSE;\ + }\ + GRN_OBJ_FIN(ctx, &time_value_);\ + }\ + break;\ + default :\ + r = GRN_FALSE;\ + break;\ + }\ + }\ + break;\ + case GRN_DB_UINT64 :\ + {\ + uint64_t x_ = GRN_UINT64_VALUE(x);\ + DO_EQ_SUB;\ + }\ + break;\ + case GRN_DB_FLOAT :\ + {\ + double x_ = GRN_FLOAT_VALUE(x);\ + switch (y->header.domain) {\ + case GRN_DB_INT32 :\ + r = ((x_ <= GRN_INT32_VALUE(y)) && (x_ >= GRN_INT32_VALUE(y)));\ + break;\ + case GRN_DB_UINT32 :\ + r = ((x_ <= GRN_UINT32_VALUE(y)) && (x_ >= GRN_UINT32_VALUE(y)));\ + break;\ + case GRN_DB_INT64 :\ + case GRN_DB_TIME :\ + r = ((x_ <= GRN_INT64_VALUE(y)) && (x_ >= GRN_INT64_VALUE(y)));\ + break;\ + case GRN_DB_UINT64 :\ + r = ((x_ <= GRN_UINT64_VALUE(y)) && (x_ >= GRN_UINT64_VALUE(y)));\ + break;\ + case GRN_DB_FLOAT :\ + r = ((x_ <= GRN_FLOAT_VALUE(y)) && (x_ >= GRN_FLOAT_VALUE(y)));\ + break;\ + case GRN_DB_SHORT_TEXT :\ + case GRN_DB_TEXT :\ + case GRN_DB_LONG_TEXT :\ + {\ + const char *p_ = GRN_TEXT_VALUE(y);\ + int i_ = grn_atoi(p_, p_ + GRN_TEXT_LEN(y), NULL);\ + r = (x_ <= i_ && x_ >= i_);\ + }\ + break;\ + default :\ + r = GRN_FALSE;\ + break;\ + }\ + }\ + break;\ + case GRN_DB_SHORT_TEXT :\ + case GRN_DB_TEXT :\ + case GRN_DB_LONG_TEXT :\ + if (GRN_DB_SHORT_TEXT <= y->header.domain && y->header.domain <= GRN_DB_LONG_TEXT) {\ + uint32_t la = GRN_TEXT_LEN(x), lb = GRN_TEXT_LEN(y);\ + r = (la == lb && !memcmp(GRN_TEXT_VALUE(x), GRN_TEXT_VALUE(y), lb));\ + } else {\ + const char *q_ = GRN_TEXT_VALUE(x);\ + int x_ = grn_atoi(q_, q_ + GRN_TEXT_LEN(x), NULL);\ + DO_EQ_SUB;\ + }\ + break;\ + default :\ + if ((x->header.domain == y->header.domain)) {\ + r = (GRN_BULK_VSIZE(x) == GRN_BULK_VSIZE(y) &&\ + !(memcmp(GRN_BULK_HEAD(x), GRN_BULK_HEAD(y), GRN_BULK_VSIZE(x))));\ + } else {\ + grn_obj dest;\ + if (x->header.domain < y->header.domain) {\ + GRN_OBJ_INIT(&dest, GRN_BULK, 0, y->header.domain);\ + if (!grn_obj_cast(ctx, x, &dest, GRN_FALSE)) {\ + r = (GRN_BULK_VSIZE(&dest) == GRN_BULK_VSIZE(y) &&\ + !memcmp(GRN_BULK_HEAD(&dest), GRN_BULK_HEAD(y), GRN_BULK_VSIZE(y))); \ + }\ + } else {\ + GRN_OBJ_INIT(&dest, GRN_BULK, 0, x->header.domain);\ + if (!grn_obj_cast(ctx, y, &dest, GRN_FALSE)) {\ + r = (GRN_BULK_VSIZE(&dest) == GRN_BULK_VSIZE(x) &&\ + !memcmp(GRN_BULK_HEAD(&dest), GRN_BULK_HEAD(x), GRN_BULK_VSIZE(x))); \ + }\ + }\ + GRN_OBJ_FIN(ctx, &dest);\ + }\ + break;\ + }\ +} while (0) + +grn_bool +grn_operator_exec_equal(grn_ctx *ctx, grn_obj *x, grn_obj *y) +{ + grn_bool r; + GRN_API_ENTER; + DO_EQ(x, y, r); + GRN_API_RETURN(r); +} + +grn_bool +grn_operator_exec_not_equal(grn_ctx *ctx, grn_obj *x, grn_obj *y) +{ + grn_bool r; + GRN_API_ENTER; + DO_EQ(x, y, r); + GRN_API_RETURN(!r); +} -------------- next part -------------- HTML����������������������������...Download