Kouhei Sutou
null+****@clear*****
Wed Aug 23 12:40:39 JST 2017
Kouhei Sutou 2017-08-23 12:40:39 +0900 (Wed, 23 Aug 2017) New Revision: 72b7ab66eb0801210b90c40fdb5bc70efa086de4 https://github.com/groonga/groonga/commit/72b7ab66eb0801210b90c40fdb5bc70efa086de4 Message: Support term expansion by no _key column It's recommend that the term column is indexed but it works without index. New API: * grn_expr_syntax_expand_query_by_table() query_expand has two new parameters: * term_column * expanded_term_column TODO: * Update query_expand document * Add query_expand_term_column and query_expand_expanded_term_column parameters to select Added files: test/command/suite/query_expand/table/indexed_term_column.expected test/command/suite/query_expand/table/indexed_term_column.test test/command/suite/query_expand/table/no_indexed_term_column.expected test/command/suite/query_expand/table/no_indexed_term_column.test test/command/suite/query_expand/table/no_term_column.expected test/command/suite/query_expand/table/no_term_column.test test/command/suite/query_expand/table/scalar_expanded_term_column.expected test/command/suite/query_expand/table/scalar_expanded_term_column.test test/command/suite/query_expand/table/vector_expanded_term_column.expected test/command/suite/query_expand/table/vector_expanded_term_column.test Modified files: include/groonga/expr.h lib/expr.c lib/grn_proc.h lib/proc.c lib/proc/proc_query.c lib/proc/proc_select.c Modified: include/groonga/expr.h (+8 -1) =================================================================== --- include/groonga/expr.h 2017-08-23 09:21:14 +0900 (a0c4a2fd8) +++ include/groonga/expr.h 2017-08-23 12:40:39 +0900 (0665f7f59) @@ -1,5 +1,5 @@ /* - Copyright(C) 2009-2016 Brazil + Copyright(C) 2009-2017 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -71,6 +71,13 @@ GRN_API grn_rc grn_expr_syntax_expand_query(grn_ctx *ctx, grn_expr_flags flags, grn_obj *expander, grn_obj *expanded_query); +GRN_API grn_rc grn_expr_syntax_expand_query_by_table(grn_ctx *ctx, + const char *query, + int query_size, + grn_expr_flags flags, + grn_obj *term_column, + grn_obj *expanded_term_column, + grn_obj *expanded_query); GRN_API grn_rc grn_expr_compile(grn_ctx *ctx, grn_obj *expr); GRN_API grn_obj *grn_expr_rewrite(grn_ctx *ctx, grn_obj *expr); Modified: lib/expr.c (+226 -7) =================================================================== --- lib/expr.c 2017-08-23 09:21:14 +0900 (0671d9f63) +++ lib/expr.c 2017-08-23 12:40:39 +0900 (27ab8e8ed) @@ -8403,11 +8403,6 @@ typedef grn_rc (*grn_expr_syntax_expand_term_func)(grn_ctx *ctx, unsigned int term_len, grn_obj *substituted_term, grn_user_data *user_data); -typedef struct { - grn_obj *table; - grn_obj *column; -} grn_expr_syntax_expand_term_by_column_data; - static grn_rc grn_expr_syntax_expand_term_by_func(grn_ctx *ctx, const char *term, unsigned int term_len, @@ -8438,6 +8433,11 @@ grn_expr_syntax_expand_term_by_func(grn_ctx *ctx, return rc; } +typedef struct { + grn_obj *table; + grn_obj *column; +} grn_expr_syntax_expand_term_by_column_data; + static grn_rc grn_expr_syntax_expand_term_by_column(grn_ctx *ctx, const char *term, unsigned int term_len, @@ -8481,6 +8481,123 @@ grn_expr_syntax_expand_term_by_column(grn_ctx *ctx, return rc; } +typedef struct { + grn_obj *table; + grn_obj *term_column; + grn_obj *expanded_term_column; +} grn_expr_syntax_expand_term_by_table_data; + +static grn_rc +grn_expr_syntax_expand_term_by_table(grn_ctx *ctx, + const char *term, unsigned int term_len, + grn_obj *expanded_term, + grn_user_data *user_data) +{ + grn_rc rc = GRN_END_OF_DATA; + grn_expr_syntax_expand_term_by_table_data *data = user_data->ptr; + grn_obj *table; + grn_obj *term_column; + grn_obj *expanded_term_column; + grn_obj *expression; + grn_obj *variable; + grn_obj *found_terms; + int n_terms; + + table = data->table; + term_column = data->term_column; + expanded_term_column = data->expanded_term_column; + + GRN_EXPR_CREATE_FOR_QUERY(ctx, table, expression, variable); + if (ctx->rc != GRN_SUCCESS) { + ERR(ctx->rc, + "[query][expand][table] " + "failed to create expression: <%s>", + ctx->errbuf); + return ctx->rc; + } + grn_expr_append_const(ctx, expression, term_column, GRN_OP_GET_VALUE, 1); + grn_expr_append_const_str(ctx, expression, term, term_len, GRN_OP_PUSH, 1); + grn_expr_append_op(ctx, expression, GRN_OP_EQUAL, 2); + if (ctx->rc != GRN_SUCCESS) { + grn_obj_close(ctx, expression); + ERR(ctx->rc, + "[query][expand][table] " + "failed to build expression: <%s>", + ctx->errbuf); + return ctx->rc; + } + + found_terms = grn_table_select(ctx, table, expression, NULL, GRN_OP_OR); + grn_obj_close(ctx, expression); + if (!found_terms) { + ERR(ctx->rc, + "[query][expand][table] " + "failed to find term: <%.*s>: <%s>", + (int)term_len, + term, + ctx->errbuf); + return ctx->rc; + } + + n_terms = grn_table_size(ctx, found_terms); + if (n_terms == 0) { + grn_obj_close(ctx, found_terms); + return rc; + } + + { + int nth_term; + + GRN_TEXT_PUTC(ctx, expanded_term, '('); + nth_term = 0; + GRN_TABLE_EACH_BEGIN(ctx, found_terms, cursor, id) { + void *key; + grn_id record_id; + + grn_table_cursor_get_key(ctx, cursor, &key); + record_id = *((grn_id *)key); + if (grn_obj_is_vector_column(ctx, expanded_term_column)) { + unsigned int j, n_values; + grn_obj values; + GRN_TEXT_INIT(&values, GRN_OBJ_VECTOR); + grn_obj_get_value(ctx, expanded_term_column, record_id, &values); + n_values = grn_vector_size(ctx, &values); + n_terms += n_values - 1; + for (j = 0; j < n_values; j++) { + const char *value; + unsigned int length; + if (nth_term > 0) { + GRN_TEXT_PUTS(ctx, expanded_term, " OR "); + } + if (n_terms > 1) { + GRN_TEXT_PUTC(ctx, expanded_term, '('); + } + length = grn_vector_get_element(ctx, &values, j, &value, NULL, NULL); + GRN_TEXT_PUT(ctx, expanded_term, value, length); + if (n_terms > 1) { + GRN_TEXT_PUTC(ctx, expanded_term, ')'); + } + nth_term++; + } + GRN_OBJ_FIN(ctx, &values); + } else { + if (nth_term > 0) { + GRN_TEXT_PUTS(ctx, expanded_term, " OR "); + } + if (n_terms > 1) { GRN_TEXT_PUTC(ctx, expanded_term, '('); } + grn_obj_get_value(ctx, expanded_term_column, record_id, expanded_term); + if (n_terms > 1) { GRN_TEXT_PUTC(ctx, expanded_term, ')'); } + nth_term++; + } + } GRN_TABLE_EACH_END(ctx, cursor); + GRN_TEXT_PUTC(ctx, expanded_term, ')'); + } + rc = GRN_SUCCESS; + grn_obj_close(ctx, found_terms); + + return rc; +} + static grn_rc grn_expr_syntax_expand_query_terms(grn_ctx *ctx, const char *query, unsigned int query_size, @@ -8627,7 +8744,7 @@ grn_expr_syntax_expand_query(grn_ctx *ctx, int name_size; name_size = grn_obj_name(ctx, expander, name, GRN_TABLE_MAX_KEY_SIZE); ERR(GRN_INVALID_ARGUMENT, - "[query][expand] " + "[query][expand][proc] " "proc query expander must be a function proc: <%.*s>", name_size, name); } @@ -8654,7 +8771,7 @@ grn_expr_syntax_expand_query(grn_ctx *ctx, int name_size; name_size = grn_obj_name(ctx, expander, name, GRN_TABLE_MAX_KEY_SIZE); ERR(GRN_INVALID_ARGUMENT, - "[query][expand] " + "[query][expand][column] " "failed to get table of query expansion column: <%.*s>", name_size, name); } @@ -8683,6 +8800,108 @@ grn_expr_syntax_expand_query(grn_ctx *ctx, } grn_rc +grn_expr_syntax_expand_query_by_table(grn_ctx *ctx, + const char *query, int query_size, + grn_expr_flags flags, + grn_obj *term_column, + grn_obj *expanded_term_column, + grn_obj *expanded_query) +{ + grn_obj *table; + grn_bool term_column_is_key; + + GRN_API_ENTER; + + if (query_size < 0) { + query_size = strlen(query); + } + + if (!grn_obj_is_data_column(ctx, expanded_term_column)) { + grn_obj inspected; + GRN_TEXT_INIT(&inspected, 0); + grn_inspect(ctx, &inspected, expanded_term_column); + ERR(GRN_INVALID_ARGUMENT, + "[query][expand][table] " + "expanded term column must be a data column: <%.*s>", + (int)GRN_TEXT_LEN(&inspected), + GRN_TEXT_VALUE(&inspected)); + GRN_OBJ_FIN(ctx, &inspected); + GRN_API_RETURN(ctx->rc); + } + table = grn_column_table(ctx, expanded_term_column); + + if (!term_column) { + term_column_is_key = GRN_TRUE; + } else { + if (grn_obj_is_key_accessor(ctx, term_column)) { + term_column_is_key = GRN_TRUE; + } else if (grn_obj_is_data_column(ctx, term_column)) { + term_column_is_key = GRN_FALSE; + } else { + grn_obj inspected; + GRN_TEXT_INIT(&inspected, 0); + grn_inspect(ctx, &inspected, term_column); + ERR(GRN_INVALID_ARGUMENT, + "[query][expand][table] " + "term column must be NULL, _key or a data column: <%.*s>", + (int)GRN_TEXT_LEN(&inspected), + GRN_TEXT_VALUE(&inspected)); + GRN_OBJ_FIN(ctx, &inspected); + GRN_API_RETURN(ctx->rc); + } + if (term_column->header.domain != expanded_term_column->header.domain) { + grn_obj inspected_term_column; + grn_obj inspected_expanded_term_column; + GRN_TEXT_INIT(&inspected_term_column, 0); + GRN_TEXT_INIT(&inspected_expanded_term_column, 0); + grn_inspect(ctx, &inspected_term_column, term_column); + grn_inspect(ctx, &inspected_expanded_term_column, expanded_term_column); + ERR(GRN_INVALID_ARGUMENT, + "[query][expand][table] " + "term column and expanded term column must belong to the same table: " + "term column: <%.*s>, " + "expanded term column: <%*.s>", + (int)GRN_TEXT_LEN(&inspected_term_column), + GRN_TEXT_VALUE(&inspected_term_column), + (int)GRN_TEXT_LEN(&inspected_expanded_term_column), + GRN_TEXT_VALUE(&inspected_expanded_term_column)); + GRN_OBJ_FIN(ctx, &inspected_term_column); + GRN_OBJ_FIN(ctx, &inspected_expanded_term_column); + GRN_API_RETURN(ctx->rc); + } + } + + if (term_column_is_key) { + grn_user_data user_data; + grn_expr_syntax_expand_term_by_column_data data; + user_data.ptr = &data; + data.table = table; + data.column = expanded_term_column; + grn_expr_syntax_expand_query_terms(ctx, + query, query_size, + flags, + expanded_query, + grn_expr_syntax_expand_term_by_column, + &user_data); + } else { + grn_user_data user_data; + grn_expr_syntax_expand_term_by_table_data data; + user_data.ptr = &data; + data.table = table; + data.term_column = term_column; + data.expanded_term_column = expanded_term_column; + grn_expr_syntax_expand_query_terms(ctx, + query, query_size, + flags, + expanded_query, + grn_expr_syntax_expand_term_by_table, + &user_data); + } + + GRN_API_RETURN(ctx->rc); +} + +grn_rc grn_expr_get_keywords(grn_ctx *ctx, grn_obj *expr, grn_obj *keywords) { int i, n; Modified: lib/grn_proc.h (+4 -0) =================================================================== --- lib/grn_proc.h 2017-08-23 09:21:14 +0900 (7c63f15b6) +++ lib/grn_proc.h 2017-08-23 12:40:39 +0900 (961ce3e46) @@ -135,6 +135,10 @@ grn_rc grn_proc_syntax_expand_query(grn_ctx *ctx, grn_expr_flags flags, const char *query_expander_name, unsigned int query_expander_name_len, + const char *term_column_name, + unsigned int term_column_name_len, + const char *expanded_term_column_name, + unsigned int expanded_term_column_name_len, grn_obj *expanded_query, const char *error_message_tag); Modified: lib/proc.c (+2 -0) =================================================================== --- lib/proc.c 2017-08-23 09:21:14 +0900 (aa9befdd4) +++ lib/proc.c 2017-08-23 12:40:39 +0900 (3fa42c171) @@ -2136,6 +2136,8 @@ run_query(grn_ctx *ctx, grn_obj *table, flags, GRN_TEXT_VALUE(query_expander_name), GRN_TEXT_LEN(query_expander_name), + NULL, 0, + NULL, 0, &expanded_query, "[query]"); if (rc != GRN_SUCCESS) { Modified: lib/proc/proc_query.c (+23 -2) =================================================================== --- lib/proc/proc_query.c 2017-08-23 09:21:14 +0900 (cdbe6527d) +++ lib/proc/proc_query.c 2017-08-23 12:40:39 +0900 (981da834b) @@ -31,6 +31,10 @@ command_query_expand(grn_ctx *ctx, int nargs, grn_obj **args, const char *flags_raw; size_t flags_raw_size; grn_expr_flags flags = GRN_EXPR_SYNTAX_QUERY; + const char *term_column; + size_t term_column_size; + const char *expanded_term_column; + size_t expanded_term_column_size; grn_obj expanded_query; expander = grn_plugin_proc_get_var_string(ctx, @@ -48,6 +52,17 @@ command_query_expand(grn_ctx *ctx, int nargs, grn_obj **args, "flags", -1, &flags_raw_size); + term_column = grn_plugin_proc_get_var_string(ctx, + user_data, + "term_column", + -1, + &term_column_size); + expanded_term_column = + grn_plugin_proc_get_var_string(ctx, + user_data, + "expanded_term_column", + -1, + &expanded_term_column_size); if (flags_raw_size > 0) { flags |= grn_proc_expr_query_flags_parse(ctx, @@ -69,6 +84,10 @@ command_query_expand(grn_ctx *ctx, int nargs, grn_obj **args, flags, expander, expander_size, + term_column, + term_column_size, + expanded_term_column, + expanded_term_column_size, &expanded_query, "[query][expand]"); if (ctx->rc == GRN_SUCCESS) { @@ -84,14 +103,16 @@ command_query_expand(grn_ctx *ctx, int nargs, grn_obj **args, void grn_proc_init_query_expand(grn_ctx *ctx) { - grn_expr_var vars[3]; + grn_expr_var vars[5]; grn_plugin_expr_var_init(ctx, &(vars[0]), "expander", -1); grn_plugin_expr_var_init(ctx, &(vars[1]), "query", -1); grn_plugin_expr_var_init(ctx, &(vars[2]), "flags", -1); + grn_plugin_expr_var_init(ctx, &(vars[3]), "term_column", -1); + grn_plugin_expr_var_init(ctx, &(vars[4]), "expanded_term_column", -1); grn_plugin_command_create(ctx, "query_expand", -1, command_query_expand, - 3, + 5, vars); } Modified: lib/proc/proc_select.c (+93 -3) =================================================================== --- lib/proc/proc_select.c 2017-08-23 09:21:14 +0900 (c0d988b77) +++ lib/proc/proc_select.c 2017-08-23 12:40:39 +0900 (f902f160d) @@ -173,6 +173,10 @@ grn_proc_syntax_expand_query(grn_ctx *ctx, grn_expr_flags flags, const char *query_expander_name, unsigned int query_expander_name_len, + const char *term_column_name, + unsigned int term_column_name_len, + const char *expanded_term_column_name, + unsigned int expanded_term_column_name_len, grn_obj *expanded_query, const char *error_message_tag) { @@ -186,12 +190,96 @@ grn_proc_syntax_expand_query(grn_ctx *ctx, GRN_INVALID_ARGUMENT, "%s nonexistent query expander: <%.*s>", error_message_tag, - query_expander_name_len, query_expander_name); + (int)query_expander_name_len, + query_expander_name); return ctx->rc; } - return grn_expr_syntax_expand_query(ctx, query, query_len, flags, - query_expander, expanded_query); + if (expanded_term_column_name_len == 0) { + return grn_expr_syntax_expand_query(ctx, query, query_len, flags, + query_expander, expanded_query); + } + + if (!grn_obj_is_table(ctx, query_expander)) { + grn_obj inspected; + GRN_TEXT_INIT(&inspected, 0); + grn_inspect(ctx, &inspected, query_expander); + GRN_PLUGIN_ERROR(ctx, + GRN_INVALID_ARGUMENT, + "%s query expander with expanded term column " + "must be table: <%.*s>", + error_message_tag, + (int)GRN_TEXT_LEN(&inspected), + GRN_TEXT_VALUE(&inspected)); + GRN_OBJ_FIN(ctx, &inspected); + return ctx->rc; + } + + { + grn_obj *term_column = NULL; + grn_obj *expanded_term_column; + + expanded_term_column = grn_obj_column(ctx, + query_expander, + expanded_term_column_name, + expanded_term_column_name_len); + if (!expanded_term_column) { + grn_obj inspected; + GRN_TEXT_INIT(&inspected, 0); + grn_inspect(ctx, &inspected, query_expander); + GRN_PLUGIN_ERROR(ctx, + GRN_INVALID_ARGUMENT, + "%s nonexistent expanded term column: <%.*s>: " + "query expander: <%.*s>", + error_message_tag, + (int)expanded_term_column_name_len, + expanded_term_column_name, + (int)GRN_TEXT_LEN(&inspected), + GRN_TEXT_VALUE(&inspected)); + GRN_OBJ_FIN(ctx, &inspected); + return ctx->rc; + } + + if (term_column_name_len > 0) { + term_column = grn_obj_column(ctx, + query_expander, + term_column_name, + term_column_name_len); + if (!term_column) { + grn_obj inspected; + GRN_TEXT_INIT(&inspected, 0); + grn_inspect(ctx, &inspected, query_expander); + GRN_PLUGIN_ERROR(ctx, + GRN_INVALID_ARGUMENT, + "%s nonexistent term column: <%.*s>: " + "query expander: <%.*s>", + error_message_tag, + (int)term_column_name_len, + term_column_name, + (int)GRN_TEXT_LEN(&inspected), + GRN_TEXT_VALUE(&inspected)); + GRN_OBJ_FIN(ctx, &inspected); + if (grn_obj_is_accessor(ctx, expanded_term_column)) { + grn_obj_unlink(ctx, expanded_term_column); + } + return ctx->rc; + } + } + + grn_expr_syntax_expand_query_by_table(ctx, + query, query_len, + flags, + term_column, + expanded_term_column, + expanded_query); + if (grn_obj_is_accessor(ctx, term_column)) { + grn_obj_unlink(ctx, term_column); + } + if (grn_obj_is_accessor(ctx, expanded_term_column)) { + grn_obj_unlink(ctx, expanded_term_column); + } + return ctx->rc; + } } static grn_table_group_flags @@ -737,6 +825,8 @@ grn_filter_data_execute(grn_ctx *ctx, flags, data->query_expander.value, data->query_expander.length, + NULL, 0, + NULL, 0, &query_expander_buf, tag); if (rc == GRN_SUCCESS) { Added: test/command/suite/query_expand/table/indexed_term_column.expected (+17 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/query_expand/table/indexed_term_column.expected 2017-08-23 12:40:39 +0900 (2cc995834) @@ -0,0 +1,17 @@ +table_create TermExpansions TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create TermExpansions term COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +column_create TermExpansions expansions COLUMN_VECTOR ShortText +[[0,0.0,0.0],true] +table_create Terms TABLE_PAT_KEY ShortText --normalizer NormalizerAuto +[[0,0.0,0.0],true] +column_create Terms expansion_term COLUMN_INDEX TermExpansions term +[[0,0.0,0.0],true] +load --table TermExpansions +[ +{"term": "Rroonga", "expansions": ["Rroonga", "Ruby Groonga"]} +] +[[0,0.0,0.0],1] +query_expand TermExpansions "Groonga rroonga Mroonga" --term_column term --expanded_term_column expansions +[[0,0.0,0.0],"Groonga ((Rroonga) OR (Ruby Groonga)) Mroonga"] Added: test/command/suite/query_expand/table/indexed_term_column.test (+16 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/query_expand/table/indexed_term_column.test 2017-08-23 12:40:39 +0900 (e087a16e7) @@ -0,0 +1,16 @@ +table_create TermExpansions TABLE_NO_KEY +column_create TermExpansions term COLUMN_SCALAR ShortText +column_create TermExpansions expansions COLUMN_VECTOR ShortText + +table_create Terms TABLE_PAT_KEY ShortText \ + --normalizer NormalizerAuto +column_create Terms expansion_term COLUMN_INDEX TermExpansions term + +load --table TermExpansions +[ +{"term": "Rroonga", "expansions": ["Rroonga", "Ruby Groonga"]} +] + +query_expand TermExpansions "Groonga rroonga Mroonga" \ + --term_column term \ + --expanded_term_column expansions Added: test/command/suite/query_expand/table/no_indexed_term_column.expected (+13 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/query_expand/table/no_indexed_term_column.expected 2017-08-23 12:40:39 +0900 (5c7effbdf) @@ -0,0 +1,13 @@ +table_create TermExpansions TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create TermExpansions term COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +column_create TermExpansions expansions COLUMN_VECTOR ShortText +[[0,0.0,0.0],true] +load --table TermExpansions +[ +{"term": "Rroonga", "expansions": ["Rroonga", "Ruby Groonga"]} +] +[[0,0.0,0.0],1] +query_expand TermExpansions "Groonga Rroonga Mroonga" --term_column term --expanded_term_column expansions +[[0,0.0,0.0],"Groonga ((Rroonga) OR (Ruby Groonga)) Mroonga"] Added: test/command/suite/query_expand/table/no_indexed_term_column.test (+12 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/query_expand/table/no_indexed_term_column.test 2017-08-23 12:40:39 +0900 (1c79f1d40) @@ -0,0 +1,12 @@ +table_create TermExpansions TABLE_NO_KEY +column_create TermExpansions term COLUMN_SCALAR ShortText +column_create TermExpansions expansions COLUMN_VECTOR ShortText + +load --table TermExpansions +[ +{"term": "Rroonga", "expansions": ["Rroonga", "Ruby Groonga"]} +] + +query_expand TermExpansions "Groonga Rroonga Mroonga" \ + --term_column term \ + --expanded_term_column expansions Added: test/command/suite/query_expand/table/no_term_column.expected (+11 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/query_expand/table/no_term_column.expected 2017-08-23 12:40:39 +0900 (5903bebed) @@ -0,0 +1,11 @@ +table_create TermExpansions TABLE_HASH_KEY ShortText --normalizer NormalizerAuto +[[0,0.0,0.0],true] +column_create TermExpansions expansions COLUMN_VECTOR ShortText +[[0,0.0,0.0],true] +load --table TermExpansions +[ +{"_key": "Rroonga", "expansions": ["Rroonga", "Ruby Groonga"]} +] +[[0,0.0,0.0],1] +query_expand TermExpansions "Groonga Rroonga Mroonga" --expanded_term_column expansions +[[0,0.0,0.0],"Groonga ((Rroonga) OR (Ruby Groonga)) Mroonga"] Added: test/command/suite/query_expand/table/no_term_column.test (+11 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/query_expand/table/no_term_column.test 2017-08-23 12:40:39 +0900 (c468ac9f2) @@ -0,0 +1,11 @@ +table_create TermExpansions TABLE_HASH_KEY ShortText \ + --normalizer NormalizerAuto +column_create TermExpansions expansions COLUMN_VECTOR ShortText + +load --table TermExpansions +[ +{"_key": "Rroonga", "expansions": ["Rroonga", "Ruby Groonga"]} +] + +query_expand TermExpansions "Groonga Rroonga Mroonga" \ + --expanded_term_column expansions Added: test/command/suite/query_expand/table/scalar_expanded_term_column.expected (+16 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/query_expand/table/scalar_expanded_term_column.expected 2017-08-23 12:40:39 +0900 (ac295a871) @@ -0,0 +1,16 @@ +table_create TermExpansions TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create TermExpansions term COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +column_create TermExpansions expansion COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +load --table TermExpansions +[ +{"term": "PGroonga", "expansion": "PGroonga"}, +{"term": "PGroonga", "expansion": "Groogna PostgreSQL"}, +{"term": "Rroonga", "expansion": "Rroonga"}, +{"term": "Rroonga", "expansion": "Ruby Groonga"} +] +[[0,0.0,0.0],4] +query_expand TermExpansions "Groonga Rroonga Mroonga" --term_column term --expanded_term_column expansion +[[0,0.0,0.0],"Groonga ((Rroonga) OR (Ruby Groonga)) Mroonga"] Added: test/command/suite/query_expand/table/scalar_expanded_term_column.test (+15 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/query_expand/table/scalar_expanded_term_column.test 2017-08-23 12:40:39 +0900 (e40d69454) @@ -0,0 +1,15 @@ +table_create TermExpansions TABLE_NO_KEY +column_create TermExpansions term COLUMN_SCALAR ShortText +column_create TermExpansions expansion COLUMN_SCALAR ShortText + +load --table TermExpansions +[ +{"term": "PGroonga", "expansion": "PGroonga"}, +{"term": "PGroonga", "expansion": "Groogna PostgreSQL"}, +{"term": "Rroonga", "expansion": "Rroonga"}, +{"term": "Rroonga", "expansion": "Ruby Groonga"} +] + +query_expand TermExpansions "Groonga Rroonga Mroonga" \ + --term_column term \ + --expanded_term_column expansion Added: test/command/suite/query_expand/table/vector_expanded_term_column.expected (+23 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/query_expand/table/vector_expanded_term_column.expected 2017-08-23 12:40:39 +0900 (be95e554c) @@ -0,0 +1,23 @@ +table_create TermExpansions TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create TermExpansions term COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +column_create TermExpansions expansions COLUMN_VECTOR ShortText +[[0,0.0,0.0],true] +load --table TermExpansions +[ +{"term": "PGroonga", "expansions": ["PGroonga", "Groogna PostgreSQL"]}, +{"term": "Rroonga", "expansions": []}, +{"term": "Rroonga", "expansions": ["Rroonga", "Ruby Groonga"]}, +{"term": "Rroonga", "expansions": ["Ruby \"full text search\""]} +] +[[0,0.0,0.0],4] +query_expand TermExpansions "Groonga Rroonga Mroonga" --term_column term --expanded_term_column expansions +[ + [ + 0, + 0.0, + 0.0 + ], + "Groonga ((Rroonga) OR (Ruby Groonga) OR (Ruby \"full text search\")) Mroonga" +] Added: test/command/suite/query_expand/table/vector_expanded_term_column.test (+15 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/query_expand/table/vector_expanded_term_column.test 2017-08-23 12:40:39 +0900 (93c767eb3) @@ -0,0 +1,15 @@ +table_create TermExpansions TABLE_NO_KEY +column_create TermExpansions term COLUMN_SCALAR ShortText +column_create TermExpansions expansions COLUMN_VECTOR ShortText + +load --table TermExpansions +[ +{"term": "PGroonga", "expansions": ["PGroonga", "Groogna PostgreSQL"]}, +{"term": "Rroonga", "expansions": []}, +{"term": "Rroonga", "expansions": ["Rroonga", "Ruby Groonga"]}, +{"term": "Rroonga", "expansions": ["Ruby \"full text search\""]} +] + +query_expand TermExpansions "Groonga Rroonga Mroonga" \ + --term_column term \ + --expanded_term_column expansions -------------- next part -------------- HTML����������������������������...Download