Class: Json::Streamer::JsonStreamer

Inherits:
Object
  • Object
show all
Defined in:
lib/json/streamer/json_streamer.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(file_io = nil, chunk_size = 1000) ⇒ JsonStreamer

Returns a new instance of JsonStreamer.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/json/streamer/json_streamer.rb', line 10

def initialize(file_io = nil, chunk_size = 1000)
  @parser = JSON::Stream::Parser.new

  @file_io = file_io
  @chunk_size = chunk_size

  @current_level = -1
  @aggregator = {}
  @aggregator_keys = {}

  @parser.start_object {start_object}
  @parser.start_array {start_array}
  @parser.key {|k| key(k)}
end

Instance Attribute Details

#aggregatorObject (readonly)

Returns the value of attribute aggregator.



7
8
9
# File 'lib/json/streamer/json_streamer.rb', line 7

def aggregator
  @aggregator
end

#parserObject (readonly)

Returns the value of attribute parser.



8
9
10
# File 'lib/json/streamer/json_streamer.rb', line 8

def parser
  @parser
end

Instance Method Details

#<<(data) ⇒ Object



25
26
27
# File 'lib/json/streamer/json_streamer.rb', line 25

def <<(data)
  @parser << data
end

#add_value(value) ⇒ Object



69
70
71
72
73
74
75
# File 'lib/json/streamer/json_streamer.rb', line 69

def add_value(value)
  if array_level?(@current_level)
    @aggregator[@current_level] << value
  else
    @aggregator[@current_level][@current_key] = value
  end
end

#array_level?(nesting_level) ⇒ Boolean

Returns:

  • (Boolean)


115
116
117
# File 'lib/json/streamer/json_streamer.rb', line 115

def array_level?(nesting_level)
  @aggregator[nesting_level].is_a?(Array)
end

#end_level(type) ⇒ Object



77
78
79
80
81
82
83
84
85
86
# File 'lib/json/streamer/json_streamer.rb', line 77

def end_level(type)
  if yield_object?
    yield @aggregator[@current_level].clone
    reset_current_level(type)
  else
    merge_up
  end

  @current_level -= 1
end

#get(nesting_level: -1,, key: nil, yield_values: true, symbolize_keys: false) ⇒ Object

Callbacks containing ‘yield` have to be defined in the method called via block otherwise yield won’t work



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/json/streamer/json_streamer.rb', line 30

def get(nesting_level: -1, key: nil, yield_values: true, symbolize_keys: false)
  @yield_level = nesting_level
  @yield_key = key
  @yield_values = yield_values
  @symbolize_keys = symbolize_keys

  @parser.value do |v|
    value(v) { |desired_object| yield desired_object }
  end

  @parser.end_object do
    end_level(Hash.new) { |desired_object| yield desired_object }
  end

  @parser.end_array do
    end_level(Array.new) { |desired_object| yield desired_object }
  end

  @file_io.each(@chunk_size) { |chunk| @parser << chunk } if @file_io
end

#key(k) ⇒ Object



59
60
61
# File 'lib/json/streamer/json_streamer.rb', line 59

def key(k)
  @current_key = @symbolize_keys ? k.to_sym : k
end

#merge_upObject



119
120
121
122
123
124
125
126
127
128
129
# File 'lib/json/streamer/json_streamer.rb', line 119

def merge_up
  return if @current_level.zero?

  if array_level?(previous_level)
    @aggregator[previous_level] << @aggregator[@current_level]
  else
    @aggregator[previous_level][previous_key] = @aggregator[@current_level]
  end

  @aggregator.delete(@current_level)
end

#new_level(type) ⇒ Object



96
97
98
99
100
101
# File 'lib/json/streamer/json_streamer.rb', line 96

def new_level(type)
  reset_current_key if array_level?(@current_level)
  set_aggregator_key
  @current_level += 1
  reset_current_level(type)
end

#next_levelObject



135
136
137
# File 'lib/json/streamer/json_streamer.rb', line 135

def next_level
  @current_level + 1
end

#previous_keyObject



139
140
141
# File 'lib/json/streamer/json_streamer.rb', line 139

def previous_key
  @aggregator_keys[previous_level]
end

#previous_levelObject



131
132
133
# File 'lib/json/streamer/json_streamer.rb', line 131

def previous_level
  @current_level - 1
end

#reset_current_keyObject



111
112
113
# File 'lib/json/streamer/json_streamer.rb', line 111

def reset_current_key
  @current_key = nil
end

#reset_current_level(type) ⇒ Object



103
104
105
# File 'lib/json/streamer/json_streamer.rb', line 103

def reset_current_level(type)
  @aggregator[@current_level] = type
end

#set_aggregator_keyObject



107
108
109
# File 'lib/json/streamer/json_streamer.rb', line 107

def set_aggregator_key
  @aggregator_keys[@current_level] = @current_key
end

#start_arrayObject



55
56
57
# File 'lib/json/streamer/json_streamer.rb', line 55

def start_array
  new_level(Array.new)
end

#start_objectObject



51
52
53
# File 'lib/json/streamer/json_streamer.rb', line 51

def start_object
  new_level(Hash.new)
end

#value(value) {|value| ... } ⇒ Object

Yields:



63
64
65
66
67
# File 'lib/json/streamer/json_streamer.rb', line 63

def value(value)
  reset_current_key if array_level?(@current_level)
  yield value if yield_value?
  add_value(value)
end

#yield_object?Boolean

Returns:

  • (Boolean)


88
89
90
# File 'lib/json/streamer/json_streamer.rb', line 88

def yield_object?
  @current_level.eql?(@yield_level) or (not @yield_key.nil? and @yield_key == previous_key)
end

#yield_value?Boolean

Returns:

  • (Boolean)


92
93
94
# File 'lib/json/streamer/json_streamer.rb', line 92

def yield_value?
  @yield_values and ((next_level).eql?(@yield_level) or (not @yield_key.nil? and @yield_key == @current_key))
end