[Groonga-commit] groonga/groonga at 5023687 [master] Add test mechanism for query optimizer

Back to archive index

Kouhei Sutou null+****@clear*****
Mon Nov 3 16:29:12 JST 2014


Kouhei Sutou	2014-11-03 16:29:12 +0900 (Mon, 03 Nov 2014)

  New Revision: 50236879bb2f87397abda14ca82bbba346096145
  https://github.com/groonga/groonga/commit/50236879bb2f87397abda14ca82bbba346096145

  Message:
    Add test mechanism for query optimizer
    
    It is based on Rroonga.

  Added files:
    test/query_optimizer/helper.rb
    test/query_optimizer/helper/query_optimizer.rb
    test/query_optimizer/helper/sandbox.rb
    test/query_optimizer/rroonga
    test/query_optimizer/run-test.rb
    test/query_optimizer/suite/test_index.rb
    test/query_optimizer/suite/test_no_index.rb
  Modified files:
    .gitignore
    .gitmodules

  Modified: .gitignore (+2 -0)
===================================================================
--- .gitignore    2014-11-03 15:27:14 +0900 (ed85e48)
+++ .gitignore    2014-11-03 16:29:12 +0900 (0467e77)
@@ -161,5 +161,7 @@ cmake_install.cmake
 /test/command/run-test.sh.log
 /test/command/run-test.sh.trs
 /test/command/test-suite.log
+/test/query_optimizer/rroonga.built
+/test/query_optimizer/groonga.pc
 /*.tar.gz
 /tmp

  Modified: .gitmodules (+3 -0)
===================================================================
--- .gitmodules    2014-11-03 15:27:14 +0900 (3ea587a)
+++ .gitmodules    2014-11-03 16:29:12 +0900 (d43a86e)
@@ -4,3 +4,6 @@
 [submodule "vendor/onigmo-source"]
 	path = vendor/onigmo-source
 	url = https://github.com/k-takata/Onigmo.git
+[submodule "test/query_optimizer/rroonga"]
+	path = test/query_optimizer/rroonga
+	url = https://github.com/ranguba/rroonga.git

  Added: test/query_optimizer/helper.rb (+17 -0) 100644
===================================================================
--- /dev/null
+++ test/query_optimizer/helper.rb    2014-11-03 16:29:12 +0900 (c54f9e9)
@@ -0,0 +1,17 @@
+require "fileutils"
+
+require "test-unit"
+
+require_relative "helper/sandbox"
+require_relative "helper/query_optimizer"
+
+class GroongaTestCase < Test::Unit::TestCase
+  include Sandbox
+
+  setup :setup_sandbox, :before => :prepend
+  teardown :teardown_sandbox, :after => :append
+end
+
+class QueryOptimizerTestCase < GroongaTestCase
+  include QueryOptimizer
+end

  Added: test/query_optimizer/helper/query_optimizer.rb (+15 -0) 100644
===================================================================
--- /dev/null
+++ test/query_optimizer/helper/query_optimizer.rb    2014-11-03 16:29:12 +0900 (034717a)
@@ -0,0 +1,15 @@
+module QueryOptimizer
+  def create_expression(domain)
+    expression = Groonga::Expression.new
+    expression.define_variable(:domain => domain)
+    expression
+  end
+
+  def dump_plan(expression, text, options={})
+    default_options = {
+      :syntax => :script,
+    }
+    expression.parse(text, default_options.merge(options))
+    expression.dump_plan
+  end
+end

  Added: test/query_optimizer/helper/sandbox.rb (+106 -0) 100644
===================================================================
--- /dev/null
+++ test/query_optimizer/helper/sandbox.rb    2014-11-03 16:29:12 +0900 (07b26f9)
@@ -0,0 +1,106 @@
+module Sandbox
+  private
+  def setup_sandbox
+    setup_tmp_directory
+    setup_log_path
+
+    setup_encoding
+    setup_context
+
+    setup_database
+  end
+
+  def setup_tmp_directory
+    @base_tmp_dir = Pathname(File.dirname(__FILE__)) + "tmp"
+    memory_file_system = "/run/shm"
+    if File.exist?(memory_file_system)
+      FileUtils.mkdir_p(@base_tmp_dir.parent.to_s)
+      FileUtils.rm_f(@base_tmp_dir.to_s)
+      FileUtils.ln_s(memory_file_system, @base_tmp_dir.to_s)
+    else
+      FileUtils.mkdir_p(@base_tmp_dir.to_s)
+    end
+
+    @tmp_dir = @base_tmp_dir + "groonga-query-optimizer"
+    FileUtils.rm_rf(@tmp_dir.to_s)
+    FileUtils.mkdir_p(@tmp_dir.to_s)
+  end
+
+  def setup_log_path
+    @dump_log = false
+
+    @log_path = @tmp_dir + "groonga.log"
+    logger = Groonga::FileLogger.new(@log_path.to_s)
+    Groonga::Logger.register(logger)
+
+    @query_log_path = @tmp_dir + "groonga-query.log"
+    query_logger = Groonga::FileQueryLogger.new(@query_log_path.to_s)
+    Groonga::QueryLogger.register(query_logger, :all => true)
+  end
+
+  def setup_encoding
+    Groonga::Encoding.default = nil
+  end
+
+  def setup_context
+    Groonga::Context.default = nil
+    Groonga::Context.default_options = nil
+  end
+
+  def context
+    Groonga::Context.default
+  end
+
+  def encoding
+    Groonga::Encoding.default
+  end
+
+  def setup_logger
+    Groonga::Logger.register(:level => :dump) do |level, time, title, message, location|
+      p [level, time, title, message, location]
+    end
+  end
+
+  def setup_database
+    name_for_path = name.gsub(/[\(\)\[\] ]/, "-")
+    @database_path = @tmp_dir + "#{name_for_path}.db"
+    @database = Groonga::Database.create(:path => @database_path.to_s)
+  end
+
+  def teardown_database
+    return if****@datab*****?
+
+    @database.close
+    @database = nil
+  end
+
+  def teardown_sandbox
+    teardown_database
+    Groonga::Context.default.close
+    Groonga::Context.default = nil
+    teardown_log_path
+    teardown_tmp_directory
+  end
+
+  def teardown_log_path
+    return unless @dump_log
+    log_path = Groonga::Logger.log_path
+    if File.exist?(log_path)
+      header = "--- log: #{log_path} ---"
+      puts(header)
+      puts(File.read(log_path))
+      puts("-" * header.length)
+    end
+    if @query_log_path.exist?
+      header = "--- query log: #{@query_log_path} ---"
+      puts(header)
+      puts(@query_log_path.read)
+      puts("-" * header.length)
+    end
+  end
+
+  def teardown_tmp_directory
+    FileUtils.rm_rf(@tmp_dir.to_s)
+    FileUtils.rm_rf(@base_tmp_dir.to_s)
+  end
+end

  Added: test/query_optimizer/rroonga (+1 -0) 160000
===================================================================
--- /dev/null
+++ test/query_optimizer/rroonga    2014-11-03 16:29:12 +0900 (adc99d0)
@@ -0,0 +1 @@
+Subproject commit adc99d03a7d7200ad00278176d2c8f730a742d30

  Added: test/query_optimizer/run-test.rb (+61 -0) 100755
===================================================================
--- /dev/null
+++ test/query_optimizer/run-test.rb    2014-11-03 16:29:12 +0900 (93eb6b9)
@@ -0,0 +1,61 @@
+#!/usr/bin/env ruby
+
+require "rbconfig"
+require "pathname"
+require "fileutils"
+
+current_dir_path    = Pathname.pwd
+base_dir_path       = Pathname(__FILE__).dirname
+source_top_dir_path = base_dir_path.parent.parent
+build_top_dir_path  = current_dir_path
+build_base_dir_path = build_top_dir_path + "test/query_optimizer"
+
+rroonga_built_revision_path = build_base_dir_path + "rroonga.built"
+rroonga_built_revision = nil
+if rroonga_built_revision_path.exist?
+  rroonga_built_revision = rroonga_built_revision_path.read
+end
+
+rroonga_dir_path = build_base_dir_path + "rroonga"
+rroonga_revision = Dir.chdir(rroonga_dir_path) do
+  `git describe`
+end
+if rroonga_revision != rroonga_built_revision
+  groonga_pc_path = build_base_dir_path + "groonga.pc"
+  groonga_pc_path.open("w") do |groonga_pc|
+    content = (build_top_dir_path + "groonga.pc").read
+    content = content.gsub(/^Libs: .*$/) do
+      lib_dir = "#{build_top_dir_path}/lib/.libs"
+      "Libs: -L#{lib_dir} -Wl,-rpath,#{lib_dir} -lgroonga"
+    end
+    content = content.gsub(/^Cflags: .*$/) do
+      "Cflags: -I#{build_top_dir_path}/include"
+    end
+    groonga_pc.puts(content)
+  end
+  pkg_config_path = (ENV["PKG_CONFIG_PATH"] || "").split(File::PATH_SEPARATOR)
+  pkg_config_path.unshift(groonga_pc_path.dirname.to_s)
+  ENV["PKG_CONFIG_PATH"] = pkg_config_path.join(File::PATH_SEPARATOR)
+  Dir.chdir(rroonga_dir_path.to_s) do
+    system("make", "clean") if File.exist?("Makefile")
+    system(RbConfig.ruby,
+           "extconf.rb",
+           "--enable-debug-build")
+    system("make", "-j")
+  end
+  rroonga_built_revision_path.open("w") do |file|
+    file.print(rroonga_revision)
+  end
+end
+
+ENV["GRN_PLUGINS_DIR"] = (build_top_dir_path + "plugins").to_s
+ENV["GRN_RUBY_SCRIPTS_DIR"] = (build_top_dir_path + "lib/mrb/scripts").to_s
+
+$LOAD_PATH.unshift((rroonga_dir_path + "ext" + "groonga").to_s)
+$LOAD_PATH.unshift((rroonga_dir_path + "lib").to_s)
+
+require "groonga"
+
+require_relative "helper"
+
+exit(Test::Unit::AutoRunner.run(true, (base_dir_path + "suite").to_s))

  Added: test/query_optimizer/suite/test_index.rb (+33 -0) 100644
===================================================================
--- /dev/null
+++ test/query_optimizer/suite/test_index.rb    2014-11-03 16:29:12 +0900 (51fc3bd)
@@ -0,0 +1,33 @@
+class TestIndex < QueryOptimizerTestCase
+  def setup
+    Groonga::Schema.define do |schema|
+      schema.create_table("Logs") do |table|
+        table.text("message")
+      end
+
+      schema.create_table("Terms",
+                          :type => :patricia_trie,
+                          :default_tokenizer => "TokenBigram",
+                          :normalizer => "NormalizerAuto") do |table|
+        table.index("Logs", "message")
+      end
+    end
+
+    @logs = Groonga["Logs"]
+    @expression = create_expression(@logs)
+  end
+
+  def teardown
+    @expression.close
+  end
+
+  def test_match
+    assert_equal(<<-DUMP, dump_plan(@expression, "message @ 'Groonga'"))
+[0]
+  op:         <match>
+  logical_op: <or>
+  query:      <"Groonga">
+  expr:       <0..2>
+    DUMP
+  end
+end

  Added: test/query_optimizer/suite/test_no_index.rb (+22 -0) 100644
===================================================================
--- /dev/null
+++ test/query_optimizer/suite/test_no_index.rb    2014-11-03 16:29:12 +0900 (522f3aa)
@@ -0,0 +1,22 @@
+class TestNoIndex < QueryOptimizerTestCase
+  def setup
+    Groonga::Schema.define do |schema|
+      schema.create_table("Logs") do |table|
+        table.text("message")
+      end
+    end
+
+    @logs = Groonga["Logs"]
+    @expression = create_expression(@logs)
+  end
+
+  def teardown
+    @expression.close
+  end
+
+  def test_plus
+    assert_equal(<<-DUMP, dump_plan(@expression, "1 + 1"))
+sequential search
+    DUMP
+  end
+end
-------------- next part --------------
HTML����������������������������...
下載 



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