Navigation Menu

Skip to content

Commit

Permalink
Fix a bug that commands after load are ignored in not line based pars…
Browse files Browse the repository at this point in the history
…e mode
  • Loading branch information
kou committed Oct 30, 2017
1 parent f1d4994 commit 1301be4
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 57 deletions.
12 changes: 5 additions & 7 deletions lib/groonga/command/parser.rb
Expand Up @@ -219,9 +219,7 @@ def consume_buffer

def consume_load_values(tag)
throw(tag) if @buffer.empty?
@command.original_source << @buffer
@load_values_parser << @buffer
@buffer.clear
end

def consume_line(tag)
Expand Down Expand Up @@ -359,14 +357,14 @@ def initialize_load_values_parser
on_load_value(@command, value)
end
end
@load_values_parser.on_consumed = lambda do |consumed|
@command.original_source << consumed if @loading
end
@load_values_parser.on_end = lambda do |rest|
if rest
original_source_size = @command.original_source.size
@command.original_source.slice!(original_source_size - rest.size,
rest.size)
end
loading = @loading
on_load_complete(@command)
reset
@buffer << rest if loading and rest
end
end
end
Expand Down
13 changes: 11 additions & 2 deletions lib/groonga/command/parser/load-values-parser.rb
Expand Up @@ -21,10 +21,12 @@ module Command
class Parser
class LoadValuesParser
attr_writer :on_value
attr_writer :on_consumed
attr_writer :on_end
def initialize
initialize_parser
@on_value = nil
@on_consumed = nil
@on_end = nil
@containers = []
@keys = []
Expand All @@ -49,9 +51,16 @@ def <<(data)
:continue
end

pos = @parser.pos
consumed = pos - before_pos
if consumed > 0
if consumed < data_size
@on_consumed.call(data[0, consumed])
else
@on_consumed.call(data)
end
end
if status == :done
pos = @parser.pos
consumed = pos - before_pos
if consumed < data_size
@on_end.call(data[consumed..-1])
else
Expand Down
18 changes: 16 additions & 2 deletions test/test-load-value-parser.rb
Expand Up @@ -21,7 +21,12 @@ def setup
@parser.on_value = lambda do |value|
@values << value
end
@parse_consumed = []
@parser.on_consumed = lambda do |consumed|
@parse_consumed << consumed
end
@parse_done = false
@parse_rest = nil
@parser.on_end = lambda do |rest|
@parse_done = true
@parse_rest = rest
Expand Down Expand Up @@ -186,8 +191,17 @@ def parse(data)
}
]garbage
JSON
assert_equal([true, "garbage\n"],
[@parse_done, @parse_rest])
consumed = [
"[\n",
" {\n",
" \"object\": {\n",
" \"string\": \"abc\"\n",
" }\n",
" }\n",
"]",
]
assert_equal([true, consumed, "garbage\n"],
[@parse_done, @parse_consumed, @parse_rest])
end
end
end
122 changes: 76 additions & 46 deletions test/test-parser.rb
Expand Up @@ -253,108 +253,138 @@ def test_brace
class MultiLineTest < self
class BracketTest < self
def test_have_columns
@parser << <<-EOC
@parser << <<-COMMAND
load --table Users --columns "_key, name"
[
["alice", "Alice"]
]
EOC
COMMAND

expected_events = []
expected_events << [:load_start, <<-EOC.chomp]
expected_events << [:load_start, <<-COMMAND.chomp]
load --table Users --columns "_key, name"
EOC
expected_events << [:load_columns, <<-EOC.chomp, ["_key", "name"]]
COMMAND
expected_events << [:load_columns, <<-COMMAND.chomp, ["_key", "name"]]
load --table Users --columns "_key, name"
EOC
expected_events << [:load_value, <<-EOC, ["alice", "Alice"]]
COMMAND
expected_events << [:load_value, <<-COMMAND, ["alice", "Alice"]]
load --table Users --columns "_key, name"
[
["alice", "Alice"]
]
EOC
expected_events << [:load_complete, <<-EOC.chomp]
COMMAND
expected_events << [:load_complete, <<-COMMAND.chomp]
load --table Users --columns "_key, name"
[
["alice", "Alice"]
]
EOC
COMMAND
assert_equal(expected_events, @events)
end

def test_no_columns
@parser << <<-EOC
@parser << <<-COMMAND
load --table Users
[
["_key", "name"],
["alice", "Alice"]
]
EOC
COMMAND

expected_events = []
expected_events << [:load_start, <<-EOC.chomp]
expected_events << [:load_start, <<-COMMAND.chomp]
load --table Users
EOC
expected_events << [:load_columns, <<-EOC, ["_key", "name"]]
COMMAND
expected_events << [:load_columns, <<-COMMAND, ["_key", "name"]]
load --table Users
[
["_key", "name"],
["alice", "Alice"]
]
EOC
expected_events << [:load_value, <<-EOC, ["alice", "Alice"]]
COMMAND
expected_events << [:load_value, <<-COMMAND, ["alice", "Alice"]]
load --table Users
[
["_key", "name"],
["alice", "Alice"]
]
EOC
expected_events << [:load_complete, <<-EOC.chomp]
COMMAND
expected_events << [:load_complete, <<-COMMAND.chomp]
load --table Users
[
["_key", "name"],
["alice", "Alice"]
]
EOC
COMMAND
assert_equal(expected_events, @events)
end
end

def test_brace
@parser << <<-EOC
@parser << <<-COMMAND
load --table Users
[
{"_key": "alice", "name": "Alice"},
{"_key": "bob", "name": "Bob"}
]
EOC
COMMAND

expected_events = []
expected_events << [:load_start, <<-EOC.chomp]
expected_events << [:load_start, <<-COMMAND.chomp]
load --table Users
EOC
COMMAND
value = {"_key" => "alice", "name" => "Alice"}
expected_events << [:load_value, <<-EOC, value]
expected_events << [:load_value, <<-COMMAND, value]
load --table Users
COMMAND
value = {"_key" => "bob", "name" => "Bob"}
expected_events << [:load_value, <<-COMMAND, value]
load --table Users
COMMAND
expected_events << [:load_complete, <<-COMMAND.chomp]
load --table Users
[
{"_key": "alice", "name": "Alice"},
{"_key": "bob", "name": "Bob"}
]
EOC
value = {"_key" => "bob", "name" => "Bob"}
expected_events << [:load_value, <<-EOC, value]
COMMAND
assert_equal(expected_events, @events)
end
end

def test_multiple
@parser << <<-COMMANDS
load --table Users
[
{"_key": "alice", "name": "Alice"}
]
load --table Users
[
{"_key": "alice", "name": "Alice"},
{"_key": "bob", "name": "Bob"}
]
EOC
expected_events << [:load_complete, <<-EOC.chomp]
COMMANDS

expected_events = []

expected_events << [:load_start, <<-SOURCE.chomp]
load --table Users
SOURCE
value = {"_key" => "alice", "name" => "Alice"}
expected_events << [:load_value, <<-SOURCE, value]
load --table Users
SOURCE
expected_events << [:load_complete, <<-SOURCE.chomp]
load --table Users
[
{"_key": "alice", "name": "Alice"}
]
SOURCE

expected_events << [:load_start, <<-SOURCE.chomp]
load --table Users
SOURCE
value = {"_key" => "bob", "name" => "Bob"}
expected_events << [:load_value, <<-SOURCE, value]
load --table Users
SOURCE
expected_events << [:load_complete, <<-SOURCE.chomp]
load --table Users
[
{"_key": "alice", "name": "Alice"},
{"_key": "bob", "name": "Bob"}
]
EOC
assert_equal(expected_events, @events)
end
SOURCE

assert_equal(expected_events, @events)
end

class ErrorTest < self
Expand Down

0 comments on commit 1301be4

Please sign in to comment.