[Groonga-commit] groonga/groonga at 89776fa [master] expr optimize: "const OP var" is available only when OP is swappable

Back to archive index
Kouhei Sutou null+****@clear*****
Mon Mar 4 12:13:31 JST 2019


Kouhei Sutou	2019-03-04 12:13:31 +0900 (Mon, 04 Mar 2019)

  Revision: 89776fadadda5ebd33e5cc7b3d8c165cd2ddd33f
  https://github.com/groonga/groonga/commit/89776fadadda5ebd33e5cc7b3d8c165cd2ddd33f

  Message:
    expr optimize: "const OP var" is available only when OP is swappable
    
    For example, "==" is a swappable OP.

  Modified files:
    lib/mrb/scripts/expression_rewriters/optimizer.rb

  Modified: lib/mrb/scripts/expression_rewriters/optimizer.rb (+25 -8)
===================================================================
--- lib/mrb/scripts/expression_rewriters/optimizer.rb    2019-03-04 11:59:16 +0900 (fcf0982de)
+++ lib/mrb/scripts/expression_rewriters/optimizer.rb    2019-03-04 12:13:31 +0900 (07c92514f)
@@ -34,22 +34,39 @@ module Groonga
           ExpressionTree::LogicalOperation.new(node.operator,
                                                optimized_sub_nodes)
         when ExpressionTree::BinaryOperation
-          optimized_left = optimize_node(table, node.left)
-          optimized_right = optimize_node(table, node.right)
+          optimize_binary_operation_node(table, node)
+        else
+          node
+        end
+      end
+
+      def optimize_binary_operation_node(table, node)
+        optimized_left = optimize_node(table, node.left)
+        optimized_right = optimize_node(table, node.right)
+        if node.option
+          optimized_option = optimize_node(table, node.option)
+        else
+          optimized_option = nil
+        end
+        case node.operator
+        when Operator::EQUAL
           if optimized_left.is_a?(ExpressionTree::Constant) and
-              optimized_right.is_a?(ExpressionTree::Variable)
+            optimized_right.is_a?(ExpressionTree::Variable)
             ExpressionTree::BinaryOperation.new(node.operator,
                                                 optimized_right,
-                                                optimized_left)
-          elsif node.left == optimized_left and node.right == optimized_right
-            node
+                                                optimized_left,
+                                                optimized_option)
           else
             ExpressionTree::BinaryOperation.new(node.operator,
                                                 optimized_left,
-                                                optimized_right)
+                                                optimized_right,
+                                                optimized_option)
           end
         else
-          node
+          ExpressionTree::BinaryOperation.new(node.operator,
+                                              optimized_left,
+                                              optimized_right,
+                                              optimized_option)
         end
       end
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20190304/fe307681/attachment-0001.html>


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