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 :\