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����������������������������... 下載