[Groonga-commit] groonga/groonga at fa88054 [master] Support record as y of binary operation

Back to archive index

Kouhei Sutou null+****@clear*****
Fri Jan 15 17:08:52 JST 2016


Kouhei Sutou	2016-01-15 17:08:52 +0900 (Fri, 15 Jan 2016)

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

  Message:
    Support record as y of binary operation

  Modified files:
    lib/operator.c

  Modified: lib/operator.c (+46 -11)
===================================================================
--- lib/operator.c    2016-01-15 17:08:08 +0900 (90eeb88)
+++ lib/operator.c    2016-01-15 17:08:52 +0900 (c356e0c)
@@ -396,7 +396,7 @@ grn_operator_exec_not_equal(grn_ctx *ctx, grn_obj *x, grn_obj *y)
   }\
 } while (0)
 
-#define DO_COMPARE_SUB(op) do {\
+#define DO_COMPARE_SUB_BUILTIN(op) do {\
   switch (y->header.domain) {\
   case GRN_DB_SHORT_TEXT :\
   case GRN_DB_TEXT :\
@@ -418,6 +418,40 @@ grn_operator_exec_not_equal(grn_ctx *ctx, grn_obj *x, grn_obj *y)
   }\
 } while (0)
 
+#define DO_COMPARE_SUB(op) do {\
+  if (y->header.domain >= GRN_N_RESERVED_TYPES) {\
+    grn_obj *y_table;\
+    y_table = grn_ctx_at(ctx, y->header.domain);\
+    switch (y_table->header.type) {\
+    case GRN_TABLE_HASH_KEY :\
+    case GRN_TABLE_PAT_KEY :\
+    case GRN_TABLE_DAT_KEY :\
+      {\
+        grn_obj y_key;\
+        int length;\
+        GRN_OBJ_INIT(&y_key, GRN_BULK, 0, y_table->header.domain);\
+        length = grn_table_get_key2(ctx, y_table, GRN_RECORD_VALUE(y), &y_key);\
+        if (length > 0) {\
+          grn_obj *y_original = y;\
+          y = &y_key;\
+          DO_COMPARE_SUB_BUILTIN(op);\
+          y = y_original;\
+        } else {\
+          r = GRN_FALSE;\
+        }\
+        GRN_OBJ_FIN(ctx, &y_key);\
+      }\
+      break;\
+    default :\
+      r = GRN_FALSE;\
+      break;\
+    }\
+    grn_obj_unlink(ctx, y_table);\
+  } else {\
+    DO_COMPARE_SUB_BUILTIN(op);\
+  }\
+} while (0)
+
 #define DO_COMPARE_BUILTIN(x,y,r,op) do {\
   switch (x->header.domain) {\
   case GRN_DB_INT8 :\
@@ -544,32 +578,33 @@ grn_operator_exec_not_equal(grn_ctx *ctx, grn_obj *x, grn_obj *y)
 
 #define DO_COMPARE(x, y, r, op) do {\
   if (x->header.domain >= GRN_N_RESERVED_TYPES) {\
-    grn_obj *table;\
-    table = grn_ctx_at(ctx, x->header.domain);\
-    switch (table->header.type) {\
+    grn_obj *x_table;\
+    x_table = grn_ctx_at(ctx, x->header.domain);\
+    switch (x_table->header.type) {\
     case GRN_TABLE_HASH_KEY :\
     case GRN_TABLE_PAT_KEY :\
+    case GRN_TABLE_DAT_KEY :\
       {\
-        grn_obj key;\
+        grn_obj x_key;\
         int length;\
-        GRN_OBJ_INIT(&key, GRN_BULK, 0, table->header.domain);\
-        length = grn_table_get_key2(ctx, table, GRN_RECORD_VALUE(x), &key);\
+        GRN_OBJ_INIT(&x_key, GRN_BULK, 0, x_table->header.domain);\
+        length = grn_table_get_key2(ctx, x_table, GRN_RECORD_VALUE(x), &x_key);\
         if (length > 0) {\
           grn_obj *x_original = x;\
-          x = &key;\
-          DO_COMPARE_BUILTIN((&key), y, r, op);\
+          x = &x_key;\
+          DO_COMPARE_BUILTIN((&x_key), y, r, op);\
           x = x_original;\
         } else {\
           r = GRN_FALSE;\
         }\
-        GRN_OBJ_FIN(ctx, &key);\
+        GRN_OBJ_FIN(ctx, &x_key);\
       }\
       break;\
     default :\
       r = GRN_FALSE;\
       break;\
     }\
-    grn_obj_unlink(ctx, table);\
+    grn_obj_unlink(ctx, x_table);\
   } else {\
     DO_COMPARE_BUILTIN(x, y, r, op);\
   }\
-------------- next part --------------
HTML����������������������������...
Download 



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