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