Kouhei Sutou
null+****@clear*****
Wed Jul 15 18:31:37 JST 2015
Kouhei Sutou 2015-07-15 18:31:37 +0900 (Wed, 15 Jul 2015) New Revision: 0e72f34f3c44e717f3e86f467d758e2e3575f8d4 https://github.com/groonga/groonga/commit/0e72f34f3c44e717f3e86f467d758e2e3575f8d4 Message: logical_range_filter: don't use range index if query has nested reference vector accessor Nested reference vector accessor is an accessor that has one or more reference vector columns not in the last element. users.name is a nested reference vector when "users" is defined as the following because "users" isn't the last element: column_create XXX users COLUMN_VECTOR Users user.tags isn't a nested reference vector when "user" and "tags" are defined as the following because "tags" is the last element: column_create XXX user COLUMN_SCALAR Users column_create Users tags COLUMN_VECTOR Tags Added files: test/command/suite/sharding/logical_range_filter/filter/match/nested_reference_vector/range_index.expected test/command/suite/sharding/logical_range_filter/filter/match/nested_reference_vector/range_index.test test/command/suite/sharding/logical_range_filter/filter/match/nested_reference_vector/select.expected test/command/suite/sharding/logical_range_filter/filter/match/nested_reference_vector/select.test test/command/suite/sharding/logical_range_filter/filter/match/reference_vector/range_index.expected test/command/suite/sharding/logical_range_filter/filter/match/reference_vector/range_index.test test/command/suite/sharding/logical_range_filter/filter/match/reference_vector/select.expected test/command/suite/sharding/logical_range_filter/filter/match/reference_vector/select.test Modified files: plugins/sharding/logical_range_filter.rb Modified: plugins/sharding/logical_range_filter.rb (+23 -0) =================================================================== --- plugins/sharding/logical_range_filter.rb 2015-07-15 18:28:33 +0900 (904a21f) +++ plugins/sharding/logical_range_filter.rb 2015-07-15 18:31:37 +0900 (f4da0f2) @@ -362,6 +362,14 @@ module Groonga end def range_index_available_expression?(expression, line, method_name) + nested_reference_vector_column_accessor = + find_nested_reference_vector_column_accessor(expression) + if nested_reference_vector_column_accessor + reason = "nested reference vector column accessor can't be used: " + reason << "<#{nested_reference_vector_column_accessor.name}>" + return decide_use_range_index(false, reason, line, method_name) + end + selector_only_procedure = find_selector_only_procedure(expression) if selector_only_procedure reason = "selector only procedure can't be used: " @@ -372,6 +380,21 @@ module Groonga true end + def find_nested_reference_vector_column_accessor(expression) + expression.codes.each do |code| + value = code.value + next unless value.is_a?(Accessor) + + sub_accessor = value + while sub_accessor.have_next? + object = sub_accessor.object + return value if object.is_a?(Column) and object.vector? + sub_accessor = sub_accessor.next + end + end + nil + end + def find_selector_only_procedure(expression) expression.codes.each do |code| value = code.value Added: test/command/suite/sharding/logical_range_filter/filter/match/nested_reference_vector/range_index.expected (+103 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/sharding/logical_range_filter/filter/match/nested_reference_vector/range_index.expected 2015-07-15 18:31:37 +0900 (458eb68) @@ -0,0 +1,103 @@ +plugin_register sharding +[[0,0.0,0.0],true] +table_create Terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigramSplitSymbolAlpha --normalizer NormalizerAuto +[[0,0.0,0.0],true] +table_create Users TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +column_create Users name COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +table_create Logs_20150205 TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Logs_20150205 timestamp COLUMN_SCALAR Time +[[0,0.0,0.0],true] +column_create Logs_20150205 memo COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +column_create Logs_20150205 users COLUMN_VECTOR Users +[[0,0.0,0.0],true] +table_create Timestamp_20150205 TABLE_PAT_KEY Time +[[0,0.0,0.0],true] +column_create Timestamp_20150205 index COLUMN_INDEX Logs_20150205 timestamp +[[0,0.0,0.0],true] +column_create Users index_20150205 COLUMN_INDEX Logs_20150205 users +[[0,0.0,0.0],true] +column_create Terms users_name COLUMN_INDEX|WITH_SECTION Users name +[[0,0.0,0.0],true] +load --table Users +[ +{"_key": "alice", "name": "Alice"}, +{"_key": "bob", "name": "Bob"}, +{"_key": "carlos", "name": "Carlos"}, +{"_key": "david", "name": "David"} +] +[[0,0.0,0.0],4] +load --table Logs_20150205 +[ +{ + "timestamp": "2015-02-05 13:49:00", + "memo": "2015-02-05 13:49:00", + "users": ["alice", "bob", "carlos"] +}, +{ + "timestamp": "2015-02-05 13:50:00", + "memo": "2015-02-05 13:50:00", + "users": ["bob", "carlos", "david"] +}, +{ + "timestamp": "2015-02-05 13:51:00", + "memo": "2015-02-05 13:51:00", + "users": ["bob", "carlos", "david"] +}, +{ + "timestamp": "2015-02-05 13:52:00", + "memo": "2015-02-05 13:52:00", + "users": ["carlos", "david", "alice"] +} +] +[[0,0.0,0.0],4] +log_level --level debug +[[0,0.0,0.0],true] +logical_range_filter Logs timestamp --limit 2 --filter 'users.name @ "ce"' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + "memo", + "ShortText" + ], + [ + "timestamp", + "Time" + ], + [ + "users", + "Users" + ] + ], + [ + "2015-02-05 13:49:00", + 1423111740.0, + [ + "alice", + "bob", + "carlos" + ] + ], + [ + "2015-02-05 13:52:00", + 1423111920.0, + [ + "carlos", + "david", + "alice" + ] + ] + ] +] +#|d| [logical_range_filter][select] <Logs_20150205>: nested reference vector column accessor can't be used: <users.name> +log_level --level notice +[[0,0.0,0.0],true] Added: test/command/suite/sharding/logical_range_filter/filter/match/nested_reference_vector/range_index.test (+63 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/sharding/logical_range_filter/filter/match/nested_reference_vector/range_index.test 2015-07-15 18:31:37 +0900 (34aca20) @@ -0,0 +1,63 @@ +#@on-error omit +plugin_register sharding +#@on-error default + +table_create Terms TABLE_PAT_KEY ShortText \ + --default_tokenizer TokenBigramSplitSymbolAlpha \ + --normalizer NormalizerAuto + +table_create Users TABLE_PAT_KEY ShortText +column_create Users name COLUMN_SCALAR ShortText + +table_create Logs_20150205 TABLE_NO_KEY +column_create Logs_20150205 timestamp COLUMN_SCALAR Time +column_create Logs_20150205 memo COLUMN_SCALAR ShortText +column_create Logs_20150205 users COLUMN_VECTOR Users + +table_create Timestamp_20150205 TABLE_PAT_KEY Time +column_create Timestamp_20150205 index COLUMN_INDEX Logs_20150205 timestamp + +column_create Users index_20150205 COLUMN_INDEX Logs_20150205 users + +column_create Terms users_name COLUMN_INDEX|WITH_SECTION \ + Users name + +load --table Users +[ +{"_key": "alice", "name": "Alice"}, +{"_key": "bob", "name": "Bob"}, +{"_key": "carlos", "name": "Carlos"}, +{"_key": "david", "name": "David"} +] + +load --table Logs_20150205 +[ +{ + "timestamp": "2015-02-05 13:49:00", + "memo": "2015-02-05 13:49:00", + "users": ["alice", "bob", "carlos"] +}, +{ + "timestamp": "2015-02-05 13:50:00", + "memo": "2015-02-05 13:50:00", + "users": ["bob", "carlos", "david"] +}, +{ + "timestamp": "2015-02-05 13:51:00", + "memo": "2015-02-05 13:51:00", + "users": ["bob", "carlos", "david"] +}, +{ + "timestamp": "2015-02-05 13:52:00", + "memo": "2015-02-05 13:52:00", + "users": ["carlos", "david", "alice"] +} +] + +#@add-important-log-levels debug +log_level --level debug +logical_range_filter Logs timestamp \ + --limit 2 \ + --filter 'users.name @ "ce"' +log_level --level notice +#@remove-important-log-levels debug Added: test/command/suite/sharding/logical_range_filter/filter/match/nested_reference_vector/select.expected (+103 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/sharding/logical_range_filter/filter/match/nested_reference_vector/select.expected 2015-07-15 18:31:37 +0900 (ad42d70) @@ -0,0 +1,103 @@ +plugin_register sharding +[[0,0.0,0.0],true] +table_create Terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigramSplitSymbolAlpha --normalizer NormalizerAuto +[[0,0.0,0.0],true] +table_create Users TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +column_create Users name COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +table_create Logs_20150205 TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Logs_20150205 timestamp COLUMN_SCALAR Time +[[0,0.0,0.0],true] +column_create Logs_20150205 memo COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +column_create Logs_20150205 users COLUMN_VECTOR Users +[[0,0.0,0.0],true] +table_create Timestamp_20150205 TABLE_PAT_KEY Time +[[0,0.0,0.0],true] +column_create Timestamp_20150205 index COLUMN_INDEX Logs_20150205 timestamp +[[0,0.0,0.0],true] +column_create Users index_20150205 COLUMN_INDEX Logs_20150205 users +[[0,0.0,0.0],true] +column_create Terms users_name COLUMN_INDEX|WITH_SECTION Users name +[[0,0.0,0.0],true] +load --table Users +[ +{"_key": "alice", "name": "Alice"}, +{"_key": "bob", "name": "Bob"}, +{"_key": "carlos", "name": "Carlos"}, +{"_key": "david", "name": "David"} +] +[[0,0.0,0.0],4] +load --table Logs_20150205 +[ +{ + "timestamp": "2015-02-05 13:49:00", + "memo": "2015-02-05 13:49:00", + "users": ["alice", "bob", "carlos"] +}, +{ + "timestamp": "2015-02-05 13:50:00", + "memo": "2015-02-05 13:50:00", + "users": ["bob", "carlos", "david"] +}, +{ + "timestamp": "2015-02-05 13:51:00", + "memo": "2015-02-05 13:51:00", + "users": ["bob", "carlos", "david"] +}, +{ + "timestamp": "2015-02-05 13:52:00", + "memo": "2015-02-05 13:52:00", + "users": ["carlos", "david", "alice"] +} +] +[[0,0.0,0.0],4] +log_level --level debug +[[0,0.0,0.0],true] +logical_range_filter Logs timestamp --limit -1 --filter 'users.name @ "ce"' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + "memo", + "ShortText" + ], + [ + "timestamp", + "Time" + ], + [ + "users", + "Users" + ] + ], + [ + "2015-02-05 13:49:00", + 1423111740.0, + [ + "alice", + "bob", + "carlos" + ] + ], + [ + "2015-02-05 13:52:00", + 1423111920.0, + [ + "carlos", + "david", + "alice" + ] + ] + ] +] +#|d| [logical_range_filter][select] <Logs_20150205>: limit is negative: <-1> +log_level --level notice +[[0,0.0,0.0],true] Added: test/command/suite/sharding/logical_range_filter/filter/match/nested_reference_vector/select.test (+63 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/sharding/logical_range_filter/filter/match/nested_reference_vector/select.test 2015-07-15 18:31:37 +0900 (260000a) @@ -0,0 +1,63 @@ +#@on-error omit +plugin_register sharding +#@on-error default + +table_create Terms TABLE_PAT_KEY ShortText \ + --default_tokenizer TokenBigramSplitSymbolAlpha \ + --normalizer NormalizerAuto + +table_create Users TABLE_PAT_KEY ShortText +column_create Users name COLUMN_SCALAR ShortText + +table_create Logs_20150205 TABLE_NO_KEY +column_create Logs_20150205 timestamp COLUMN_SCALAR Time +column_create Logs_20150205 memo COLUMN_SCALAR ShortText +column_create Logs_20150205 users COLUMN_VECTOR Users + +table_create Timestamp_20150205 TABLE_PAT_KEY Time +column_create Timestamp_20150205 index COLUMN_INDEX Logs_20150205 timestamp + +column_create Users index_20150205 COLUMN_INDEX Logs_20150205 users + +column_create Terms users_name COLUMN_INDEX|WITH_SECTION \ + Users name + +load --table Users +[ +{"_key": "alice", "name": "Alice"}, +{"_key": "bob", "name": "Bob"}, +{"_key": "carlos", "name": "Carlos"}, +{"_key": "david", "name": "David"} +] + +load --table Logs_20150205 +[ +{ + "timestamp": "2015-02-05 13:49:00", + "memo": "2015-02-05 13:49:00", + "users": ["alice", "bob", "carlos"] +}, +{ + "timestamp": "2015-02-05 13:50:00", + "memo": "2015-02-05 13:50:00", + "users": ["bob", "carlos", "david"] +}, +{ + "timestamp": "2015-02-05 13:51:00", + "memo": "2015-02-05 13:51:00", + "users": ["bob", "carlos", "david"] +}, +{ + "timestamp": "2015-02-05 13:52:00", + "memo": "2015-02-05 13:52:00", + "users": ["carlos", "david", "alice"] +} +] + +#@add-important-log-levels debug +log_level --level debug +logical_range_filter Logs timestamp \ + --limit -1 \ + --filter 'users.name @ "ce"' +log_level --level notice +#@remove-important-log-levels debug Added: test/command/suite/sharding/logical_range_filter/filter/match/reference_vector/range_index.expected (+95 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/sharding/logical_range_filter/filter/match/reference_vector/range_index.expected 2015-07-15 18:31:37 +0900 (98b3a3c) @@ -0,0 +1,95 @@ +plugin_register sharding +[[0,0.0,0.0],true] +table_create Users TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +column_create Users tags COLUMN_VECTOR ShortText +[[0,0.0,0.0],true] +table_create Tags TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +column_create Tags users COLUMN_INDEX Users tags +[[0,0.0,0.0],true] +table_create Logs_20150205 TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Logs_20150205 timestamp COLUMN_SCALAR Time +[[0,0.0,0.0],true] +column_create Logs_20150205 memo COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +column_create Logs_20150205 user COLUMN_SCALAR Users +[[0,0.0,0.0],true] +table_create Timestamp_20150205 TABLE_PAT_KEY Time +[[0,0.0,0.0],true] +column_create Timestamp_20150205 index COLUMN_INDEX Logs_20150205 timestamp +[[0,0.0,0.0],true] +column_create Users index_20150205 COLUMN_INDEX Logs_20150205 user +[[0,0.0,0.0],true] +load --table Users +[ +{"_key": "alice", "tags": ["student", "programming", "search"]}, +{"_key": "bob", "tags": ["worker", "programming"]}, +{"_key": "carlos", "tags": ["programming"]}, +{"_key": "david", "tags": ["search", "worker"]} +] +[[0,0.0,0.0],4] +load --table Logs_20150205 +[ +{ + "timestamp": "2015-02-05 13:49:00", + "memo": "2015-02-05 13:49:00", + "user": "alice" +}, +{ + "timestamp": "2015-02-05 13:50:00", + "memo": "2015-02-05 13:50:00", + "user": "bob" +}, +{ + "timestamp": "2015-02-05 13:51:00", + "memo": "2015-02-05 13:51:00", + "user": "carlos" +}, +{ + "timestamp": "2015-02-05 13:52:00", + "memo": "2015-02-05 13:52:00", + "user": "david" +} +] +[[0,0.0,0.0],4] +log_level --level debug +[[0,0.0,0.0],true] +logical_range_filter Logs timestamp --limit 2 --filter 'user.tags @ "search"' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + "memo", + "ShortText" + ], + [ + "timestamp", + "Time" + ], + [ + "user", + "Users" + ] + ], + [ + "2015-02-05 13:49:00", + 1423111740.0, + "alice" + ], + [ + "2015-02-05 13:52:00", + 1423111920.0, + "david" + ] + ] +] +#|d| [logical_range_filter][range-index] <Logs_20150205>: hit ratio (1=4/4)>= threshold (0.2) +log_level --level notice +[[0,0.0,0.0],true] Added: test/command/suite/sharding/logical_range_filter/filter/match/reference_vector/range_index.test (+59 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/sharding/logical_range_filter/filter/match/reference_vector/range_index.test 2015-07-15 18:31:37 +0900 (8df3a4d) @@ -0,0 +1,59 @@ +#@on-error omit +plugin_register sharding +#@on-error default + +table_create Users TABLE_PAT_KEY ShortText +column_create Users tags COLUMN_VECTOR ShortText + +table_create Tags TABLE_PAT_KEY ShortText +column_create Tags users COLUMN_INDEX Users tags + +table_create Logs_20150205 TABLE_NO_KEY +column_create Logs_20150205 timestamp COLUMN_SCALAR Time +column_create Logs_20150205 memo COLUMN_SCALAR ShortText +column_create Logs_20150205 user COLUMN_SCALAR Users + +table_create Timestamp_20150205 TABLE_PAT_KEY Time +column_create Timestamp_20150205 index COLUMN_INDEX Logs_20150205 timestamp + +column_create Users index_20150205 COLUMN_INDEX Logs_20150205 user + +load --table Users +[ +{"_key": "alice", "tags": ["student", "programming", "search"]}, +{"_key": "bob", "tags": ["worker", "programming"]}, +{"_key": "carlos", "tags": ["programming"]}, +{"_key": "david", "tags": ["search", "worker"]} +] + +load --table Logs_20150205 +[ +{ + "timestamp": "2015-02-05 13:49:00", + "memo": "2015-02-05 13:49:00", + "user": "alice" +}, +{ + "timestamp": "2015-02-05 13:50:00", + "memo": "2015-02-05 13:50:00", + "user": "bob" +}, +{ + "timestamp": "2015-02-05 13:51:00", + "memo": "2015-02-05 13:51:00", + "user": "carlos" +}, +{ + "timestamp": "2015-02-05 13:52:00", + "memo": "2015-02-05 13:52:00", + "user": "david" +} +] + +#@add-important-log-levels debug +log_level --level debug +logical_range_filter Logs timestamp \ + --limit 2 \ + --filter 'user.tags @ "search"' +log_level --level notice +#@remove-important-log-levels debug Added: test/command/suite/sharding/logical_range_filter/filter/match/reference_vector/select.expected (+95 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/sharding/logical_range_filter/filter/match/reference_vector/select.expected 2015-07-15 18:31:37 +0900 (46630b1) @@ -0,0 +1,95 @@ +plugin_register sharding +[[0,0.0,0.0],true] +table_create Users TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +column_create Users tags COLUMN_VECTOR ShortText +[[0,0.0,0.0],true] +table_create Tags TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +column_create Tags users COLUMN_INDEX Users tags +[[0,0.0,0.0],true] +table_create Logs_20150205 TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Logs_20150205 timestamp COLUMN_SCALAR Time +[[0,0.0,0.0],true] +column_create Logs_20150205 memo COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +column_create Logs_20150205 user COLUMN_SCALAR Users +[[0,0.0,0.0],true] +table_create Timestamp_20150205 TABLE_PAT_KEY Time +[[0,0.0,0.0],true] +column_create Timestamp_20150205 index COLUMN_INDEX Logs_20150205 timestamp +[[0,0.0,0.0],true] +column_create Users index_20150205 COLUMN_INDEX Logs_20150205 user +[[0,0.0,0.0],true] +load --table Users +[ +{"_key": "alice", "tags": ["student", "programming", "search"]}, +{"_key": "bob", "tags": ["worker", "programming"]}, +{"_key": "carlos", "tags": ["programming"]}, +{"_key": "david", "tags": ["search", "worker"]} +] +[[0,0.0,0.0],4] +load --table Logs_20150205 +[ +{ + "timestamp": "2015-02-05 13:49:00", + "memo": "2015-02-05 13:49:00", + "user": "alice" +}, +{ + "timestamp": "2015-02-05 13:50:00", + "memo": "2015-02-05 13:50:00", + "user": "bob" +}, +{ + "timestamp": "2015-02-05 13:51:00", + "memo": "2015-02-05 13:51:00", + "user": "carlos" +}, +{ + "timestamp": "2015-02-05 13:52:00", + "memo": "2015-02-05 13:52:00", + "user": "david" +} +] +[[0,0.0,0.0],4] +log_level --level debug +[[0,0.0,0.0],true] +logical_range_filter Logs timestamp --limit -1 --filter 'user.tags @ "search"' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + "memo", + "ShortText" + ], + [ + "timestamp", + "Time" + ], + [ + "user", + "Users" + ] + ], + [ + "2015-02-05 13:49:00", + 1423111740.0, + "alice" + ], + [ + "2015-02-05 13:52:00", + 1423111920.0, + "david" + ] + ] +] +#|d| [logical_range_filter][select] <Logs_20150205>: limit is negative: <-1> +log_level --level notice +[[0,0.0,0.0],true] Added: test/command/suite/sharding/logical_range_filter/filter/match/reference_vector/select.test (+59 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/sharding/logical_range_filter/filter/match/reference_vector/select.test 2015-07-15 18:31:37 +0900 (1c8b657) @@ -0,0 +1,59 @@ +#@on-error omit +plugin_register sharding +#@on-error default + +table_create Users TABLE_PAT_KEY ShortText +column_create Users tags COLUMN_VECTOR ShortText + +table_create Tags TABLE_PAT_KEY ShortText +column_create Tags users COLUMN_INDEX Users tags + +table_create Logs_20150205 TABLE_NO_KEY +column_create Logs_20150205 timestamp COLUMN_SCALAR Time +column_create Logs_20150205 memo COLUMN_SCALAR ShortText +column_create Logs_20150205 user COLUMN_SCALAR Users + +table_create Timestamp_20150205 TABLE_PAT_KEY Time +column_create Timestamp_20150205 index COLUMN_INDEX Logs_20150205 timestamp + +column_create Users index_20150205 COLUMN_INDEX Logs_20150205 user + +load --table Users +[ +{"_key": "alice", "tags": ["student", "programming", "search"]}, +{"_key": "bob", "tags": ["worker", "programming"]}, +{"_key": "carlos", "tags": ["programming"]}, +{"_key": "david", "tags": ["search", "worker"]} +] + +load --table Logs_20150205 +[ +{ + "timestamp": "2015-02-05 13:49:00", + "memo": "2015-02-05 13:49:00", + "user": "alice" +}, +{ + "timestamp": "2015-02-05 13:50:00", + "memo": "2015-02-05 13:50:00", + "user": "bob" +}, +{ + "timestamp": "2015-02-05 13:51:00", + "memo": "2015-02-05 13:51:00", + "user": "carlos" +}, +{ + "timestamp": "2015-02-05 13:52:00", + "memo": "2015-02-05 13:52:00", + "user": "david" +} +] + +#@add-important-log-levels debug +log_level --level debug +logical_range_filter Logs timestamp \ + --limit -1 \ + --filter 'user.tags @ "search"' +log_level --level notice +#@remove-important-log-levels debug -------------- next part -------------- HTML����������������������������...Download