Kouhei Sutou
null+****@clear*****
Mon Mar 18 13:54:40 JST 2013
Kouhei Sutou 2013-03-18 13:54:40 +0900 (Mon, 18 Mar 2013) New Revision: 57e7affa1c18a0026875ccdbd65e0495f5edc20c https://github.com/groonga/groonga/commit/57e7affa1c18a0026875ccdbd65e0495f5edc20c Message: Support query expander in query() function I wanted to use the following API: query("MATCH_COLUMNS", "QUERY", {"query_expander": "QueryExpanderTSV"}) But this change uses the following API: query("MATCH_COLUMNS", "QUERY", "QueryExpanderTSV") Because object literal (`{"XXX": "YYY"}`) syntax isn't supported yet. :< TODO: document Added files: test/command/suite/select/filter/query/query_expander.expected test/command/suite/select/filter/query/query_expander.test Modified files: lib/proc.c Modified: lib/proc.c (+44 -11) =================================================================== --- lib/proc.c 2013-03-18 12:50:13 +0900 (dda990c) +++ lib/proc.c 2013-03-18 13:54:40 +0900 (8eb3eab) @@ -3471,26 +3471,33 @@ run_query(grn_ctx *ctx, grn_obj *table, int nargs, grn_obj **args, grn_obj *res, grn_operator op) { + grn_rc rc = GRN_SUCCESS; grn_obj *match_columns_string; - grn_obj *query_string; + grn_obj *query; + grn_obj *query_expander_name = NULL; grn_obj *match_columns = NULL; grn_obj *condition = NULL; grn_obj *dummy_variable; - /* TODO: support expansion and flags by parameters */ - if (nargs != 2) { + /* TODO: support flags by parameters */ + if (!(2 <= nargs && nargs <= 3)) { ERR(GRN_INVALID_ARGUMENT, - "wrong number of arguments (%d for 2)", nargs); + "wrong number of arguments (%d for 2..3)", nargs); + rc = ctx->rc; goto exit; } match_columns_string = args[0]; - query_string = args[1]; + query = args[1]; + if (nargs > 2) { + query_expander_name = args[2]; + } if (match_columns_string->header.domain == GRN_DB_TEXT && GRN_TEXT_LEN(match_columns_string) > 0) { GRN_EXPR_CREATE_FOR_QUERY(ctx, table, match_columns, dummy_variable); if (!match_columns) { + rc = ctx->rc; goto exit; } @@ -3500,27 +3507,53 @@ run_query(grn_ctx *ctx, grn_obj *table, NULL, GRN_OP_MATCH, GRN_OP_AND, GRN_EXPR_SYNTAX_SCRIPT); if (ctx->rc != GRN_SUCCESS) { + rc = ctx->rc; goto exit; } } - if (query_string->header.domain == GRN_DB_TEXT && - GRN_TEXT_LEN(query_string) > 0) { + if (query->header.domain == GRN_DB_TEXT && GRN_TEXT_LEN(query) > 0) { + const char *query_string; + unsigned int query_string_len; + grn_obj expanded_query; grn_expr_flags flags = GRN_EXPR_SYNTAX_QUERY|GRN_EXPR_ALLOW_PRAGMA|GRN_EXPR_ALLOW_COLUMN; GRN_EXPR_CREATE_FOR_QUERY(ctx, table, condition, dummy_variable); if (!condition) { + rc = ctx->rc; goto exit; } + + query_string = GRN_TEXT_VALUE(query); + query_string_len = GRN_TEXT_LEN(query); + + GRN_TEXT_INIT(&expanded_query, 0); + if (query_expander_name && + query_expander_name->header.domain == GRN_DB_TEXT && + GRN_TEXT_LEN(query_expander_name) > 0) { + rc = expand_query(ctx, query_string, query_string_len, flags, + GRN_TEXT_VALUE(query_expander_name), + GRN_TEXT_LEN(query_expander_name), + &expanded_query); + if (rc != GRN_SUCCESS) { + GRN_OBJ_FIN(ctx, &expanded_query); + goto exit; + } + query_string = GRN_TEXT_VALUE(&expanded_query); + query_string_len = GRN_TEXT_LEN(&expanded_query); + } grn_expr_parse(ctx, condition, - GRN_TEXT_VALUE(query_string), - GRN_TEXT_LEN(query_string), + query_string, + query_string_len, match_columns, GRN_OP_MATCH, GRN_OP_AND, flags); - if (ctx->rc != GRN_SUCCESS) { + rc = ctx->rc; + GRN_OBJ_FIN(ctx, &expanded_query); + if (rc != GRN_SUCCESS) { goto exit; } grn_table_select(ctx, table, condition, res, op); + rc = ctx->rc; } exit: @@ -3531,7 +3564,7 @@ exit: grn_obj_unlink(ctx, condition); } - return ctx->rc; + return rc; } static grn_obj * Added: test/command/suite/select/filter/query/query_expander.expected (+53 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/query/query_expander.expected 2013-03-18 13:54:40 +0900 (cd69f2a) @@ -0,0 +1,53 @@ +register "query_expanders/tsv" +[[0,0.0,0.0],true] +table_create Memos TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Memos content COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +table_create Lexicon TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram +[[0,0.0,0.0],true] +column_create Lexicon diary_content COLUMN_INDEX|WITH_POSITION Memos content +[[0,0.0,0.0],true] +load --table Memos +[ +["content"], +["Start groonga!"], +["Start mroonga!"], +["Start rroonga!"], +["Start Ruby!"], +["Learning Ruby and groonga..."] +] +[[0,0.0,0.0],5] +select --table Memos --filter 'query("content", "rroonga", "QueryExpanderTSV")' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 2 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "content", + "ShortText" + ] + ], + [ + 3, + "Start rroonga!" + ], + [ + 5, + "Learning Ruby and groonga..." + ] + ] + ] +] Added: test/command/suite/select/filter/query/query_expander.test (+20 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/query/query_expander.test 2013-03-18 13:54:40 +0900 (a1a692f) @@ -0,0 +1,20 @@ +#@copy-path fixture/query_expander/tsv/expand.tsv tmp/synonyms.tsv +register "query_expanders/tsv" + +table_create Memos TABLE_NO_KEY +column_create Memos content COLUMN_SCALAR ShortText + +table_create Lexicon TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram +column_create Lexicon diary_content COLUMN_INDEX|WITH_POSITION Memos content + +load --table Memos +[ +["content"], +["Start groonga!"], +["Start mroonga!"], +["Start rroonga!"], +["Start Ruby!"], +["Learning Ruby and groonga..."] +] + +select --table Memos --filter 'query("content", "rroonga", "QueryExpanderTSV")' -------------- next part -------------- HTML����������������������������...Download