Kouhei Sutou
null+****@clear*****
Fri Apr 8 23:17:38 JST 2016
Kouhei Sutou 2016-04-08 23:17:38 +0900 (Fri, 08 Apr 2016) New Revision: 1ae6eebeaa8fb32d8a63ed73e4f9150034279efd https://github.com/pgroonga/pgroonga/commit/1ae6eebeaa8fb32d8a63ed73e4f9150034279efd Message: Reorder strategy ID Modified files: pgroonga.sql src/pgroonga.c src/pgroonga.h Modified: pgroonga.sql (+3 -3) =================================================================== --- pgroonga.sql 2016-04-08 01:16:50 +0900 (1987abb) +++ pgroonga.sql 2016-04-08 23:17:38 +0900 (a74dc90) @@ -486,11 +486,11 @@ CREATE OPERATOR CLASS pgroonga.text_full_text_search_ops_v2 FOR TYPE text OPERATOR 12 &@, OPERATOR 13 &?, OPERATOR 14 &~?, - OPERATOR 17 &`, + OPERATOR 15 &`, OPERATOR 18 &@> (text, text[]), OPERATOR 19 &?> (text, text[]); CREATE OPERATOR CLASS pgroonga.prefix_search_ops_v2 FOR TYPE text USING pgroonga AS - OPERATOR 15 &^, - OPERATOR 16 &^~; + OPERATOR 16 &^, + OPERATOR 17 &^~; Modified: src/pgroonga.c (+87 -87) =================================================================== --- src/pgroonga.c 2016-04-08 01:16:50 +0900 (fdb425c) +++ src/pgroonga.c 2016-04-08 23:17:38 +0900 (bd0b5c9) @@ -150,9 +150,9 @@ PG_FUNCTION_INFO_V1(pgroonga_match_regexp_varchar); PG_FUNCTION_INFO_V1(pgroonga_match_text); PG_FUNCTION_INFO_V1(pgroonga_query_text); PG_FUNCTION_INFO_V1(pgroonga_similar_text); +PG_FUNCTION_INFO_V1(pgroonga_script_text); PG_FUNCTION_INFO_V1(pgroonga_prefix_text); PG_FUNCTION_INFO_V1(pgroonga_prefix_rk_text); -PG_FUNCTION_INFO_V1(pgroonga_script_text); PG_FUNCTION_INFO_V1(pgroonga_match_contain_text); PG_FUNCTION_INFO_V1(pgroonga_query_contain_text); @@ -1642,6 +1642,83 @@ pgroonga_similar_text(PG_FUNCTION_ARGS) } static grn_bool +pgroonga_script_raw(const char *target, unsigned int targetSize, + const char *script, unsigned int scriptSize) +{ + grn_obj *expression; + grn_obj *variable; + grn_expr_flags flags = GRN_EXPR_SYNTAX_SCRIPT; + grn_rc rc; + grn_obj *result; + bool matched = false; + + GRN_EXPR_CREATE_FOR_QUERY(ctx, + matchSequentialSearchData.table, + expression, + variable); + if (!expression) + { + ereport(ERROR, + (errcode(ERRCODE_OUT_OF_MEMORY), + errmsg("pgroonga: failed to create expression: %s", + ctx->errbuf))); + } + + rc = grn_expr_parse(ctx, + expression, + script, scriptSize, + matchSequentialSearchData.textColumn, + GRN_OP_MATCH, GRN_OP_AND, + flags); + if (rc != GRN_SUCCESS) + { + char message[GRN_CTX_MSGSIZE]; + grn_strncpy(message, GRN_CTX_MSGSIZE, + ctx->errbuf, GRN_CTX_MSGSIZE); + + grn_obj_close(ctx, expression); + ereport(ERROR, + (errcode(PGrnRCToPgErrorCode(rc)), + errmsg("pgroonga: failed to parse expression: %s", + message))); + } + + grn_obj_reinit(ctx, &(buffers->general), GRN_DB_TEXT, 0); + GRN_TEXT_SET(ctx, &(buffers->general), target, targetSize); + grn_obj_set_value(ctx, + matchSequentialSearchData.textColumn, + matchSequentialSearchData.recordID, + &(buffers->general), + GRN_OBJ_SET); + GRN_RECORD_SET(ctx, variable, matchSequentialSearchData.recordID); + + result = grn_expr_exec(ctx, expression, 0); + GRN_OBJ_IS_TRUE(ctx, result, matched); + + grn_obj_close(ctx, expression); + + return matched; +} + +/** + * pgroonga.script_text(target text, script text) : bool + */ +Datum +pgroonga_script_text(PG_FUNCTION_ARGS) +{ + text *target = PG_GETARG_TEXT_PP(0); + text *script = PG_GETARG_TEXT_PP(1); + bool matched = false; + + matched = pgroonga_script_raw(VARDATA_ANY(target), + VARSIZE_ANY_EXHDR(target), + VARDATA_ANY(script), + VARSIZE_ANY_EXHDR(script)); + + PG_RETURN_BOOL(matched); +} + +static grn_bool pgroonga_prefix_raw(const char *text, unsigned int textSize, const char *prefix, unsigned int prefixSize) { @@ -1752,83 +1829,6 @@ pgroonga_prefix_rk_text(PG_FUNCTION_ARGS) PG_RETURN_BOOL(matched); } -static grn_bool -pgroonga_script_raw(const char *target, unsigned int targetSize, - const char *script, unsigned int scriptSize) -{ - grn_obj *expression; - grn_obj *variable; - grn_expr_flags flags = GRN_EXPR_SYNTAX_SCRIPT; - grn_rc rc; - grn_obj *result; - bool matched = false; - - GRN_EXPR_CREATE_FOR_QUERY(ctx, - matchSequentialSearchData.table, - expression, - variable); - if (!expression) - { - ereport(ERROR, - (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("pgroonga: failed to create expression: %s", - ctx->errbuf))); - } - - rc = grn_expr_parse(ctx, - expression, - script, scriptSize, - matchSequentialSearchData.textColumn, - GRN_OP_MATCH, GRN_OP_AND, - flags); - if (rc != GRN_SUCCESS) - { - char message[GRN_CTX_MSGSIZE]; - grn_strncpy(message, GRN_CTX_MSGSIZE, - ctx->errbuf, GRN_CTX_MSGSIZE); - - grn_obj_close(ctx, expression); - ereport(ERROR, - (errcode(PGrnRCToPgErrorCode(rc)), - errmsg("pgroonga: failed to parse expression: %s", - message))); - } - - grn_obj_reinit(ctx, &(buffers->general), GRN_DB_TEXT, 0); - GRN_TEXT_SET(ctx, &(buffers->general), target, targetSize); - grn_obj_set_value(ctx, - matchSequentialSearchData.textColumn, - matchSequentialSearchData.recordID, - &(buffers->general), - GRN_OBJ_SET); - GRN_RECORD_SET(ctx, variable, matchSequentialSearchData.recordID); - - result = grn_expr_exec(ctx, expression, 0); - GRN_OBJ_IS_TRUE(ctx, result, matched); - - grn_obj_close(ctx, expression); - - return matched; -} - -/** - * pgroonga.script_text(target text, script text) : bool - */ -Datum -pgroonga_script_text(PG_FUNCTION_ARGS) -{ - text *target = PG_GETARG_TEXT_PP(0); - text *script = PG_GETARG_TEXT_PP(1); - bool matched = false; - - matched = pgroonga_script_raw(VARDATA_ANY(target), - VARSIZE_ANY_EXHDR(target), - VARDATA_ANY(script), - VARSIZE_ANY_EXHDR(script)); - - PG_RETURN_BOOL(matched); -} - /** * pgroonga.match_contain_text(target text, keywords text[]) : bool */ @@ -2559,13 +2559,13 @@ PGrnSearchBuildCondition(IndexScanDesc scan, case PGrnSimilarStrategyV2Number: operator = GRN_OP_SIMILAR; break; + case PGrnScriptStrategyV2Number: + break; case PGrnPrefixStrategyV2Number: operator = GRN_OP_PREFIX; break; case PGrnPrefixRKStrategyV2Number: break; - case PGrnScriptStrategyV2Number: - break; case PGrnRegexpStrategyNumber: operator = GRN_OP_REGEXP; break; @@ -2613,13 +2613,6 @@ PGrnSearchBuildCondition(IndexScanDesc scan, GRN_TEXT_VALUE(&(buffers->general)), GRN_TEXT_LEN(&(buffers->general))); break; - case PGrnPrefixRKStrategyV2Number: - PGrnSearchBuildConditionPrefixRK(so, - data, - targetColumn, - GRN_TEXT_VALUE(&(buffers->general)), - GRN_TEXT_LEN(&(buffers->general))); - break; case PGrnScriptStrategyV2Number: PGrnSearchBuildConditionScript(so, data, @@ -2627,6 +2620,13 @@ PGrnSearchBuildCondition(IndexScanDesc scan, GRN_TEXT_VALUE(&(buffers->general)), GRN_TEXT_LEN(&(buffers->general))); break; + case PGrnPrefixRKStrategyV2Number: + PGrnSearchBuildConditionPrefixRK(so, + data, + targetColumn, + GRN_TEXT_VALUE(&(buffers->general)), + GRN_TEXT_LEN(&(buffers->general))); + break; case PGrnQueryContainStrategyNumber: { grn_obj *queries = &(buffers->general); Modified: src/pgroonga.h (+4 -4) =================================================================== --- src/pgroonga.h 2016-04-08 01:16:50 +0900 (1a3d458) +++ src/pgroonga.h 2016-04-08 23:17:38 +0900 (b29bd62) @@ -27,9 +27,9 @@ #define PGrnMatchStrategyV2Number 12 /* operator &@ (@ in Groonga) */ #define PGrnQueryStrategyV2Number 13 /* operator &? (query in Groonga) */ #define PGrnSimilarStrategyV2Number 14 /* operator &~? (similar search) */ -#define PGrnPrefixStrategyV2Number 15 /* operator &^ (prefix search) */ -#define PGrnPrefixRKStrategyV2Number 16 /* operator &^~ (prefix RK search) */ -#define PGrnScriptStrategyV2Number 17 /* operator &` (script in Groonga) */ +#define PGrnScriptStrategyV2Number 15 /* operator &` (script in Groonga) */ +#define PGrnPrefixStrategyV2Number 16 /* operator &^ (prefix search) */ +#define PGrnPrefixRKStrategyV2Number 17 /* operator &^~ (prefix RK search) */ #define PGrnMatchContainStrategyNumber 18 /* operator &@> (@ in Groonga) */ #define PGrnQueryContainStrategyNumber 19 /* operator &?> (query in Groonga) */ @@ -72,9 +72,9 @@ extern Datum PGDLLEXPORT pgroonga_match_jsonb(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_match_text(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_query_text(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_similar_text(PG_FUNCTION_ARGS); +extern Datum PGDLLEXPORT pgroonga_script_text(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_prefix_text(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_prefix_rk_text(PG_FUNCTION_ARGS); -extern Datum PGDLLEXPORT pgroonga_script_text(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_match_contain_text(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_query_contain_text(PG_FUNCTION_ARGS); -------------- next part -------------- HTML����������������������������...Download