Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
masa21kik committed Jun 4, 2014
1 parent 454c078 commit 2b8b66f
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 91 deletions.
22 changes: 8 additions & 14 deletions lib/json_cli/join.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,10 @@ module JsonCli
class JoinJson
def self.left_join(left_io, right_io, join_key, out = STDOUT)
right = io2hash(right_io, join_key)
left_io.each_line do |l|
left_io.each do |l|
j = MultiJson.load(l.chomp)
if j.key?(join_key)
out.puts MultiJson.dump(j.merge(right[j[join_key]] || {}))
else
out.puts MultiJson.dump(j)
end
j.merge!(right[j[join_key]] || {}) if j.key?(join_key)
out.puts MultiJson.dump(j)
end
out.flush
end
Expand All @@ -23,23 +20,20 @@ def self.right_join(left_io, right_io, join_key, out = STDOUT)

def self.inner_join(left_io, right_io, join_key, out = STDOUT)
right = io2hash(right_io, join_key)
left_io.each_line do |l|
left_io.each do |l|
j = MultiJson.load(l.chomp)
if j.key?(join_key) && right.key?(j[join_key])
out.puts MultiJson.dump(j.merge(right[j[join_key]]))
end
next if !j.key?(join_key) || !right.key?(j[join_key])
out.puts MultiJson.dump(j.merge(right[j[join_key]]))
end
out.flush
end

private

def self.io2hash(io, key)
hash = {}
io.each_line do |l|
io.each do |l|
j = MultiJson.load(l.chomp)
next unless j.key?(key)
hash[j[key]] = j.select { |k, v| k != key }
hash[j[key]] = j.select { |k, _| k != key }
end
hash
end
Expand Down
6 changes: 3 additions & 3 deletions lib/json_cli/unwind.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module JsonCli
class UnwindJson
def self.unwind_array(io, unwind_key, opt = {})
opt[:out] ||= STDOUT
io.each_line do |l|
io.each do |l|
j = MultiJson.load(l.chomp)
if j.key?(unwind_key) && j[unwind_key].is_a?(Array)
j[unwind_key].each do |v|
Expand All @@ -22,10 +22,10 @@ def self.unwind_hash(io, unwind_key, opt = {})
opt[:out] ||= STDOUT
opt[:key_label] ||= 'key'
opt[:value_label] ||= 'value'
io.each_line do |l|
io.each do |l|
j = MultiJson.load(l.chomp)
if j.key?(unwind_key) && j[unwind_key].is_a?(Hash)
base = j.select { |k, v| k != unwind_key } if opt[:flatten]
base = j.select { |k, _| k != unwind_key } if opt[:flatten]
j[unwind_key].each do |k, v|
if opt[:flatten]
jj = base.merge(opt[:key_label] => k, opt[:value_label] => v)
Expand Down
50 changes: 25 additions & 25 deletions spec/json_cli/join_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@
JsonCli::JoinJson.left_join(@left_io, @right_io, key, result)
lines = result.string.each_line.to_a.map { |l| l.chomp }
expect(lines.size).to eq(4)
expect(lines[0]).to eq(%q!{"_id":"0001","timestamp":1385273700,! +
%q!"tags":["news","sports"],"words":{"baseball":3,"soccer":2,! +
%q!"ichiro":1,"honda":2},"title":"A","authors":["alice"]}!)
expect(lines[1]).to eq(%q!{"_id":"0002","timestamp":1385273730,! +
%q!"tags":["sports"],"words":{"sumo":3,"tennis":1,"japan":2},! +
%q!"title":"B","authors":["bob","john"]}!)
expect(lines[2]).to eq(%q!{"_id":"0003","timestamp":1385274100,! +
%q!"tags":["drama"],"words":{"furuhata":2,"ichiro":3}}!)
expect(lines[3]).to eq(%q!{"broken":"data"}!)
expect(lines[0]).to eq(%q({"_id":"0001","timestamp":1385273700,) +
%q("tags":["news","sports"],"words":{"baseball":3,"soccer":2,) +
%q("ichiro":1,"honda":2},"title":"A","authors":["alice"]}))
expect(lines[1]).to eq(%q({"_id":"0002","timestamp":1385273730,) +
%q("tags":["sports"],"words":{"sumo":3,"tennis":1,"japan":2},) +
%q("title":"B","authors":["bob","john"]}))
expect(lines[2]).to eq(%q({"_id":"0003","timestamp":1385274100,) +
%q("tags":["drama"],"words":{"furuhata":2,"ichiro":3}}))
expect(lines[3]).to eq(%q({"broken":"data"}))
end
end

Expand All @@ -44,7 +44,7 @@
JsonCli::JoinJson.left_join(@left_io, @right_io, key, result)
lines = result.string.each_line.to_a.map { |l| l.chomp }
@left_io.rewind
left_lines = @left_io.each_line.to_a.map { |l| l.chomp }
left_lines = @left_io.each.to_a.map { |l| l.chomp }
expect(lines).to eq(left_lines)
end
end
Expand All @@ -60,15 +60,15 @@
JsonCli::JoinJson.right_join(@left_io, @right_io, key, result)
lines = result.string.each_line.to_a.map { |l| l.chomp }
expect(lines.size).to eq(3)
expect(lines[0]).to eq(%q!{"_id":"0001","title":"A",! +
%q!"authors":["alice"],"timestamp":1385273700,! +
%q!"tags":["news","sports"],"words":{"baseball":3,! +
%q!"soccer":2,"ichiro":1,"honda":2}}!)
expect(lines[1]).to eq(%q!{"_id":"0002","title":"B",! +
%q!"authors":["bob","john"],"timestamp":1385273730,! +
%q!"tags":["sports"],"words":{"sumo":3,"tennis":1,"japan":2}}!)
expect(lines[2]).to eq(%q!{"_id":"0004","title":"D",! +
%q!"authors":["dave"]}!)
expect(lines[0]).to eq(%q({"_id":"0001","title":"A",) +
%q("authors":["alice"],"timestamp":1385273700,) +
%q("tags":["news","sports"],"words":{"baseball":3,) +
%q("soccer":2,"ichiro":1,"honda":2}}))
expect(lines[1]).to eq(%q({"_id":"0002","title":"B",) +
%q("authors":["bob","john"],"timestamp":1385273730,) +
%q("tags":["sports"],"words":{"sumo":3,"tennis":1,"japan":2}}))
expect(lines[2]).to eq(%q({"_id":"0004","title":"D",) +
%q("authors":["dave"]}))
end
end
end
Expand All @@ -83,12 +83,12 @@
JsonCli::JoinJson.inner_join(@left_io, @right_io, key, result)
lines = result.string.each_line.to_a.map { |l| l.chomp }
expect(lines.size).to eq(2)
expect(lines[0]).to eq(%q!{"_id":"0001","timestamp":1385273700,! +
%q!"tags":["news","sports"],"words":{"baseball":3,"soccer":2,! +
%q!"ichiro":1,"honda":2},"title":"A","authors":["alice"]}!)
expect(lines[1]).to eq(%q!{"_id":"0002","timestamp":1385273730,! +
%q!"tags":["sports"],"words":{"sumo":3,"tennis":1,"japan":2},! +
%q!"title":"B","authors":["bob","john"]}!)
expect(lines[0]).to eq(%q({"_id":"0001","timestamp":1385273700,) +
%q("tags":["news","sports"],"words":{"baseball":3,"soccer":2,) +
%q("ichiro":1,"honda":2},"title":"A","authors":["alice"]}))
expect(lines[1]).to eq(%q({"_id":"0002","timestamp":1385273730,) +
%q("tags":["sports"],"words":{"sumo":3,"tennis":1,"japan":2},) +
%q("title":"B","authors":["bob","john"]}))
end
end

Expand Down
98 changes: 49 additions & 49 deletions spec/json_cli/unwind_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,17 @@
JsonCli::UnwindJson.unwind_array(@io, key, out: result)
lines = result.string.each_line.to_a.map { |l| l.chomp }
expect(lines.size).to eq(5)
expect(lines[0]).to eq(%q!{"_id":"0001","timestamp":1385273700,! +
%q!"tags":"news","words":{"baseball":3,"soccer":2,"ichiro":1,! +
%q!"honda":2}}!)
expect(lines[1]).to eq(%q!{"_id":"0001","timestamp":1385273700,! +
%q!"tags":"sports","words":{"baseball":3,"soccer":2,"ichiro":1,! +
%q!"honda":2}}!)
expect(lines[2]).to eq(%q!{"_id":"0002","timestamp":1385273730,! +
%q!"tags":"sports","words":{"sumo":3,"tennis":1,"japan":2}}!)
expect(lines[3]).to eq(%q!{"_id":"0003","timestamp":1385274100,! +
%q!"tags":"drama","words":{"furuhata":2,"ichiro":3}}!)
expect(lines[4]).to eq(%q!{"broken":"data"}!)
expect(lines[0]).to eq(%q({"_id":"0001","timestamp":1385273700,) +
%q("tags":"news","words":{"baseball":3,"soccer":2,"ichiro":1,) +
%q("honda":2}}))
expect(lines[1]).to eq(%q({"_id":"0001","timestamp":1385273700,) +
%q("tags":"sports","words":{"baseball":3,"soccer":2,"ichiro":1,) +
%q("honda":2}}))
expect(lines[2]).to eq(%q({"_id":"0002","timestamp":1385273730,) +
%q("tags":"sports","words":{"sumo":3,"tennis":1,"japan":2}}))
expect(lines[3]).to eq(%q({"_id":"0003","timestamp":1385274100,) +
%q("tags":"drama","words":{"furuhata":2,"ichiro":3}}))
expect(lines[4]).to eq(%q({"broken":"data"}))
end
end
end
Expand All @@ -35,25 +35,25 @@
JsonCli::UnwindJson.unwind_hash(@io, key, out: result)
lines = result.string.each_line.to_a.map { |l| l.chomp }
expect(lines.size).to eq(10)
expect(lines[0]).to eq(%q!{"_id":"0001","timestamp":1385273700,! +
%q!"tags":["news","sports"],"words":{"baseball":3}}!)
expect(lines[1]).to eq(%q!{"_id":"0001","timestamp":1385273700,! +
%q!"tags":["news","sports"],"words":{"soccer":2}}!)
expect(lines[2]).to eq(%q!{"_id":"0001","timestamp":1385273700,! +
%q!"tags":["news","sports"],"words":{"ichiro":1}}!)
expect(lines[3]).to eq(%q!{"_id":"0001","timestamp":1385273700,! +
%q!"tags":["news","sports"],"words":{"honda":2}}!)
expect(lines[4]).to eq(%q!{"_id":"0002","timestamp":1385273730,! +
%q!"tags":["sports"],"words":{"sumo":3}}!)
expect(lines[5]).to eq(%q!{"_id":"0002","timestamp":1385273730,! +
%q!"tags":["sports"],"words":{"tennis":1}}!)
expect(lines[6]).to eq(%q!{"_id":"0002","timestamp":1385273730,! +
%q!"tags":["sports"],"words":{"japan":2}}!)
expect(lines[7]).to eq(%q!{"_id":"0003","timestamp":1385274100,! +
%q!"tags":["drama"],"words":{"furuhata":2}}!)
expect(lines[8]).to eq(%q!{"_id":"0003","timestamp":1385274100,! +
%q!"tags":["drama"],"words":{"ichiro":3}}!)
expect(lines[9]).to eq(%q!{"broken":"data"}!)
expect(lines[0]).to eq(%q({"_id":"0001","timestamp":1385273700,) +
%q("tags":["news","sports"],"words":{"baseball":3}}))
expect(lines[1]).to eq(%q({"_id":"0001","timestamp":1385273700,) +
%q("tags":["news","sports"],"words":{"soccer":2}}))
expect(lines[2]).to eq(%q({"_id":"0001","timestamp":1385273700,) +
%q("tags":["news","sports"],"words":{"ichiro":1}}))
expect(lines[3]).to eq(%q({"_id":"0001","timestamp":1385273700,) +
%q("tags":["news","sports"],"words":{"honda":2}}))
expect(lines[4]).to eq(%q({"_id":"0002","timestamp":1385273730,) +
%q("tags":["sports"],"words":{"sumo":3}}))
expect(lines[5]).to eq(%q({"_id":"0002","timestamp":1385273730,) +
%q("tags":["sports"],"words":{"tennis":1}}))
expect(lines[6]).to eq(%q({"_id":"0002","timestamp":1385273730,) +
%q("tags":["sports"],"words":{"japan":2}}))
expect(lines[7]).to eq(%q({"_id":"0003","timestamp":1385274100,) +
%q("tags":["drama"],"words":{"furuhata":2}}))
expect(lines[8]).to eq(%q({"_id":"0003","timestamp":1385274100,) +
%q("tags":["drama"],"words":{"ichiro":3}}))
expect(lines[9]).to eq(%q({"broken":"data"}))
end

it 'unwinds hash values with flatten' do
Expand All @@ -65,25 +65,25 @@
out: result, flatten: true, key_label: 'word', value_label: 'count')
lines = result.string.each_line.to_a.map { |l| l.chomp }
expect(lines.size).to eq(10)
expect(lines[0]).to eq(%q!{"_id":"0001","timestamp":1385273700,! +
%q!"tags":["news","sports"],"word":"baseball","count":3}!)
expect(lines[1]).to eq(%q!{"_id":"0001","timestamp":1385273700,! +
%q!"tags":["news","sports"],"word":"soccer","count":2}!)
expect(lines[2]).to eq(%q!{"_id":"0001","timestamp":1385273700,! +
%q!"tags":["news","sports"],"word":"ichiro","count":1}!)
expect(lines[3]).to eq(%q!{"_id":"0001","timestamp":1385273700,! +
%q!"tags":["news","sports"],"word":"honda","count":2}!)
expect(lines[4]).to eq(%q!{"_id":"0002","timestamp":1385273730,! +
%q!"tags":["sports"],"word":"sumo","count":3}!)
expect(lines[5]).to eq(%q!{"_id":"0002","timestamp":1385273730,! +
%q!"tags":["sports"],"word":"tennis","count":1}!)
expect(lines[6]).to eq(%q!{"_id":"0002","timestamp":1385273730,! +
%q!"tags":["sports"],"word":"japan","count":2}!)
expect(lines[7]).to eq(%q!{"_id":"0003","timestamp":1385274100,! +
%q!"tags":["drama"],"word":"furuhata","count":2}!)
expect(lines[8]).to eq(%q!{"_id":"0003","timestamp":1385274100,! +
%q!"tags":["drama"],"word":"ichiro","count":3}!)
expect(lines[9]).to eq(%q!{"broken":"data"}!)
expect(lines[0]).to eq(%q({"_id":"0001","timestamp":1385273700,) +
%q("tags":["news","sports"],"word":"baseball","count":3}))
expect(lines[1]).to eq(%q({"_id":"0001","timestamp":1385273700,) +
%q("tags":["news","sports"],"word":"soccer","count":2}))
expect(lines[2]).to eq(%q({"_id":"0001","timestamp":1385273700,) +
%q("tags":["news","sports"],"word":"ichiro","count":1}))
expect(lines[3]).to eq(%q({"_id":"0001","timestamp":1385273700,) +
%q("tags":["news","sports"],"word":"honda","count":2}))
expect(lines[4]).to eq(%q({"_id":"0002","timestamp":1385273730,) +
%q("tags":["sports"],"word":"sumo","count":3}))
expect(lines[5]).to eq(%q({"_id":"0002","timestamp":1385273730,) +
%q("tags":["sports"],"word":"tennis","count":1}))
expect(lines[6]).to eq(%q({"_id":"0002","timestamp":1385273730,) +
%q("tags":["sports"],"word":"japan","count":2}))
expect(lines[7]).to eq(%q({"_id":"0003","timestamp":1385274100,) +
%q("tags":["drama"],"word":"furuhata","count":2}))
expect(lines[8]).to eq(%q({"_id":"0003","timestamp":1385274100,) +
%q("tags":["drama"],"word":"ichiro","count":3}))
expect(lines[9]).to eq(%q({"broken":"data"}))
end
end
end
Expand Down

0 comments on commit 2b8b66f

Please sign in to comment.