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