Kouhei Sutou
null+****@clear*****
Sun Jan 18 00:04:40 JST 2015
Kouhei Sutou 2015-01-18 00:04:40 +0900 (Sun, 18 Jan 2015) New Revision: 99324d19da4ea53a0d67f449ea38152d1d7408f0 https://github.com/pgroonga/pgroonga/commit/99324d19da4ea53a0d67f449ea38152d1d7408f0 Message: Support seqscan match Modified files: pgroonga.c pgroonga.h pgroonga_types.c Modified: pgroonga.c (+51 -6) =================================================================== --- pgroonga.c 2015-01-18 00:03:21 +0900 (059c466) +++ pgroonga.c 2015-01-18 00:04:40 +0900 (801c01a) @@ -413,15 +413,55 @@ GrnUnlock(Relation index, LOCKMODE mode) mode); } +static grn_bool +pgroonga_contains_raw(const char *text, unsigned int text_size, + const char *key, unsigned int key_size) +{ + grn_bool contained = GRN_FALSE; + grn_obj buffer; + grn_obj *expression, *expressionVariable; + + GRN_EXPR_CREATE_FOR_QUERY(ctx, NULL, expression, expressionVariable); + + GRN_TEXT_INIT(&buffer, 0); + + GRN_TEXT_SET(ctx, &buffer, text, text_size); + grn_expr_append_const(ctx, expression, &buffer, GRN_OP_PUSH, 1); + + GRN_TEXT_SET(ctx, &buffer, key, key_size); + grn_expr_append_const(ctx, expression, &buffer, GRN_OP_PUSH, 1); + + grn_expr_append_op(ctx, expression, GRN_OP_MATCH, 2); + + { + grn_obj *result; + result = grn_expr_exec(ctx, expression, 0); + if (ctx->rc) { + goto exit; + } + contained = GRN_INT32_VALUE(result) != 0; + } + +exit: + grn_obj_unlink(ctx, expression); + GRN_OBJ_FIN(ctx, &buffer); + + return contained; +} + /** * pgroonga.contains(doc text, key text) : bool */ Datum pgroonga_contains_text(PG_FUNCTION_ARGS) { - ereport(ERROR, - (errmsg("groonga: 'text %%%% text' requires index."))); - PG_RETURN_BOOL(false); + text *doc = PG_GETARG_TEXT_PP(0); + text *key = PG_GETARG_TEXT_PP(1); + grn_bool contained; + + contained = pgroonga_contains_raw(VARDATA_ANY(doc), VARSIZE_ANY_EXHDR(doc), + VARDATA_ANY(key), VARSIZE_ANY_EXHDR(key)); + PG_RETURN_BOOL(contained); } /** @@ -430,9 +470,14 @@ pgroonga_contains_text(PG_FUNCTION_ARGS) Datum pgroonga_contains_bpchar(PG_FUNCTION_ARGS) { - ereport(ERROR, - (errmsg("groonga: 'bpchar %%%% bpchar' requires index."))); - PG_RETURN_BOOL(false); + BpChar *doc = PG_GETARG_BPCHAR_PP(0); + BpChar *key = PG_GETARG_BPCHAR_PP(1); + grn_bool contained; + + contained = + pgroonga_contains_raw(VARDATA_ANY(doc), pgroonga_bpchar_size(doc), + VARDATA_ANY(key), pgroonga_bpchar_size(key)); + PG_RETURN_BOOL(contained); } static void Modified: pgroonga.h (+2 -0) =================================================================== --- pgroonga.h 2015-01-18 00:03:21 +0900 (0f458e7) +++ pgroonga.h 2015-01-18 00:04:40 +0900 (31039a7) @@ -53,6 +53,8 @@ extern Datum PGDLLEXPORT pgroonga_costestimate(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_options(PG_FUNCTION_ARGS); /* in groonga_types.c */ +int pgroonga_bpchar_size(const BpChar *bpchar); + extern Datum PGDLLEXPORT pgroonga_typeof(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_get_text(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_get_bpchar(PG_FUNCTION_ARGS); Modified: pgroonga_types.c (+4 -4) =================================================================== --- pgroonga_types.c 2015-01-18 00:03:21 +0900 (f8a74f8) +++ pgroonga_types.c 2015-01-18 00:04:40 +0900 (33affb0) @@ -10,8 +10,8 @@ #include <groonga.h> -static int -bpchar_size(const BpChar *arg) +int +pgroonga_bpchar_size(const BpChar *arg) { char *s = VARDATA_ANY(arg); int i; @@ -126,7 +126,7 @@ pgroonga_get_bpchar(PG_FUNCTION_ARGS) grn_ctx *ctx = (grn_ctx *)PG_GETARG_POINTER(1); grn_obj *buffer = (grn_obj *)PG_GETARG_POINTER(2); - GRN_TEXT_PUT(ctx, buffer, VARDATA_ANY(var), bpchar_size(var)); + GRN_TEXT_PUT(ctx, buffer, VARDATA_ANY(var), pgroonga_bpchar_size(var)); PG_RETURN_VOID(); } @@ -237,7 +237,7 @@ pgroonga_set_bpchar(PG_FUNCTION_ARGS) grn_obj *obj = (grn_obj *) PG_GETARG_POINTER(1); BpChar *var = PG_GETARG_BPCHAR_PP(2); - GRN_TEXT_SET(ctx, obj, VARDATA_ANY(var), bpchar_size(var)); + GRN_TEXT_SET(ctx, obj, VARDATA_ANY(var), pgroonga_bpchar_size(var)); PG_RETURN_VOID(); } -------------- next part -------------- HTML����������������������������...Download