[Groonga-commit] ranguba/groonga-client at 4ae9440 [master] schema: support indexes

Back to archive index

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����������������������������...
下载 



More information about the Groonga-commit mailing list
Back to archive index