[Groonga-commit] groonga/groonga at 80c5a6e [master] Extract equal and not equal operation codes as a function

Back to archive index

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 



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