Kouhei Sutou
null+****@clear*****
Sun Jan 26 22:29:42 JST 2014
Kouhei Sutou 2014-01-26 22:29:42 +0900 (Sun, 26 Jan 2014) New Revision: 1cd98cc3cb3381cb8ef8c73526fdf1450ba74079 https://github.com/groonga/groonga/commit/1cd98cc3cb3381cb8ef8c73526fdf1450ba74079 Message: snippet_html: returns null when no snippets is found Added files: test/command/suite/select/function/snippet_html/none.expected test/command/suite/select/function/snippet_html/none.test Modified files: doc/source/reference/functions/snippet_html.txt lib/proc.c Modified: doc/source/reference/functions/snippet_html.txt (+4 -2) =================================================================== --- doc/source/reference/functions/snippet_html.txt 2014-01-26 22:13:39 +0900 (0d66bc3) +++ doc/source/reference/functions/snippet_html.txt 2014-01-26 22:29:42 +0900 (4b02b20) @@ -92,8 +92,10 @@ You can specify string literal instead of column. Return value ------------ -``snippet_html`` returns an array of string. An element of array is a -snippet:: +``snippet_html`` returns an array of string or ``null``. If +``snippet_html`` can't find any snippets, it returns ``null``. + +An element of array is a snippet:: [SNIPPET1, SNIPPET2, SNIPPET3] Modified: lib/proc.c (+43 -23) =================================================================== --- lib/proc.c 2014-01-26 22:13:39 +0900 (98e5f14) +++ lib/proc.c 2014-01-26 22:29:42 +0900 (c6f3e9f) @@ -3622,16 +3622,56 @@ selector_all_records(grn_ctx *ctx, grn_obj *table, grn_obj *index, } static grn_obj * -func_snippet_html(grn_ctx *ctx, int nargs, grn_obj **args, - grn_user_data *user_data) +snippet_exec(grn_ctx *ctx, grn_snip *snip, grn_obj *text, + grn_user_data *user_data) { + grn_rc rc; + unsigned int i, n_results, max_tagged_length; + grn_obj snippet_buffer; grn_obj *snippets; + rc = grn_snip_exec(ctx, snip, + GRN_TEXT_VALUE(text), GRN_TEXT_LEN(text), + &n_results, &max_tagged_length); + if (rc != GRN_SUCCESS) { + return NULL; + } + + if (n_results == 0) { + return GRN_PROC_ALLOC(GRN_DB_VOID, 0); + } + snippets = GRN_PROC_ALLOC(GRN_DB_SHORT_TEXT, GRN_OBJ_VECTOR); if (!snippets) { return NULL; } + GRN_TEXT_INIT(&snippet_buffer, 0); + grn_bulk_space(ctx, &snippet_buffer, max_tagged_length); + for (i = 0; i < n_results; i++) { + unsigned int snippet_length; + + GRN_BULK_REWIND(&snippet_buffer); + rc = grn_snip_get_result(ctx, snip, i, + GRN_TEXT_VALUE(&snippet_buffer), + &snippet_length); + if (rc == GRN_SUCCESS) { + grn_vector_add_element(ctx, snippets, + GRN_TEXT_VALUE(&snippet_buffer), snippet_length, + 0, GRN_DB_SHORT_TEXT); + } + } + GRN_OBJ_FIN(ctx, &snippet_buffer); + + return snippets; +} + +static grn_obj * +func_snippet_html(grn_ctx *ctx, int nargs, grn_obj **args, + grn_user_data *user_data) +{ + grn_obj *snippets = NULL; + /* TODO: support parameters */ if (nargs == 1) { grn_obj *text = args[0]; @@ -3667,27 +3707,7 @@ func_snippet_html(grn_ctx *ctx, int nargs, grn_obj **args, } if (snip) { - grn_rc rc; - unsigned int i, n_results, max_tagged_length; - grn_obj snippet_buffer; - - rc = grn_snip_exec(ctx, snip, - GRN_TEXT_VALUE(text), GRN_TEXT_LEN(text), - &n_results, &max_tagged_length); - GRN_TEXT_INIT(&snippet_buffer, 0); - grn_bulk_space(ctx, &snippet_buffer, max_tagged_length); - for (i = 0; i < n_results; i++) { - unsigned int snippet_length; - - GRN_BULK_REWIND(&snippet_buffer); - rc = grn_snip_get_result(ctx, snip, i, - GRN_TEXT_VALUE(&snippet_buffer), - &snippet_length); - grn_vector_add_element(ctx, snippets, - GRN_TEXT_VALUE(&snippet_buffer), snippet_length, - 0, GRN_DB_SHORT_TEXT); - } - GRN_OBJ_FIN(ctx, &snippet_buffer); + snippets = snippet_exec(ctx, snip, text, user_data); grn_snip_close(ctx, snip); } } Added: test/command/suite/select/function/snippet_html/none.expected (+43 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/function/snippet_html/none.expected 2014-01-26 22:29:42 +0900 (df04ae5) @@ -0,0 +1,43 @@ +table_create Documents TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +column_create Documents content COLUMN_SCALAR Text +[[0,0.0,0.0],true] +table_create Terms TABLE_PAT_KEY|KEY_NORMALIZE ShortText --default_tokenizer TokenBigram +[[0,0.0,0.0],true] +column_create Terms document_index COLUMN_INDEX|WITH_POSITION Documents content +[[0,0.0,0.0],true] +load --table Documents +[ +["_key", "content"], +["Groonga", "Groonga can be used with MySQL."] +] +[[0,0.0,0.0],1] +select Documents --match_columns content --query 'MySQL' --output_columns '_key, snippet_html(_key)' --command_version 2 +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 1 + ], + [ + [ + "_key", + "ShortText" + ], + [ + "snippet_html", + "null" + ] + ], + [ + "Groonga", + null + ] + ] + ] +] Added: test/command/suite/select/function/snippet_html/none.test (+16 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/function/snippet_html/none.test 2014-01-26 22:29:42 +0900 (518f431) @@ -0,0 +1,16 @@ +table_create Documents TABLE_HASH_KEY ShortText +column_create Documents content COLUMN_SCALAR Text + +table_create Terms TABLE_PAT_KEY|KEY_NORMALIZE ShortText --default_tokenizer TokenBigram +column_create Terms document_index COLUMN_INDEX|WITH_POSITION Documents content + +load --table Documents +[ +["_key", "content"], +["Groonga", "Groonga can be used with MySQL."] +] + +select Documents \ + --match_columns content --query 'MySQL' \ + --output_columns '_key, snippet_html(_key)' \ + --command_version 2 -------------- next part -------------- HTML����������������������������...Download