[Groonga-commit] groonga/groonga [master] support compare operation for hash/pat table reference column. #776

Back to archive index

null+****@clear***** null+****@clear*****
2010年 12月 16日 (木) 23:05:25 JST


Kouhei Sutou	2010-12-16 14:05:25 +0000 (Thu, 16 Dec 2010)

  New Revision: f14b2a8d23fe14093d8e888c59b98edbdc130931

  Log:
    support compare operation for hash/pat table reference column. #776

  Modified files:
    lib/db.c
    lib/db.h
    lib/expr.c

  Modified: lib/db.c (+1 -3)
===================================================================
--- lib/db.c    2010-12-20 08:16:35 +0000 (f3c922c)
+++ lib/db.c    2010-12-16 14:05:25 +0000 (a45faa8)
@@ -6940,8 +6940,6 @@ deftype(grn_ctx *ctx, const char *name,
   return o;
 }
 
-#define N_RESERVED_TYPES      256
-
 grn_rc
 grn_db_init_builtin_types(grn_ctx *ctx)
 {
@@ -7017,7 +7015,7 @@ grn_db_init_builtin_types(grn_ctx *ctx)
     grn_obj_register(ctx, db, buf, 5);
   }
   grn_db_init_builtin_query(ctx);
-  for (id = grn_pat_curr_id(ctx, ((grn_db *)db)->keys) + 1; id < N_RESERVED_TYPES; id++) {
+  for (id = grn_pat_curr_id(ctx, ((grn_db *)db)->keys) + 1; id < GRN_N_RESERVED_TYPES; id++) {
     grn_itoh(id, buf + 3, 2);
     grn_obj_register(ctx, db, buf, 5);
   }

  Modified: lib/db.h (+2 -0)
===================================================================
--- lib/db.h    2010-12-20 08:16:35 +0000 (36987e7)
+++ lib/db.h    2010-12-16 14:05:25 +0000 (cd4e0aa)
@@ -36,6 +36,8 @@ extern "C" {
 #define GRN_DB_DELIMITER            '.'
 #define GRN_DB_PSEUDO_COLUMN_PREFIX '_'
 
+#define GRN_N_RESERVED_TYPES 256
+
 typedef struct {
   int score;
   int n_subrecs;

  Modified: lib/expr.c (+34 -1)
===================================================================
--- lib/expr.c    2010-12-20 08:16:35 +0000 (369c341)
+++ lib/expr.c    2010-12-16 14:05:25 +0000 (d8ed4b7)
@@ -1316,7 +1316,7 @@ grn_expr_compile(grn_ctx *ctx, grn_obj *expr)
   }\
 }
 
-#define DO_COMPARE(x,y,r,op) {\
+#define DO_COMPARE_BUILTIN(x,y,r,op) {\
   switch (x->header.domain) {\
   case GRN_DB_INT8 :\
     {\
@@ -1435,6 +1435,39 @@ grn_expr_compile(grn_ctx *ctx, grn_obj *expr)
   }\
 }
 
+#define DO_COMPARE(x, y, r, op) {\
+  if (x->header.domain >= GRN_N_RESERVED_TYPES) {\
+    grn_obj *table;\
+    table = grn_ctx_at(ctx, x->header.domain);\
+    switch (table->header.type) {\
+    case GRN_TABLE_HASH_KEY :\
+    case GRN_TABLE_PAT_KEY :\
+      {\
+        grn_obj 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);\
+        if (length > 0) {\
+          grn_obj *x_original = x;\
+          x = &key;\
+          DO_COMPARE_BUILTIN((&key), y, r, op);\
+          x = x_original;\
+        } else {\
+          r = 0;\
+        }\
+        GRN_OBJ_FIN(ctx, &key);\
+      }\
+      break;\
+    default :\
+      r = 0;\
+      break;\
+    }\
+    grn_obj_unlink(ctx, table);\
+  } else {\
+    DO_COMPARE_BUILTIN(x, y, r, op);\
+  }\
+}
+
 #define DO_EQ_SUB {\
   switch (y->header.domain) {\
   case GRN_DB_INT8 :\




Groonga-commit メーリングリストの案内
Back to archive index