class OrientdbBinary::Parser::Deserializer
Attributes
record[RW]
Public Class Methods
new()
click to toggle source
# File lib/orientdb_binary/parser/deserializer.rb, line 6 def initialize() @record = {} end
Public Instance Methods
deserialize(document, params={})
click to toggle source
# File lib/orientdb_binary/parser/deserializer.rb, line 16 def deserialize(document, params={}) @record = deserialize_document(document) params.each do |k,v| @record[k] = v end @record end
deserialize_document(serialized, document={}, is_map=false)
click to toggle source
# File lib/orientdb_binary/parser/deserializer.rb, line 24 def deserialize_document(serialized, document={}, is_map=false) serialized = serialized.strip class_index = serialized.index('@') colon_index = serialized.index(':') if class_index && (!colon_index || colon_index > class_index) document[:@class], serialized = split(serialized, class_index) end document[:@type] = "d" unless is_map while (serialized and field_index = serialized.index(':')) do field, serialized = split(serialized, field_index) if field[0] == "\"" and field[-1] == "\"" field = field[1..-2] end comma_index = look_for_comma_index(serialized) value, serialized = split(serialized, comma_index) value = deserialize_field_value(value) document[field.to_sym] = value end document end
deserialize_field_value(value)
click to toggle source
# File lib/orientdb_binary/parser/deserializer.rb, line 48 def deserialize_field_value(value) return Orientdb::RecordId.new value if /^[#]?(?<cluster>-?\d+):(?<position>\d+)$/.match(value) return nil if value.empty? if ["true", "false"].include? value return value == "true" end first_char = value[0] last_char = value[-1] if "\"" == first_char val = value[1..-2] val = val.gsub(/\\"/, "\"") val = val.sub(/\\\\/, "\\") return val end # split for date and datetime if ["t", "a"].include? last_char date = DateTime.strptime(value[0..-1],'%s') date = date.to_date if last_char == "a" return date end if "(" == first_char return deserialize_document(value[1..-2]) end if "{" == first_char return deserialize_document(value[1..-2], {}, true) end if ["[", "<"].include? first_char ret = [] if first_char == "[" ret = Set.new if first_char == "<" values = split_values_from(value[1..-2]) values.each { |val| ret << deserialize_field_value(val) } return ret end if "b" == last_char return value[0..-2].to_i end # split for long/short? if ["l", "s"].include? last_char return value[0..-2].to_i end if "c" == last_char return BigDecimal.new(value[0..-2].to_i) end if ["f", "d"].include? last_char return value[0..-2].to_f end return value.to_i if value.to_i.to_s == value return value end
split(serialized, position)
click to toggle source
# File lib/orientdb_binary/parser/deserializer.rb, line 10 def split(serialized, position) first = serialized[0...position] second = serialized[position+1..-1] return first, second end
Private Instance Methods
end_delimiter?(c)
click to toggle source
# File lib/orientdb_binary/parser/deserializer.rb, line 147 def end_delimiter?(c) [")", "]", "}", ">"].include? c end
look_for_comma_index(serialized)
click to toggle source
# File lib/orientdb_binary/parser/deserializer.rb, line 124 def look_for_comma_index(serialized) delimiters = [] (0...serialized.length).each do |idx| current = serialized[idx] if current == "," and delimiters.length == 0 return idx elsif start_delimiter?(current) and delimiters[-1] != "\"" delimiters << current elsif end_delimiter?(current) and delimiters[-1] != "\"" and current == opposite_delimiter_of(delimiters[-1]) delimiters.pop elsif current == "\"" and delimiters[-1] == "\"" and idx > 0 and serialized[idx-1] != "\\" delimiters.pop elsif current == "\"" and delimiters[-1] != "\"" delimiters << current end end return serialized.length end
opposite_delimiter_of(c)
click to toggle source
# File lib/orientdb_binary/parser/deserializer.rb, line 151 def opposite_delimiter_of(c) case c when "[" then return "]" when "{" then return "}" when "(" then return ")" when "<" then return ">" else return "\"" end end
split_values_from(value)
click to toggle source
# File lib/orientdb_binary/parser/deserializer.rb, line 114 def split_values_from(value) result = [] while value do comma_at = look_for_comma_index(value) res, value = split(value, comma_at) result << res end result end
start_delimiter?(c)
click to toggle source
# File lib/orientdb_binary/parser/deserializer.rb, line 143 def start_delimiter?(c) ["(", "[", "{", "<"].include? c end