Kouhei Sutou
null+****@clear*****
Tue Nov 27 23:12:26 JST 2012
Kouhei Sutou 2012-11-27 23:12:26 +0900 (Tue, 27 Nov 2012) New Revision: f9698ce2998c404e81262da2516edc767cad3bf4 https://github.com/groonga/groonga-command/commit/f9698ce2998c404e81262da2516edc767cad3bf4 Log: Support load header Modified files: lib/groonga/command/parser.rb test/test-parser.rb Modified: lib/groonga/command/parser.rb (+26 -2) =================================================================== --- lib/groonga/command/parser.rb 2012-11-27 23:05:55 +0900 (d72b2b7) +++ lib/groonga/command/parser.rb 2012-11-27 23:12:26 +0900 (f74cd5a) @@ -88,6 +88,9 @@ module Groonga parser.on_load_start do |command| yield(:on_load_start, command) end + parser.on_load_header do |command, header| + yield(:on_load_header, command, header) + end parser.on_load_value do |command, value| yield(:on_load_value, command, value) end @@ -174,6 +177,16 @@ module Groonga end end + # @overload on_load_header(command) + # @overload on_load_header {|command| } + def on_load_header(*arguments, &block) + if block_given? + @on_load_header_hook = block + else + @on_load_header_hook.call(*arguments) if @on_load_header_hook + end + end + # @overload on_load_value(command) # @overload on_load_value {|command| } def on_load_value(*arguments, &block) @@ -266,8 +279,14 @@ module Groonga @command.original_source << spaces << start_json @buffer = rest @json_parser = Yajl::Parser.new - @json_parser.on_parse_complete = lambda do |value| - on_load_value(@command, value) + @json_first_completed = true + @json_parser.on_parse_complete = lambda do |object| + if object.is_a?(Array) and @json_first_completed + on_load_header(@command, object) + else + on_load_value(@command, object) + end + @json_first_completed = false @load_value_completed = true end @in_load_values = true @@ -317,6 +336,10 @@ module Groonga on_load_start(@command) if @command[:values] values = Yajl::Parser.parse(@command[:values]) + if values.first.is_a?(Array) + header = values.shift + on_load_header(@command, header) + end values.each do |value| on_load_value(@command, value) end @@ -388,6 +411,7 @@ module Groonga def initialize_hooks @on_command_hook = nil @on_load_start_hook = nil + @on_load_header_hook = nil @on_load_value_hook = nil @on_load_complete_hook = nil end Modified: test/test-parser.rb (+19 -3) =================================================================== --- test/test-parser.rb 2012-11-27 23:05:55 +0900 (3b75eb5) +++ test/test-parser.rb 2012-11-27 23:12:26 +0900 (53f32f1) @@ -116,6 +116,9 @@ class ParserTest < Test::Unit::TestCase @parser.on_load_start do |command| @events << [:load_start, command.original_source.dup] end + @parser.on_load_header do |command, header| + @events << [:load_header, command.original_source.dup, header] + end @parser.on_load_value do |command, value| @events << [:load_value, command.original_source.dup, value] end @@ -124,7 +127,7 @@ class ParserTest < Test::Unit::TestCase end end - def test_inline + def test_inline_bracket command_line = "load --values '[{\"_key\": 1}]' --table IDs" @parser << command_line assert_equal([], @events) @@ -137,6 +140,20 @@ class ParserTest < Test::Unit::TestCase @events) end + def test_inline_brace + command_line = "load --values '[[\"_key\"], [1]]' --table IDs" + @parser << command_line + assert_equal([], @events) + @parser << "\n" + assert_equal([ + [:load_start, command_line], + [:load_header, command_line, ["_key"]], + [:load_value, command_line, [1]], + [:load_complete, command_line], + ], + @events) + end + def test_bracket @parser << <<-EOC load --table Users @@ -149,8 +166,7 @@ EOC expected_events << [:load_start, <<-EOC.chomp] load --table Users EOC - # FIXME: It should be stored into command[:columns]. - expected_events << [:load_value, <<-EOC.chomp, ["_key", "name"]] + expected_events << [:load_header, <<-EOC.chomp, ["_key", "name"]] load --table Users [ ["_key", "name"] -------------- next part -------------- HTML����������������������������...Download