Kouhei Sutou
null+****@clear*****
Tue May 15 15:47:20 JST 2018
Kouhei Sutou 2018-05-15 15:47:20 +0900 (Tue, 15 May 2018) New Revision: 9b5460b191f1ab591dc1852a5ed21310f9dea331 https://github.com/groonga/groonga/commit/9b5460b191f1ab591dc1852a5ed21310f9dea331 Message: sub_filter: support pre filter optimization with scalar scope Added files: test/command/suite/select/function/sub_filter/column/scalar/filtered.expected test/command/suite/select/function/sub_filter/column/scalar/filtered.test Modified files: lib/proc.c test/command/suite/select/function/sub_filter/column/vector/filtered.expected Modified: lib/proc.c (+51 -28) =================================================================== --- lib/proc.c 2018-05-15 15:36:38 +0900 (6f0d98abc) +++ lib/proc.c 2018-05-15 15:47:20 +0900 (3a4d21f7e) @@ -2112,42 +2112,65 @@ sub_filter_pre_filter(grn_ctx *ctx, grn_obj *base_res) { grn_posting posting; - grn_obj values; if (grn_table_size(ctx, res) > grn_sub_filter_pre_filter_threshold) { return GRN_FALSE; } - if (!grn_obj_is_vector_column(ctx, scope)) { - return GRN_FALSE; - } + if (grn_obj_is_vector_column(ctx, scope)) { + grn_obj values; - memset(&posting, 0, sizeof(grn_posting)); - GRN_VOID_INIT(&values); - GRN_TABLE_EACH_BEGIN(ctx, res, cursor, id) { - grn_id *matched_id; - unsigned int i, n; - - grn_table_cursor_get_key(ctx, cursor, (void **)&matched_id); - GRN_BULK_REWIND(&values); - grn_obj_get_value(ctx, scope, *matched_id, &values); - n = grn_vector_size(ctx, &values); - for (i = 0; i < n; i++) { - posting.rid = grn_uvector_get_element(ctx, - &values, - i, - &(posting.weight)); - grn_ii_posting_add(ctx, &posting, (grn_hash *)base_res, GRN_OP_OR); - } - } GRN_TABLE_EACH_END(ctx, cursor); - GRN_OBJ_FIN(ctx, &values); + memset(&posting, 0, sizeof(grn_posting)); + GRN_RECORD_INIT(&values, GRN_OBJ_VECTOR, grn_obj_get_range(ctx, scope)); + GRN_TABLE_EACH_BEGIN(ctx, res, cursor, id) { + grn_id *matched_id; + unsigned int i, n; + + grn_table_cursor_get_key(ctx, cursor, (void **)&matched_id); + GRN_BULK_REWIND(&values); + grn_obj_get_value(ctx, scope, *matched_id, &values); + n = grn_vector_size(ctx, &values); + for (i = 0; i < n; i++) { + posting.rid = grn_uvector_get_element(ctx, + &values, + i, + &(posting.weight)); + grn_ii_posting_add(ctx, &posting, (grn_hash *)base_res, GRN_OP_OR); + } + } GRN_TABLE_EACH_END(ctx, cursor); + GRN_OBJ_FIN(ctx, &values); - grn_report_column(ctx, - "[sub_filter][pre-filter]", - "", - scope); + grn_report_column(ctx, + "[sub_filter][pre-filter]", + "[vector]", + scope); + return GRN_TRUE; + } else if (grn_obj_is_scalar_column(ctx, scope)) { + grn_obj value; - return GRN_TRUE; + memset(&posting, 0, sizeof(grn_posting)); + GRN_RECORD_INIT(&value, 0, grn_obj_get_range(ctx, scope)); + GRN_TABLE_EACH_BEGIN(ctx, res, cursor, id) { + grn_id *matched_id; + + grn_table_cursor_get_key(ctx, cursor, (void **)&matched_id); + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx, scope, *matched_id, &value); + if (GRN_BULK_VSIZE(&value) > 0) { + posting.rid = GRN_RECORD_VALUE(&value); + grn_ii_posting_add(ctx, &posting, (grn_hash *)base_res, GRN_OP_OR); + } + } GRN_TABLE_EACH_END(ctx, cursor); + GRN_OBJ_FIN(ctx, &value); + + grn_report_column(ctx, + "[sub_filter][pre-filter]", + "[scalar]", + scope); + return GRN_TRUE; + } else { + return GRN_FALSE; + } } static grn_rc Added: test/command/suite/select/function/sub_filter/column/scalar/filtered.expected (+40 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/function/sub_filter/column/scalar/filtered.expected 2018-05-15 15:47:20 +0900 (a61746e05) @@ -0,0 +1,40 @@ +table_create Files TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +column_create Files revision COLUMN_SCALAR UInt32 +[[0,0.0,0.0],true] +table_create Packages TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +column_create Packages file COLUMN_SCALAR Files +[[0,0.0,0.0],true] +column_create Files packages_files_index COLUMN_INDEX Packages file +[[0,0.0,0.0],true] +table_create Revisions TABLE_PAT_KEY UInt32 +[[0,0.0,0.0],true] +column_create Revisions files_revision COLUMN_INDEX Files revision +[[0,0.0,0.0],true] +load --table Files +[ +{"_key": "include/groonga.h", "revision": 30}, +{"_key": "lib/groonga.rb", "revision": 12}, +{"_key": "ha_mroonga.cc", "revision": 40} +] +[[0,0.0,0.0],3] +load --table Packages +[ +{"_key": "groonga", "file": "include/groonga.h"}, +{"_key": "rroonga", "file": "lib/groonga.rb"}, +{"_key": "mroonga", "file": "ha_mroonga.cc"} +] +[[0,0.0,0.0],3] +log_level --level info +[[0,0.0,0.0],true] +select Packages --filter '_key == "rroonga" && sub_filter(file, "revision >= 10 && revision < 40")' --output_columns '_key, files, files.revision' +[[0,0.0,0.0],[[[1],[["_key","ShortText"]],["rroonga"]]]] +#|i| [table][select][index][equal][accessor][key] <Packages> +#|i| [table][select][index][selector][no-index][sub_filter] <Packages> +#|i| [sub_filter][pre-filter][column][scalar] <Packages.file> -> <Files> +#|i| [table][select][index][range] <Revisions.files_revision> +#|i| [table][select][index][range] <Revisions.files_revision> +#|i| [accessor][resolve][data-column][index] <Files.packages_files_index> +log_level --level notice +[[0,0.0,0.0],true] Added: test/command/suite/select/function/sub_filter/column/scalar/filtered.test (+33 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/function/sub_filter/column/scalar/filtered.test 2018-05-15 15:47:20 +0900 (4a2fadf7b) @@ -0,0 +1,33 @@ +table_create Files TABLE_PAT_KEY ShortText +column_create Files revision COLUMN_SCALAR UInt32 + +table_create Packages TABLE_PAT_KEY ShortText +column_create Packages file COLUMN_SCALAR Files + +column_create Files packages_files_index COLUMN_INDEX Packages file + +table_create Revisions TABLE_PAT_KEY UInt32 +column_create Revisions files_revision COLUMN_INDEX Files revision + +load --table Files +[ +{"_key": "include/groonga.h", "revision": 30}, +{"_key": "lib/groonga.rb", "revision": 12}, +{"_key": "ha_mroonga.cc", "revision": 40} +] + +load --table Packages +[ +{"_key": "groonga", "file": "include/groonga.h"}, +{"_key": "rroonga", "file": "lib/groonga.rb"}, +{"_key": "mroonga", "file": "ha_mroonga.cc"} +] + +#@add-important-log-levels info +log_level --level info +select Packages \ + --filter '_key == "rroonga" && \ + sub_filter(file, "revision >= 10 && revision < 40")' \ + --output_columns '_key, files, files.revision' +log_level --level notice +#@remove-important-log-levels info Modified: test/command/suite/select/function/sub_filter/column/vector/filtered.expected (+1 -1) =================================================================== --- test/command/suite/select/function/sub_filter/column/vector/filtered.expected 2018-05-15 15:36:38 +0900 (aed3acd44) +++ test/command/suite/select/function/sub_filter/column/vector/filtered.expected 2018-05-15 15:47:20 +0900 (3e9f54fe8) @@ -73,7 +73,7 @@ select Packages --filter '_key == "rroonga" && sub_filter(files, " ] #|i| [table][select][index][equal][accessor][key] <Packages> #|i| [table][select][index][selector][no-index][sub_filter] <Packages> -#|i| [sub_filter][pre-filter][column] <Packages.files> -> <Files> +#|i| [sub_filter][pre-filter][column][vector] <Packages.files> -> <Files> #|i| [table][select][index][range] <Revisions.files_revision> #|i| [table][select][index][range] <Revisions.files_revision> #|i| [accessor][resolve][data-column][index] <Files.packages_files_index> -------------- next part -------------- HTML����������������������������... URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20180515/a738ebeb/attachment-0001.htm