class Cassandra::Cluster::Schema::FQCNTypeParser

Constants

Node

@private

Result

@private

Public Instance Methods

parse(string) click to toggle source
   # File lib/cassandra/cluster/schema/fqcn_type_parser.rb
57 def parse(string)
58   create_result(parse_node(string))
59 end

Private Instance Methods

create_result(node) click to toggle source
   # File lib/cassandra/cluster/schema/fqcn_type_parser.rb
63 def create_result(node)
64   collections = nil
65   results     = []
66 
67   if node.name == 'org.apache.cassandra.db.marshal.CompositeType'
68     collections = {}
69 
70     if node.children.last.name ==
71        'org.apache.cassandra.db.marshal.ColumnToCollectionType'
72       node.children.pop.children.each do |child|
73         key, name  = child.name.split(':')
74         key        = [key].pack('H*').force_encoding(::Encoding::UTF_8)
75 
76         if name == 'org.apache.cassandra.db.marshal.ReversedType'
77           collections[key] = lookup_type(child.children.first)
78         else
79           child.name = name
80           collections[key] = lookup_type(child)
81         end
82       end
83     end
84 
85     node.children.each do |child|
86       results << create_type(child)
87     end
88   else
89     results << create_type(node)
90   end
91 
92   Result.new(results, collections)
93 end
create_type(node) click to toggle source
    # File lib/cassandra/cluster/schema/fqcn_type_parser.rb
 95 def create_type(node)
 96   order  = :asc
 97   frozen = false
 98 
 99   if node.name == 'org.apache.cassandra.db.marshal.ReversedType'
100     order = :desc
101     node  = node.children.first
102   end
103 
104   if node.name == 'org.apache.cassandra.db.marshal.FrozenType'
105     frozen = true
106     node   = node.children.first
107   end
108 
109   [lookup_type(node), order, frozen]
110 end
dump_node(node) click to toggle source
    # File lib/cassandra/cluster/schema/fqcn_type_parser.rb
167 def dump_node(node)
168   str = node.name
169   str << '(' + node.children.map { |n| dump_node(n) }.join(',') + ')' unless node.children.empty?
170   str
171 end
lookup_type(node) click to toggle source
    # File lib/cassandra/cluster/schema/fqcn_type_parser.rb
112 def lookup_type(node)
113   type = @@types.fetch(node.name) do
114     return Cassandra::Types.custom(dump_node(node))
115   end
116 
117   case type
118   when :set, :list, :frozen
119     Cassandra::Types.send(type, lookup_type(node.children.first))
120   when :map
121     Cassandra::Types.map(*node.children.map(&method(:lookup_type)))
122   when :udt
123     keyspace = node.children.shift.name
124     name     = [node.children.shift.name].pack('H*')
125     fields   = node.children.map do |child|
126       field_name, child_name = child.name.split(':')
127 
128       child.name = child_name
129       field_name = [field_name].pack('H*').force_encoding(::Encoding::UTF_8)
130 
131       [field_name, lookup_type(child)]
132     end
133 
134     Cassandra::Types.udt(keyspace, name, fields)
135   when :tuple
136     Cassandra::Types.tuple(*node.children.map(&method(:lookup_type)))
137   else
138     Cassandra::Types.send(type)
139   end
140 end
parse_node(string) click to toggle source
    # File lib/cassandra/cluster/schema/fqcn_type_parser.rb
142 def parse_node(string)
143   root = node = Node.new(nil, '', [])
144 
145   string.each_char do |char|
146     case char
147     when '(' # starting type params
148       child = Node.new(node, '', [])
149       node.children << child
150       node = child
151     when ','
152       child = Node.new(node.parent, '', [])
153       node.parent.children << child
154       node = child
155     when ')'
156       node = node.parent
157     when ' '
158       next
159     else
160       node.name << char
161     end
162   end
163 
164   root
165 end