Kouhei Sutou
null+****@clear*****
Tue Mar 22 11:44:49 JST 2016
Kouhei Sutou 2016-03-22 11:44:49 +0900 (Tue, 22 Mar 2016) New Revision: 4ae94407e15771880547cac54e53bec4b1646554 https://github.com/ranguba/groonga-client/commit/4ae94407e15771880547cac54e53bec4b1646554 Message: schema: support indexes Modified files: lib/groonga/client/response/schema.rb test/response/test-schema.rb Modified: lib/groonga/client/response/schema.rb (+77 -7) =================================================================== --- lib/groonga/client/response/schema.rb 2016-03-22 00:50:52 +0900 (cbe2a5d) +++ lib/groonga/client/response/schema.rb 2016-03-22 11:44:49 +0900 (6fa82fe) @@ -50,13 +50,24 @@ module Groonga # # @since 0.2.2 def tables - @tables ||= HashValueConverter.convert(@body["tables"]) do |raw_table| - table = Table.new(self) - raw_table.each do |key, value| - table[key] = value + @tables ||= nil + return @tables if @tables + + @tables = {} + @body["tables"].each do |key, _| + @tables[key] = Table.new(self) + end + @body["tables"].each do |key, raw_table| + table = @tables[key] + raw_table.each do |table_key, table_value| + table[table_key] = table_value end - table end + @tables + end + + private + def coerce_tables end module HashValueConverter @@ -87,16 +98,67 @@ module Groonga include Hashie::Extensions::MethodAccess end + class Index < Hash + include Hashie::Extensions::MethodAccess + + def initialize(schema, raw_index) + @schema = schema + super() + raw_index.each do |key, value| + self[key] = value + end + end + + def []=(key, value) + case key.to_sym + when :table + super(key, coerce_table(value)) + else + super + end + end + + def column + column_name = name + if column_name.nil? + column_name + else + table.columns[column_name] + end + end + + private + def coerce_table(table_name) + @schema.tables[table_name] + end + end + class Column < Hash include Hashie::Extensions::MethodAccess - def initialize(schema, properties) + def initialize(schema, raw_column) @schema = schema super() - properties.each do |key, value| + raw_column.each do |key, value| self[key] = value end end + + def []=(key, value) + case key.to_sym + when :indexes + super(key, coerce_indexes(value)) + else + super + end + end + + private + def coerce_indexes(raw_indexes) + raw_indexes.collect do |raw_index| + Index.new(@schema, raw_index) + end + end end class Table < Hash @@ -115,6 +177,8 @@ module Groonga super(key, coerce_tokenzer(value)) when :columns super(key, coerce_columns(value)) + when :indexes + super(key, coerce_indexes(value)) else super end @@ -144,6 +208,12 @@ module Groonga Column.new(@schema, raw_column) end end + + def coerce_indexes(raw_indexes) + raw_indexes.collect do |raw_index| + Index.new(@schema, raw_index) + end + end end end end Modified: test/response/test-schema.rb (+88 -0) =================================================================== --- test/response/test-schema.rb 2016-03-22 00:50:52 +0900 (2b92c29) +++ test/response/test-schema.rb 2016-03-22 11:44:49 +0900 (0664932) @@ -78,6 +78,94 @@ class TestResponseSchema < Test::Unit::TestCase assert_equal("age", response.tables["Users"].columns["age"].name) end + + def test_indexes + body = { + "tables" => { + "Users" => { + "indexes" => [ + { + "full_name" => "Names.users" + } + ] + } + } + } + response = create_response(body) + assert_equal("Names.users", + response.tables["Users"].indexes[0].full_name) + end + end + + class TestColumn < self + def test_indexes + body = { + "tables" => { + "Users" => { + "columns" => { + "age" => { + "indexes" => [ + { + "full_name" => "Ages.users", + } + ] + } + } + } + } + } + response = create_response(body) + assert_equal("Ages.users", + response.tables["Users"].columns["age"].indexes[0].full_name) + end + end + + class TestIndex < self + def test_table + body = { + "tables" => { + "Names" => { + "name" => "Names", + }, + "Users" => { + "indexes" => [ + { + "table" => "Names" + } + ] + } + } + } + response = create_response(body) + assert_equal(response.tables["Names"], + response.tables["Users"].indexes[0].table) + end + + def test_column + body = { + "tables" => { + "Names" => { + "name" => "Names", + "columns" => { + "users_key" => { + "name" => "users_key", + }, + }, + }, + "Users" => { + "indexes" => [ + { + "table" => "Names", + "name" => "users_key", + } + ] + } + } + } + response = create_response(body) + assert_equal(response.tables["Names"].columns["users_key"], + response.tables["Users"].indexes[0].column) + end end end end -------------- next part -------------- HTML����������������������������...下载