[Groonga-commit] groonga/groonga at 63bdb36 [master] expression_rewriter: add optimize rewriter

Back to archive index

Kouhei Sutou null+****@clear*****
Wed Oct 7 18:53:06 JST 2015


Kouhei Sutou	2015-10-07 18:53:06 +0900 (Wed, 07 Oct 2015)

  New Revision: 63bdb36451af466fa3ef99d428181be53e69be78
  https://github.com/groonga/groonga/commit/63bdb36451af466fa3ef99d428181be53e69be78

  Message:
    expression_rewriter: add optimize rewriter
    
    It just supports between() optimization for now.

  Added files:
    plugins/expression_rewriters/optimize.rb
    test/mruby/suite/expression_rewriter/test_between.rb

  Added: plugins/expression_rewriters/optimize.rb (+38 -0) 100644
===================================================================
--- /dev/null
+++ plugins/expression_rewriters/optimize.rb    2015-10-07 18:53:06 +0900 (05e0fde)
@@ -0,0 +1,38 @@
+module Groonga
+  module ExpressionRewriters
+    class Opitmize < ExpressionRewriter
+      register "optimize"
+
+      def rewrite
+        codes =****@expre*****
+        n_codes = codes.size
+
+        # (A >= x && A < y) -> between(A, x, "include", y, "exclude")
+        return nil if n_codes != 7
+
+        return nil if codes[6].op != Operator::AND
+
+        return nil if codes[0].op != Operator::GET_VALUE
+        return nil if codes[1].op != Operator::PUSH
+        return nil if codes[2].op != Operator::GREATER_EQUAL
+
+        return nil if codes[3].op != Operator::GET_VALUE
+        return nil if codes[4].op != Operator::PUSH
+        return nil if codes[5].op != Operator::LESS
+
+        return nil if codes[3].value != codes[0].value
+
+        variable =****@expre*****_var_by_offset(0)
+        rewritten = Expression.create(context[variable.domain])
+        rewritten.append_object(Context.instance["between"], Operator::PUSH, 1)
+        rewritten.append_object(codes[0].value, Operator::GET_VALUE, 1)
+        rewritten.append_constant(codes[1].value.value, Operator::PUSH, 1)
+        rewritten.append_constant("include", Operator::PUSH, 1)
+        rewritten.append_constant(codes[4].value.value, Operator::PUSH, 1)
+        rewritten.append_constant("exclude", Operator::PUSH, 1)
+        rewritten.append_operator(Operator::CALL, 5)
+        rewritten
+      end
+    end
+  end
+end

  Added: test/mruby/suite/expression_rewriter/test_between.rb (+43 -0) 100644
===================================================================
--- /dev/null
+++ test/mruby/suite/expression_rewriter/test_between.rb    2015-10-07 18:53:06 +0900 (1f7df83)
@@ -0,0 +1,43 @@
+class TestBetween < ExpressionRewriterTestCase
+  def setup
+    Groonga::Schema.define do |schema|
+      schema.create_table("rewriters",
+                          :type => :hash,
+                          :key_type => :short_text) do |table|
+        table.text("plugin_name")
+      end
+
+      schema.create_table("Logs") do |table|
+        table.time("timestamp")
+      end
+    end
+
+    @rewriters = Groonga["rewriters"]
+    @rewriters.add("optimize", :plugin_name => "expression_rewriters/optimize")
+
+    @logs = Groonga["Logs"]
+    setup_expression(@logs)
+  end
+
+  def teardown
+    teardown_expression
+  end
+
+  def test_optimizable
+    code =
+      "timestamp >= '2015-10-01 00:00:00' && " +
+      "timestamp <  '2015-11-00 00:00:00'"
+    assert_equal(<<-DUMP, dump_rewritten_plan(code))
+[0]
+  op:         <call>
+  logical_op: <or>
+  args[0]:    <#<proc:function between arguments:[]>>
+  args[1]:    <#<column:fix_size Logs.timestamp range:Time type:scalar compress:none>>
+  args[2]:    <"2015-10-01 00:00:00">
+  args[3]:    <"include">
+  args[4]:    <"2015-11-00 00:00:00">
+  args[5]:    <"exclude">
+  expr:       <0..6>
+    DUMP
+  end
+end
-------------- next part --------------
HTML����������������������������...
Download 



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