Yasuhiro Horimoto 2019-03-20 16:52:53 +0900 (Wed, 20 Mar 2019) Revision: da2f603b20124be3f4f9fec8a76e211c02ceec79 https://github.com/groonga/groonga-command/commit/da2f603b20124be3f4f9fec8a76e211c02ceec79 Message: Add Base#to_elasticsearch_format (#10) * Add Base#to_elasticsearch_format This commit convert Groonga's dump format to Elasticsearch's import format. * Fix a indent * Reduce calling JSON.parse(value) * Reduce escapes * Add option for determine elasticsearch version Because the Elasticsearch handles to _type to differ depending on version. * Remove needless clause * Use parameterized test * Remove needless require * Use more suitable method name * Remove needless define of a variable * Use "{}" literal instead of "Hash.new" * Set a provide the default version when a user doesn't specify the elasticsearch_version option * Use more readable code for Hash literal * Use more suitable a name of variable * Simplify * Use more meaningful name * Simplify * Simplify * Reduce scope * Use more meaningful initial value * Simplify * Simplify * Simplify * Simplify * Use more readable code * Use whitespace as word separator * Add a whitespace around "=>" * Modify that doesn't change an expected value in a test * Use normal test style * Add an empty line between license header and code * Remove needless initialize * Fix a indent Added files: lib/groonga/command/format/elasticsearch.rb Modified files: lib/groonga/command/base.rb test/command/test-base.rb Modified: lib/groonga/command/base.rb (+7 -0) =================================================================== --- lib/groonga/command/base.rb 2019-03-19 14:07:42 +0900 (96e2ca3) +++ lib/groonga/command/base.rb 2019-03-20 16:52:53 +0900 (eb4185c) @@ -1,4 +1,5 @@ # Copyright (C) 2012-2017 Kouhei Sutou <kou****@clear*****> +# Copyright (C) 2019 Yasuhiro Horimoto <horim****@clear*****> # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,6 +17,7 @@ require "groonga/command/format/uri" require "groonga/command/format/command" +require "groonga/command/format/elasticsearch" module Groonga module Command @@ -153,6 +155,11 @@ module Groonga format.command_line(options) end + def to_elasticsearch_format(options={}) + format = Format::Elasticsearch.new(@command_name, normalized_arguments) + format.json(options) + end + def to_s if uri_format? to_uri_format Added: lib/groonga/command/format/elasticsearch.rb (+90 -0) 100644 =================================================================== --- /dev/null +++ lib/groonga/command/format/elasticsearch.rb 2019-03-20 16:52:53 +0900 (f72e1e2) @@ -0,0 +1,90 @@ +# Copyright (C) 2019 Yasuhiro Horimoto <horim****@clear*****> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +module Groonga + module Command + module Format + class Elasticsearch + def initialize(name, arguments) + @name = name + @arguments = arguments + end + + def json(options={}) + return nil unless @name == "load" + + components = [] + elasticsearch_version = options[:version] || 5 + + sorted_arguments =****@argum*****_by(&:first) + sorted_arguments.each do |name, value| + case name + when :table + case elasticsearch_version + when 7 + header = { + "index" => { + "_index" => value.downcase, + "_type"=>"_doc", + } + } + when 8 + header = { + "index" => { + "_index" => value.downcase, + } + } + else + # Version 5.x or 6.x + header = { + "index" => { + "_index" => value.downcase, + "_type" => "groonga", + } + } + end + components << JSON.generate(header) + when :values + body = {} + record = JSON.parse(value) + + if record[0].is_a?(::Array) + column_names = nil + + record.each do |load_value| + if column_names.nil? + column_names = load_value + next + end + column_values = load_value + column_names.zip(column_values) do |column_name, column_value| + body[column_name] = column_value + end + components << JSON.generate(body) + end + else + record.each do |load_value| + components << JSON.generate(load_value) + end + end + end + end + components.join("\n") + end + end + end + end +end Modified: test/command/test-base.rb (+132 -0) =================================================================== --- test/command/test-base.rb 2019-03-19 14:07:42 +0900 (c021f82) +++ test/command/test-base.rb 2019-03-20 16:52:53 +0900 (ba50092) @@ -122,6 +122,138 @@ select \\ end end + class CovnertToElasticsearchFormatTest < self + sub_test_case("non target command") do + def test_select_command + select = Groonga::Command::Base.new("select", + :table => "Users", + :filter => "age<=30", + :output_type => "json") + assert_equal(nil, + select.to_elasticsearch_format) + end + end + + sub_test_case("single record") do + def test_brackets_format + load = Groonga::Command::Base.new("load", + :table => "Site", + :values => <<-VALUES) + [ + ["_key","title"], + ["http://example.org/","This is test record 1!"] + ] + VALUES + + expected = <<-OUTPUT.chomp +{"index":{"_index":"site","_type":"groonga"}} +{"_key":"http://example.org/","title":"This is test record 1!"} + OUTPUT + + assert_equal(expected, load.to_elasticsearch_format) + end + + def test_curly_brackets_format + load = Groonga::Command::Base.new("load", + :table => "Site", + :values => <<-VALUES) + [ + {"_key": "http://example.org/", "title": "This is test record 1!"} + ] + VALUES + + expected = <<-OUTPUT.chomp +{"index":{"_index":"site","_type":"groonga"}} +{"_key":"http://example.org/","title":"This is test record 1!"} + OUTPUT + + assert_equal(expected, load.to_elasticsearch_format) + end + end + + sub_test_case("multiple records") do + def test_brackets_format + load = Groonga::Command::Base.new("load", + :table => "Site", + :values => <<-VALUES) + [ + ["_key","title"], + ["http://example.org/","This is test record 1!"], + ["http://example.net/","This is test record 2!"] + ] + VALUES + + expected = <<-OUTPUT.chomp +{"index":{"_index":"site","_type":"groonga"}} +{"_key":"http://example.org/","title":"This is test record 1!"} +{"_key":"http://example.net/","title":"This is test record 2!"} + OUTPUT + + assert_equal(expected, load.to_elasticsearch_format) + end + + def test_curly_brackets_format + load = Groonga::Command::Base.new("load", + :table => "Site", + :values => <<-VALUES) + [ + {"_key": "http://example.org/", "title": "This is test record 1!"}, + {"_key": "http://example.net/", "title": "This is test record 2!"} + ] + VALUES + + expected = <<-OUTPUT.chomp +{"index":{"_index":"site","_type":"groonga"}} +{"_key":"http://example.org/","title":"This is test record 1!"} +{"_key":"http://example.net/","title":"This is test record 2!"} + OUTPUT + + assert_equal(expected, load.to_elasticsearch_format) + end + end + + def setup + @load = Groonga::Command::Base.new("load", + :table => "Site", + :values => <<-VALUES) +[ +["_key","title"], +["http://example.org/","This is test record 1!"] +] + VALUES + end + + sub_test_case(":version") do + def test_5 + assert_equal(<<-REQUESTS.chomp, @load.to_elasticsearch_format(:version => 5)) +{"index":{"_index":"site","_type":"groonga"}} +{"_key":"http://example.org/","title":"This is test record 1!"} + REQUESTS + end + + def test_6 + assert_equal(<<-REQUESTS.chomp, @load.to_elasticsearch_format(:version => 6)) +{"index":{"_index":"site","_type":"groonga"}} +{"_key":"http://example.org/","title":"This is test record 1!"} + REQUESTS + end + + def test_7 + assert_equal(<<-REQUESTS.chomp, @load.to_elasticsearch_format(:version => 7)) +{"index":{"_index":"site","_type":"_doc"}} +{"_key":"http://example.org/","title":"This is test record 1!"} + REQUESTS + end + + def test_8 + assert_equal(<<-REQUESTS.chomp, @load.to_elasticsearch_format(:version => 8)) +{"index":{"_index":"site"}} +{"_key":"http://example.org/","title":"This is test record 1!"} + REQUESTS + end + end + end + sub_test_case("#to_s") do def setup @table = "Users" -------------- next part -------------- An HTML attachment was scrubbed... URL: <https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20190320/d1d8b6d5/attachment-0001.html>