Kouhei Sutou 2019-03-04 17:59:33 +0900 (Mon, 04 Mar 2019) Revision: 32783a4242b682f18f266d455b63deb16672f393 https://github.com/groonga/groonga/commit/32783a4242b682f18f266d455b63deb16672f393 Message: expr optimize: add support for assign operations Copied files: lib/mrb/scripts/expression_tree/assign_binary_operation.rb (from lib/mrb/scripts/expression_tree/assign.rb) Modified files: lib/mrb/scripts/expression_rewriters/optimizer.rb lib/mrb/scripts/expression_tree.rb lib/mrb/scripts/expression_tree/assign.rb lib/mrb/scripts/expression_tree/binary_operation.rb lib/mrb/scripts/expression_tree/constant.rb lib/mrb/scripts/expression_tree/function_call.rb lib/mrb/scripts/expression_tree/logical_operation.rb lib/mrb/scripts/expression_tree/sources.am lib/mrb/scripts/expression_tree/unary_operation.rb lib/mrb/scripts/expression_tree/variable.rb lib/mrb/scripts/expression_tree_builder.rb Modified: lib/mrb/scripts/expression_rewriters/optimizer.rb (+2 -0) =================================================================== --- lib/mrb/scripts/expression_rewriters/optimizer.rb 2019-03-04 17:25:06 +0900 (6417d4bbd) +++ lib/mrb/scripts/expression_rewriters/optimizer.rb 2019-03-04 17:59:33 +0900 (9435b01ee) @@ -139,6 +139,8 @@ module Groonga end def optimize_and_sub_nodes(table, sub_nodes) + return sub_nodes unless sub_nodes.all?(&:estimatable?) + grouped_sub_nodes = group_nodes(sub_nodes) optimized_nodes = [] Modified: lib/mrb/scripts/expression_tree.rb (+1 -0) =================================================================== --- lib/mrb/scripts/expression_tree.rb 2019-03-04 17:25:06 +0900 (fbb4898ff) +++ lib/mrb/scripts/expression_tree.rb 2019-03-04 17:59:33 +0900 (fcf21cc69) @@ -1,5 +1,6 @@ require "expression_tree/accessor" require "expression_tree/assign" +require "expression_tree/assign_binary_operation" require "expression_tree/binary_operation" require "expression_tree/constant" require "expression_tree/function_call" Modified: lib/mrb/scripts/expression_tree/assign.rb (+4 -0) =================================================================== --- lib/mrb/scripts/expression_tree/assign.rb 2019-03-04 17:25:06 +0900 (beb43dec5) +++ lib/mrb/scripts/expression_tree/assign.rb 2019-03-04 17:59:33 +0900 (3a6ec334b) @@ -13,6 +13,10 @@ module Groonga @value.build(expression) expression.append_operator(Operator::ASSIGN, 2) end + + def estimatable? + false + end end end end Copied: lib/mrb/scripts/expression_tree/assign_binary_operation.rb (+9 -3) 54% =================================================================== --- lib/mrb/scripts/expression_tree/assign.rb 2019-03-04 17:25:06 +0900 (beb43dec5) +++ lib/mrb/scripts/expression_tree/assign_binary_operation.rb 2019-03-04 17:59:33 +0900 (ce0507adb) @@ -1,9 +1,11 @@ module Groonga module ExpressionTree - class Assign + class AssignBinaryOperation + attr_reader :operator attr_reader :variable attr_reader :value - def initialize(variable, value) + def initialize(operator, variable, value) + @operator = operator @variable = variable @value = value end @@ -11,7 +13,11 @@ module Groonga def build(expression) @variable.build(expression) @value.build(expression) - expression.append_operator(Operator::ASSIGN, 2) + expression.append_operator(@operator, 2) + end + + def estimatable? + false end end end Modified: lib/mrb/scripts/expression_tree/binary_operation.rb (+4 -0) =================================================================== --- lib/mrb/scripts/expression_tree/binary_operation.rb 2019-03-04 17:25:06 +0900 (dab59341c) +++ lib/mrb/scripts/expression_tree/binary_operation.rb 2019-03-04 17:59:33 +0900 (3431e9821) @@ -29,6 +29,10 @@ module Groonga end end + def estimatable? + true + end + RANGE_OPERATORS = [ Operator::LESS, Operator::GREATER, Modified: lib/mrb/scripts/expression_tree/constant.rb (+4 -0) =================================================================== --- lib/mrb/scripts/expression_tree/constant.rb 2019-03-04 17:25:06 +0900 (228a1fc84) +++ lib/mrb/scripts/expression_tree/constant.rb 2019-03-04 17:59:33 +0900 (626bb332e) @@ -10,6 +10,10 @@ module Groonga expression.append_constant(@value, Operator::PUSH, 1) end + def estimatable? + true + end + def estimate_size(table) if Bulk.true?(@value) table.size Modified: lib/mrb/scripts/expression_tree/function_call.rb (+4 -0) =================================================================== --- lib/mrb/scripts/expression_tree/function_call.rb 2019-03-04 17:25:06 +0900 (0c7438d67) +++ lib/mrb/scripts/expression_tree/function_call.rb 2019-03-04 17:59:33 +0900 (23c04b6f6) @@ -16,6 +16,10 @@ module Groonga expression.append_operator(Operator::CALL, @arguments.size) end + def estimatable? + true + end + def estimate_size(table) return table.size unles****@proce***** == "between" Modified: lib/mrb/scripts/expression_tree/logical_operation.rb (+6 -0) =================================================================== --- lib/mrb/scripts/expression_tree/logical_operation.rb 2019-03-04 17:25:06 +0900 (e8d494f89) +++ lib/mrb/scripts/expression_tree/logical_operation.rb 2019-03-04 17:59:33 +0900 (788a7aef9) @@ -15,6 +15,12 @@ module Groonga end end + def estimatable? + @nodes.all? do |node| + node.estimatable? + end + end + def estimate_size(table) estimated_sizes =****@nodes***** do |node| node.estimate_size(table) Modified: lib/mrb/scripts/expression_tree/sources.am (+1 -0) =================================================================== --- lib/mrb/scripts/expression_tree/sources.am 2019-03-04 17:25:06 +0900 (54a318634) +++ lib/mrb/scripts/expression_tree/sources.am 2019-03-04 17:59:33 +0900 (46caed209) @@ -1,6 +1,7 @@ RUBY_SCRIPT_FILES = \ accessor.rb \ assign.rb \ + assign_binary_operation.rb \ binary_operation.rb \ constant.rb \ function_call.rb \ Modified: lib/mrb/scripts/expression_tree/unary_operation.rb (+4 -0) =================================================================== --- lib/mrb/scripts/expression_tree/unary_operation.rb 2019-03-04 17:25:06 +0900 (dacb8ae30) +++ lib/mrb/scripts/expression_tree/unary_operation.rb 2019-03-04 17:59:33 +0900 (9162301ac) @@ -13,6 +13,10 @@ module Groonga expression.append_operator(@operator, 1) end + def estimatable? + true + end + def estimate_size(table) # TODO table.size Modified: lib/mrb/scripts/expression_tree/variable.rb (+4 -0) =================================================================== --- lib/mrb/scripts/expression_tree/variable.rb 2019-03-04 17:25:06 +0900 (e99ad9a83) +++ lib/mrb/scripts/expression_tree/variable.rb 2019-03-04 17:59:33 +0900 (f4cd34ba2) @@ -10,6 +10,10 @@ module Groonga expression.append_object(@column, Operator::GET_VALUE, 1) end + def estimatable? + true + end + def estimate_size(table) table.size end Modified: lib/mrb/scripts/expression_tree_builder.rb (+27 -0) =================================================================== --- lib/mrb/scripts/expression_tree_builder.rb 2019-03-04 17:25:06 +0900 (02285d761) +++ lib/mrb/scripts/expression_tree_builder.rb 2019-03-04 17:59:33 +0900 (021842c2a) @@ -34,6 +34,7 @@ module Groonga Operator::PLUS, Operator::MINUS, Operator::STAR, + Operator::SLASH, Operator::MOD, ] @@ -47,6 +48,25 @@ module Groonga UNARY_OPERATIONS = [ Operator::NOT, Operator::BITWISE_NOT, + Operator::MINUS, + Operator::INCR, + Operator::DECR, + Operator::INCR_POST, + Operator::DECR_POST, + ] + + ASSIGN_ARITHMETIC_OPERATIONS = [ + Operator::STAR_ASSIGN, + Operator::SLASH_ASSIGN, + Operator::MOD_ASSIGN, + Operator::PLUS_ASSIGN, + Operator::MINUS_ASSIGN, + Operator::SHIFTL_ASSIGN, + Operator::SHIFTR_ASSIGN, + Operator::SHIFTRR_ASSIGN, + Operator::AND_ASSIGN, + Operator::XOR_ASSIGN, + Operator::OR_ASSIGN, ] def initialize(expression) @@ -81,6 +101,13 @@ module Groonga value = stack.pop node = ExpressionTree::UnaryOperation.new(code.op, value) stack.push(node) + when *ASSIGN_ARITHMETIC_OPERATIONS + value = stack.pop + variable = stack.pop + node = ExpressionTree::AssignBinaryOperation.new(code.op, + variable, + value) + stack.push(node) when Operator::GET_REF node = ExpressionTree::Reference.new(code.value) stack.push(node) -------------- next part -------------- An HTML attachment was scrubbed... URL: <https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20190304/956729cd/attachment-0001.html>