[Groonga-commit] groonga/groonga at 32783a4 [master] expr optimize: add support for assign operations

Back to archive index
Kouhei Sutou null+****@clear*****
Mon Mar 4 17:59:33 JST 2019


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>


More information about the Groonga-commit mailing list
Back to archive index