groonga-client 0.6.1 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/doc/text/news.md +12 -0
- data/groonga-client.gemspec +2 -2
- data/lib/groonga/client/response.rb +3 -1
- data/lib/groonga/client/response/drilldownable.rb +85 -0
- data/lib/groonga/client/response/logical-range-filter.rb +52 -0
- data/lib/groonga/client/response/logical-select.rb +28 -0
- data/lib/groonga/client/response/searchable.rb +97 -0
- data/lib/groonga/client/response/select.rb +54 -127
- data/lib/groonga/client/version.rb +2 -2
- data/test/response/test-select-command-version1.rb +0 -6
- data/test/response/test-select-command-version3.rb +1 -0
- data/test/response/test-select-tsv.rb +26 -4
- data/test/response/test-select-xml.rb +26 -4
- metadata +8 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: e58e455931babab20e77e8944bce91b4fcd7dc6aee073afb016fbb127d341a2d
         | 
| 4 | 
            +
              data.tar.gz: 3a5ba751046673d6d32ed7d27b15f2b036740c43dd424741b4e56a176efeab9c
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 1e41055f62099dc806883965e9636e7d0be252f40600665e0cc4d53476409f34aaf4bc25fd06e41cfbb79b37bf3a3b562db275b7e4394ca45c3db022ecd9e900
         | 
| 7 | 
            +
              data.tar.gz: '0284a3e869fb7fc1efd8d7048694f043f4d78794c7a8b279a22a5303f7597fa417be7cef9d2bc7391a475aec3b57de8bed7437d20f9663bb29c4d4ea3793cd60'
         | 
    
        data/doc/text/news.md
    CHANGED
    
    | @@ -1,5 +1,17 @@ | |
| 1 1 | 
             
            # NEWS
         | 
| 2 2 |  | 
| 3 | 
            +
            ## 0.6.2 - 2019-09-02
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ### Improvements
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              * `Groonga::Client::Response::LogicalSelect`: Added.
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              * `Groonga::Client::Response::Select#raw_columns`: Added.
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              * `Groonga::Client::Response::Select#raw_records`: Added.
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              * `Groonga::Client::Response::LogicalRangeFilter`: Added.
         | 
| 14 | 
            +
             | 
| 3 15 | 
             
            ## 0.6.1 - 2019-07-27
         | 
| 4 16 |  | 
| 5 17 | 
             
            ### Improvements
         | 
    
        data/groonga-client.gemspec
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            # -*- mode: ruby -*-
         | 
| 2 2 | 
             
            #
         | 
| 3 3 | 
             
            # Copyright (C) 2013  Haruka Yoshihara <yoshihara@clear-code.com>
         | 
| 4 | 
            -
            # Copyright (C) 2014- | 
| 4 | 
            +
            # Copyright (C) 2014-2019  Sutou Kouhei <kou@clear-code.com>
         | 
| 5 5 | 
             
            #
         | 
| 6 6 | 
             
            # This library is free software; you can redistribute it and/or
         | 
| 7 7 | 
             
            # modify it under the terms of the GNU Lesser General Public
         | 
| @@ -48,7 +48,7 @@ Gem::Specification.new do |spec| | |
| 48 48 | 
             
              end
         | 
| 49 49 |  | 
| 50 50 | 
             
              spec.add_runtime_dependency("gqtp", ">= 1.0.4")
         | 
| 51 | 
            -
              spec.add_runtime_dependency("groonga-command", ">= 1. | 
| 51 | 
            +
              spec.add_runtime_dependency("groonga-command", ">= 1.4.5")
         | 
| 52 52 | 
             
              spec.add_runtime_dependency("groonga-command-parser", ">= 1.1.0")
         | 
| 53 53 | 
             
              spec.add_runtime_dependency("hashie")
         | 
| 54 54 |  | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            # Copyright (C) 2014- | 
| 1 | 
            +
            # Copyright (C) 2014-2019  Sutou Kouhei <kou@clear-code.com>
         | 
| 2 2 | 
             
            # Copyright (C) 2013  Haruka Yoshihara <yoshihara@clear-code.com>
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # This library is free software; you can redistribute it and/or
         | 
| @@ -30,6 +30,8 @@ require "groonga/client/response/lock-clear" | |
| 30 30 | 
             
            require "groonga/client/response/log-level"
         | 
| 31 31 | 
             
            require "groonga/client/response/log-put"
         | 
| 32 32 | 
             
            require "groonga/client/response/log-reopen"
         | 
| 33 | 
            +
            require "groonga/client/response/logical-range-filter"
         | 
| 34 | 
            +
            require "groonga/client/response/logical-select"
         | 
| 33 35 | 
             
            require "groonga/client/response/quit"
         | 
| 34 36 | 
             
            require "groonga/client/response/register"
         | 
| 35 37 | 
             
            require "groonga/client/response/schema"
         | 
| @@ -0,0 +1,85 @@ | |
| 1 | 
            +
            # Copyright (C) 2019  Sutou Kouhei <kou@clear-code.com>
         | 
| 2 | 
            +
            #
         | 
| 3 | 
            +
            # This library is free software; you can redistribute it and/or
         | 
| 4 | 
            +
            # modify it under the terms of the GNU Lesser General Public
         | 
| 5 | 
            +
            # License as published by the Free Software Foundation; either
         | 
| 6 | 
            +
            # version 2.1 of the License, or (at your option) any later version.
         | 
| 7 | 
            +
            #
         | 
| 8 | 
            +
            # This library is distributed in the hope that it will be useful,
         | 
| 9 | 
            +
            # but WITHOUT ANY WARRANTY; without even the implied warranty of
         | 
| 10 | 
            +
            # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
         | 
| 11 | 
            +
            # Lesser General Public License for more details.
         | 
| 12 | 
            +
            #
         | 
| 13 | 
            +
            # You should have received a copy of the GNU Lesser General Public
         | 
| 14 | 
            +
            # License along with this library; if not, write to the Free Software
         | 
| 15 | 
            +
            # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            module Groonga
         | 
| 18 | 
            +
              class Client
         | 
| 19 | 
            +
                module Response
         | 
| 20 | 
            +
                  module Drilldownable
         | 
| 21 | 
            +
                    # @return [::Array<Groonga::Client::Response::Select::Drilldown>,
         | 
| 22 | 
            +
                    #          ::Hash<String, Groonga::Client::Response::Select::Drilldown>]
         | 
| 23 | 
            +
                    #   If labeled drilldowns are used or command version 3 or
         | 
| 24 | 
            +
                    #   later is used, `{"label1" => drilldown1, "label2" => drilldown2}`
         | 
| 25 | 
            +
                    #   is returned since 0.3.1.
         | 
| 26 | 
            +
                    #
         | 
| 27 | 
            +
                    #   Otherwise, `[drilldown1, drilldown2]` is returned.
         | 
| 28 | 
            +
                    attr_accessor :drilldowns
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    private
         | 
| 31 | 
            +
                    def parse_drilldown(label, keys, raw_drilldown)
         | 
| 32 | 
            +
                      if raw_drilldown.is_a?(::Array)
         | 
| 33 | 
            +
                        n_hits = raw_drilldown[0][0]
         | 
| 34 | 
            +
                        raw_columns = raw_drilldown[1]
         | 
| 35 | 
            +
                        raw_records = raw_drilldown[2..-1]
         | 
| 36 | 
            +
                      else
         | 
| 37 | 
            +
                        n_hits = raw_drilldown["n_hits"]
         | 
| 38 | 
            +
                        raw_columns = raw_drilldown["columns"]
         | 
| 39 | 
            +
                        raw_records = raw_drilldown["records"]
         | 
| 40 | 
            +
                      end
         | 
| 41 | 
            +
                      records = parse_records(raw_columns, raw_records)
         | 
| 42 | 
            +
                      Drilldown.new(label,
         | 
| 43 | 
            +
                                    keys,
         | 
| 44 | 
            +
                                    n_hits,
         | 
| 45 | 
            +
                                    records,
         | 
| 46 | 
            +
                                    raw_columns,
         | 
| 47 | 
            +
                                    raw_records)
         | 
| 48 | 
            +
                    end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                    def parse_drilldowns(keys, raw_drilldowns)
         | 
| 51 | 
            +
                      (raw_drilldowns || []).collect.with_index do |raw_drilldown, i|
         | 
| 52 | 
            +
                        key = keys[i]
         | 
| 53 | 
            +
                        parse_drilldown(key, [key], raw_drilldown)
         | 
| 54 | 
            +
                      end
         | 
| 55 | 
            +
                    end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                    def parse_labeled_drilldowns(labeled_drilldown_requests,
         | 
| 58 | 
            +
                                                 raw_drilldowns)
         | 
| 59 | 
            +
                      drilldowns = {}
         | 
| 60 | 
            +
                      (raw_drilldowns || {}).each do |label, raw_drilldown|
         | 
| 61 | 
            +
                        labeled_drilldown_request = labeled_drilldown_requests[label]
         | 
| 62 | 
            +
                        drilldowns[label] = parse_drilldown(label,
         | 
| 63 | 
            +
                                                            labeled_drilldown_request.keys,
         | 
| 64 | 
            +
                                                            raw_drilldown)
         | 
| 65 | 
            +
                      end
         | 
| 66 | 
            +
                      drilldowns
         | 
| 67 | 
            +
                    end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    class Drilldown < Struct.new(:label,
         | 
| 70 | 
            +
                                                 :keys,
         | 
| 71 | 
            +
                                                 :n_hits,
         | 
| 72 | 
            +
                                                 :records,
         | 
| 73 | 
            +
                                                 :raw_columns,
         | 
| 74 | 
            +
                                                 :raw_records)
         | 
| 75 | 
            +
                      # @deprecated since 0.2.6. Use {#records} instead.
         | 
| 76 | 
            +
                      alias_method :items, :records
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                      def key
         | 
| 79 | 
            +
                        keys.join(", ")
         | 
| 80 | 
            +
                      end
         | 
| 81 | 
            +
                    end
         | 
| 82 | 
            +
                  end
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
              end
         | 
| 85 | 
            +
            end
         | 
| @@ -0,0 +1,52 @@ | |
| 1 | 
            +
            # Copyright (C) 2019  Sutou Kouhei <kou@clear-code.com>
         | 
| 2 | 
            +
            #
         | 
| 3 | 
            +
            # This library is free software; you can redistribute it and/or
         | 
| 4 | 
            +
            # modify it under the terms of the GNU Lesser General Public
         | 
| 5 | 
            +
            # License as published by the Free Software Foundation; either
         | 
| 6 | 
            +
            # version 2.1 of the License, or (at your option) any later version.
         | 
| 7 | 
            +
            #
         | 
| 8 | 
            +
            # This library is distributed in the hope that it will be useful,
         | 
| 9 | 
            +
            # but WITHOUT ANY WARRANTY; without even the implied warranty of
         | 
| 10 | 
            +
            # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
         | 
| 11 | 
            +
            # Lesser General Public License for more details.
         | 
| 12 | 
            +
            #
         | 
| 13 | 
            +
            # You should have received a copy of the GNU Lesser General Public
         | 
| 14 | 
            +
            # License along with this library; if not, write to the Free Software
         | 
| 15 | 
            +
            # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            require "groonga/client/response/base"
         | 
| 18 | 
            +
            require "groonga/client/response/searchable"
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            module Groonga
         | 
| 21 | 
            +
              class Client
         | 
| 22 | 
            +
                module Response
         | 
| 23 | 
            +
                  class LogicalRangeFilter < Base
         | 
| 24 | 
            +
                    Response.register("logical_range_filter", self)
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    include Searchable
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    attr_accessor :records
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    def body=(body)
         | 
| 31 | 
            +
                      super(body)
         | 
| 32 | 
            +
                      parse_body(body)
         | 
| 33 | 
            +
                    end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    private
         | 
| 36 | 
            +
                    def parse_body(body)
         | 
| 37 | 
            +
                      if body.is_a?(::Array)
         | 
| 38 | 
            +
                        @raw_columns, *@raw_records = body.first
         | 
| 39 | 
            +
                        @raw_records ||= []
         | 
| 40 | 
            +
                        @records = parse_records(raw_columns, raw_records)
         | 
| 41 | 
            +
                      else
         | 
| 42 | 
            +
                        @raw_columns = body["columns"]
         | 
| 43 | 
            +
                        @raw_records = body["records"] || []
         | 
| 44 | 
            +
                      end
         | 
| 45 | 
            +
                      @records = parse_records(@raw_columns, @raw_records)
         | 
| 46 | 
            +
                      body
         | 
| 47 | 
            +
                    end
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
            end
         | 
| 52 | 
            +
             | 
| @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            # Copyright (C) 2019  Sutou Kouhei <kou@clear-code.com>
         | 
| 2 | 
            +
            #
         | 
| 3 | 
            +
            # This library is free software; you can redistribute it and/or
         | 
| 4 | 
            +
            # modify it under the terms of the GNU Lesser General Public
         | 
| 5 | 
            +
            # License as published by the Free Software Foundation; either
         | 
| 6 | 
            +
            # version 2.1 of the License, or (at your option) any later version.
         | 
| 7 | 
            +
            #
         | 
| 8 | 
            +
            # This library is distributed in the hope that it will be useful,
         | 
| 9 | 
            +
            # but WITHOUT ANY WARRANTY; without even the implied warranty of
         | 
| 10 | 
            +
            # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
         | 
| 11 | 
            +
            # Lesser General Public License for more details.
         | 
| 12 | 
            +
            #
         | 
| 13 | 
            +
            # You should have received a copy of the GNU Lesser General Public
         | 
| 14 | 
            +
            # License along with this library; if not, write to the Free Software
         | 
| 15 | 
            +
            # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            require "groonga/client/response/select"
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            module Groonga
         | 
| 20 | 
            +
              class Client
         | 
| 21 | 
            +
                module Response
         | 
| 22 | 
            +
                  class LogicalSelect < Select
         | 
| 23 | 
            +
                    Response.register("logical_select", self)
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| 28 | 
            +
             | 
| @@ -0,0 +1,97 @@ | |
| 1 | 
            +
            # Copyright (C) 2019  Sutou Kouhei <kou@clear-code.com>
         | 
| 2 | 
            +
            #
         | 
| 3 | 
            +
            # This library is free software; you can redistribute it and/or
         | 
| 4 | 
            +
            # modify it under the terms of the GNU Lesser General Public
         | 
| 5 | 
            +
            # License as published by the Free Software Foundation; either
         | 
| 6 | 
            +
            # version 2.1 of the License, or (at your option) any later version.
         | 
| 7 | 
            +
            #
         | 
| 8 | 
            +
            # This library is distributed in the hope that it will be useful,
         | 
| 9 | 
            +
            # but WITHOUT ANY WARRANTY; without even the implied warranty of
         | 
| 10 | 
            +
            # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
         | 
| 11 | 
            +
            # Lesser General Public License for more details.
         | 
| 12 | 
            +
            #
         | 
| 13 | 
            +
            # You should have received a copy of the GNU Lesser General Public
         | 
| 14 | 
            +
            # License along with this library; if not, write to the Free Software
         | 
| 15 | 
            +
            # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            module Groonga
         | 
| 18 | 
            +
              class Client
         | 
| 19 | 
            +
                module Response
         | 
| 20 | 
            +
                  module Searchable
         | 
| 21 | 
            +
                    include Enumerable
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    attr_accessor :records
         | 
| 24 | 
            +
                    attr_accessor :raw_columns
         | 
| 25 | 
            +
                    attr_accessor :raw_records
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    # For Kaminari
         | 
| 28 | 
            +
                    def limit_value
         | 
| 29 | 
            +
                      (@command[:limit] || 10).to_i
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    # For Kaminari
         | 
| 33 | 
            +
                    def offset_value
         | 
| 34 | 
            +
                      (@command[:offset] || 0).to_i
         | 
| 35 | 
            +
                    end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    # For Kaminari
         | 
| 38 | 
            +
                    def size
         | 
| 39 | 
            +
                      records.size
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                    def each(&block)
         | 
| 43 | 
            +
                      records.each(&block)
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                    private
         | 
| 47 | 
            +
                    def parse_records(raw_columns, raw_records)
         | 
| 48 | 
            +
                      column_names = {}
         | 
| 49 | 
            +
                      columns = raw_columns.collect do |column|
         | 
| 50 | 
            +
                        if column.is_a?(::Array)
         | 
| 51 | 
            +
                          name, type = column
         | 
| 52 | 
            +
                        else
         | 
| 53 | 
            +
                          name = column["name"]
         | 
| 54 | 
            +
                          type = column["type"]
         | 
| 55 | 
            +
                        end
         | 
| 56 | 
            +
                        base_column_name = name
         | 
| 57 | 
            +
                        suffix = 2
         | 
| 58 | 
            +
                        while column_names.key?(name)
         | 
| 59 | 
            +
                          name = "#{base_column_name}#{suffix}"
         | 
| 60 | 
            +
                          suffix += 1
         | 
| 61 | 
            +
                        end
         | 
| 62 | 
            +
                        column_names[name] = true
         | 
| 63 | 
            +
                        [name, type]
         | 
| 64 | 
            +
                      end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                      (raw_records || []).collect do |raw_record|
         | 
| 67 | 
            +
                        record = Record.new
         | 
| 68 | 
            +
                        columns.each_with_index do |(name, type), i|
         | 
| 69 | 
            +
                          record[name] = convert_value(raw_record[i], type)
         | 
| 70 | 
            +
                        end
         | 
| 71 | 
            +
                        record
         | 
| 72 | 
            +
                      end
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                    def convert_value(value, type)
         | 
| 76 | 
            +
                      case value
         | 
| 77 | 
            +
                      when ::Array
         | 
| 78 | 
            +
                        value.collect do |element|
         | 
| 79 | 
            +
                          convert_value(element, type)
         | 
| 80 | 
            +
                        end
         | 
| 81 | 
            +
                      else
         | 
| 82 | 
            +
                        case type
         | 
| 83 | 
            +
                        when "Time"
         | 
| 84 | 
            +
                          Time.at(value)
         | 
| 85 | 
            +
                        else
         | 
| 86 | 
            +
                          value
         | 
| 87 | 
            +
                        end
         | 
| 88 | 
            +
                      end
         | 
| 89 | 
            +
                    end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                    class Record < ::Hash
         | 
| 92 | 
            +
                      include Hashie::Extensions::MethodAccess
         | 
| 93 | 
            +
                    end
         | 
| 94 | 
            +
                  end
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
              end
         | 
| 97 | 
            +
            end
         | 
| @@ -17,6 +17,8 @@ | |
| 17 17 | 
             
            # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
         | 
| 18 18 |  | 
| 19 19 | 
             
            require "groonga/client/response/base"
         | 
| 20 | 
            +
            require "groonga/client/response/drilldownable"
         | 
| 21 | 
            +
            require "groonga/client/response/searchable"
         | 
| 20 22 |  | 
| 21 23 | 
             
            module Groonga
         | 
| 22 24 | 
             
              class Client
         | 
| @@ -174,23 +176,14 @@ module Groonga | |
| 174 176 | 
             
                      end
         | 
| 175 177 | 
             
                    end
         | 
| 176 178 |  | 
| 177 | 
            -
                    include  | 
| 179 | 
            +
                    include Drilldownable
         | 
| 180 | 
            +
                    include Searchable
         | 
| 178 181 |  | 
| 179 182 | 
             
                    # @return [Integer] The number of records that match againt
         | 
| 180 183 | 
             
                    #   a search condition.
         | 
| 181 184 | 
             
                    attr_accessor :n_hits
         | 
| 182 185 | 
             
                    # For Kaminari
         | 
| 183 186 | 
             
                    alias_method :total_count, :n_hits
         | 
| 184 | 
            -
                    attr_accessor :records
         | 
| 185 | 
            -
             | 
| 186 | 
            -
                    # @return [::Array<Groonga::Client::Response::Select::Drilldown>,
         | 
| 187 | 
            -
                    #          ::Hash<String, Groonga::Client::Response::Select::Drilldown>]
         | 
| 188 | 
            -
                    #   If labeled drilldowns are used or command version 3 or
         | 
| 189 | 
            -
                    #   later is used, `{"label1" => drilldown1, "label2" => drilldown2}`
         | 
| 190 | 
            -
                    #   is returned since 0.3.1.
         | 
| 191 | 
            -
                    #
         | 
| 192 | 
            -
                    #   Otherwise, `[drilldown1, drilldown2]` is returned.
         | 
| 193 | 
            -
                    attr_accessor :drilldowns
         | 
| 194 187 |  | 
| 195 188 | 
             
                    # @return [::Hash<String, Groonga::Client::Response::Select::Slice>]
         | 
| 196 189 | 
             
                    #
         | 
| @@ -202,29 +195,11 @@ module Groonga | |
| 202 195 | 
             
                      parse_body(body)
         | 
| 203 196 | 
             
                    end
         | 
| 204 197 |  | 
| 205 | 
            -
                    # For Kaminari
         | 
| 206 | 
            -
                    def limit_value
         | 
| 207 | 
            -
                      (@command[:limit] || 10).to_i
         | 
| 208 | 
            -
                    end
         | 
| 209 | 
            -
             | 
| 210 | 
            -
                    # For Kaminari
         | 
| 211 | 
            -
                    def offset_value
         | 
| 212 | 
            -
                      (@command[:offset] || 0).to_i
         | 
| 213 | 
            -
                    end
         | 
| 214 | 
            -
             | 
| 215 | 
            -
                    # For Kaminari
         | 
| 216 | 
            -
                    def size
         | 
| 217 | 
            -
                      records.size
         | 
| 218 | 
            -
                    end
         | 
| 219 | 
            -
             | 
| 220 | 
            -
                    def each(&block)
         | 
| 221 | 
            -
                      records.each(&block)
         | 
| 222 | 
            -
                    end
         | 
| 223 | 
            -
             | 
| 224 198 | 
             
                    private
         | 
| 225 199 | 
             
                    def parse_body(body)
         | 
| 226 200 | 
             
                      if body.is_a?(::Array)
         | 
| 227 | 
            -
                        @n_hits, @records = | 
| 201 | 
            +
                        @n_hits, @raw_columns, @raw_records, @records =
         | 
| 202 | 
            +
                          parse_record_set_v1(body.first)
         | 
| 228 203 | 
             
                        if @command.slices.empty?
         | 
| 229 204 | 
             
                          raw_slices = nil
         | 
| 230 205 | 
             
                          raw_drilldowns = body[1..-1]
         | 
| @@ -232,115 +207,73 @@ module Groonga | |
| 232 207 | 
             
                          raw_slices, *raw_drilldowns = body[1..-1]
         | 
| 233 208 | 
             
                        end
         | 
| 234 209 | 
             
                        @slices = parse_slices_v1(raw_slices)
         | 
| 235 | 
            -
                         | 
| 236 | 
            -
             | 
| 237 | 
            -
                         | 
| 238 | 
            -
             | 
| 239 | 
            -
             | 
| 240 | 
            -
                      end
         | 
| 241 | 
            -
                      body
         | 
| 242 | 
            -
                    end
         | 
| 243 | 
            -
             | 
| 244 | 
            -
                    def parse_records(raw_columns, raw_records)
         | 
| 245 | 
            -
                      column_names = {}
         | 
| 246 | 
            -
                      columns = raw_columns.collect do |column|
         | 
| 247 | 
            -
                        if column.is_a?(::Array)
         | 
| 248 | 
            -
                          name, type = column
         | 
| 210 | 
            +
                        drilldown_keys = @command.drilldowns
         | 
| 211 | 
            +
                        labeled_drilldowns = @command.labeled_drilldowns
         | 
| 212 | 
            +
                        if drilldown_keys.empty? and !labeled_drilldowns.empty?
         | 
| 213 | 
            +
                          @drilldowns = parse_labeled_drilldowns(labeled_drilldowns,
         | 
| 214 | 
            +
                                                                 raw_drilldowns[0])
         | 
| 249 215 | 
             
                        else
         | 
| 250 | 
            -
                           | 
| 251 | 
            -
                          type = column["type"]
         | 
| 252 | 
            -
                        end
         | 
| 253 | 
            -
                        base_column_name = name
         | 
| 254 | 
            -
                        suffix = 2
         | 
| 255 | 
            -
                        while column_names.key?(name)
         | 
| 256 | 
            -
                          name = "#{base_column_name}#{suffix}"
         | 
| 257 | 
            -
                          suffix += 1
         | 
| 258 | 
            -
                        end
         | 
| 259 | 
            -
                        column_names[name] = true
         | 
| 260 | 
            -
                        [name, type]
         | 
| 261 | 
            -
                      end
         | 
| 262 | 
            -
             | 
| 263 | 
            -
                      (raw_records || []).collect do |raw_record|
         | 
| 264 | 
            -
                        record = Record.new
         | 
| 265 | 
            -
                        columns.each_with_index do |(name, type), i|
         | 
| 266 | 
            -
                          record[name] = convert_value(raw_record[i], type)
         | 
| 267 | 
            -
                        end
         | 
| 268 | 
            -
                        record
         | 
| 269 | 
            -
                      end
         | 
| 270 | 
            -
                    end
         | 
| 271 | 
            -
             | 
| 272 | 
            -
                    def convert_value(value, type)
         | 
| 273 | 
            -
                      case value
         | 
| 274 | 
            -
                      when ::Array
         | 
| 275 | 
            -
                        value.collect do |element|
         | 
| 276 | 
            -
                          convert_value(element, type)
         | 
| 216 | 
            +
                          @drilldowns = parse_drilldowns(drilldown_keys, raw_drilldowns)
         | 
| 277 217 | 
             
                        end
         | 
| 278 218 | 
             
                      else
         | 
| 279 | 
            -
                         | 
| 280 | 
            -
             | 
| 281 | 
            -
             | 
| 282 | 
            -
                         | 
| 283 | 
            -
             | 
| 219 | 
            +
                        @n_hits, @raw_columns, @raw_records, @records =
         | 
| 220 | 
            +
                          parse_record_set_v3(body)
         | 
| 221 | 
            +
                        drilldown_keys = @command.drilldowns
         | 
| 222 | 
            +
                        labeled_drilldowns = @command.labeled_drilldowns
         | 
| 223 | 
            +
                        if labeled_drilldowns.empty?
         | 
| 224 | 
            +
                          drilldown_keys.each do |key|
         | 
| 225 | 
            +
                            labeled_drilldown =
         | 
| 226 | 
            +
                              Groonga::Command::Drilldownable::Drilldown.new
         | 
| 227 | 
            +
                            labeled_drilldown.label = key
         | 
| 228 | 
            +
                            labeled_drilldown.keys = [key]
         | 
| 229 | 
            +
                            labeled_drilldowns[key] = labeled_drilldown
         | 
| 230 | 
            +
                          end
         | 
| 284 231 | 
             
                        end
         | 
| 232 | 
            +
                        @drilldowns = parse_labeled_drilldowns(labeled_drilldowns,
         | 
| 233 | 
            +
                                                               body["drilldowns"])
         | 
| 234 | 
            +
                        @slices = parse_slices_v3(body["slices"])
         | 
| 285 235 | 
             
                      end
         | 
| 236 | 
            +
                      body
         | 
| 286 237 | 
             
                    end
         | 
| 287 238 |  | 
| 288 | 
            -
                    def  | 
| 239 | 
            +
                    def parse_record_set_v1(raw_record_set)
         | 
| 240 | 
            +
                      n_hits = raw_record_set.first.first
         | 
| 241 | 
            +
                      raw_columns = raw_record_set[1]
         | 
| 242 | 
            +
                      raw_records = raw_record_set[2..-1] || []
         | 
| 289 243 | 
             
                      [
         | 
| 290 | 
            -
                         | 
| 291 | 
            -
                         | 
| 244 | 
            +
                        n_hits,
         | 
| 245 | 
            +
                        raw_columns,
         | 
| 246 | 
            +
                        raw_records,
         | 
| 247 | 
            +
                        parse_records(raw_columns, raw_records),
         | 
| 292 248 | 
             
                      ]
         | 
| 293 249 | 
             
                    end
         | 
| 294 250 |  | 
| 295 | 
            -
                    def  | 
| 251 | 
            +
                    def parse_record_set_v3(raw_record_set)
         | 
| 252 | 
            +
                      n_hits = raw_record_set["n_hits"]
         | 
| 253 | 
            +
                      raw_columns = raw_record_set["columns"]
         | 
| 254 | 
            +
                      raw_records = raw_record_set["records"] || []
         | 
| 296 255 | 
             
                      [
         | 
| 297 | 
            -
                         | 
| 298 | 
            -
                         | 
| 256 | 
            +
                        n_hits,
         | 
| 257 | 
            +
                        raw_columns,
         | 
| 258 | 
            +
                        raw_records,
         | 
| 259 | 
            +
                        parse_records(raw_columns, raw_records),
         | 
| 299 260 | 
             
                      ]
         | 
| 300 261 | 
             
                    end
         | 
| 301 262 |  | 
| 302 | 
            -
                    def parse_drilldowns_v1(raw_drilldowns)
         | 
| 303 | 
            -
                      request_drilldowns = @command.drilldowns
         | 
| 304 | 
            -
                      if request_drilldowns.empty? and !@command.labeled_drilldowns.empty?
         | 
| 305 | 
            -
                        drilldowns = {}
         | 
| 306 | 
            -
                        (raw_drilldowns[0] || {}).each do |label, raw_drilldown|
         | 
| 307 | 
            -
                          n_hits, records = parse_match_records_v1(raw_drilldown)
         | 
| 308 | 
            -
                          drilldowns[label] = Drilldown.new(label, n_hits, records)
         | 
| 309 | 
            -
                        end
         | 
| 310 | 
            -
                        drilldowns
         | 
| 311 | 
            -
                      else
         | 
| 312 | 
            -
                        (raw_drilldowns || []).collect.with_index do |raw_drilldown, i|
         | 
| 313 | 
            -
                          key = request_drilldowns[i]
         | 
| 314 | 
            -
                          n_hits, records = parse_match_records_v1(raw_drilldown)
         | 
| 315 | 
            -
                          Drilldown.new(key, n_hits, records)
         | 
| 316 | 
            -
                        end
         | 
| 317 | 
            -
                      end
         | 
| 318 | 
            -
                    end
         | 
| 319 | 
            -
             | 
| 320 | 
            -
                    def parse_drilldowns_v3(raw_drilldowns)
         | 
| 321 | 
            -
                      drilldowns = {}
         | 
| 322 | 
            -
                      (raw_drilldowns || {}).each do |key, raw_drilldown|
         | 
| 323 | 
            -
                        n_hits, records = parse_match_records_v3(raw_drilldown)
         | 
| 324 | 
            -
                        drilldowns[key] = Drilldown.new(key, n_hits, records)
         | 
| 325 | 
            -
                      end
         | 
| 326 | 
            -
                      drilldowns
         | 
| 327 | 
            -
                    end
         | 
| 328 | 
            -
             | 
| 329 263 | 
             
                    def parse_slices_v1(raw_slices)
         | 
| 330 264 | 
             
                      slices = {}
         | 
| 331 265 | 
             
                      (raw_slices || {}).each do |key, raw_slice|
         | 
| 266 | 
            +
                        requested_slice = @command.slices[key]
         | 
| 332 267 | 
             
                        if raw_slice.last.is_a?(::Hash)
         | 
| 333 268 | 
             
                          raw_drilldowns = raw_slice.last
         | 
| 334 269 | 
             
                          raw_slice = raw_slice[0..-2]
         | 
| 335 | 
            -
                          drilldowns = | 
| 336 | 
            -
             | 
| 337 | 
            -
             | 
| 338 | 
            -
                            drilldowns[label] = Drilldown.new(label, n_hits, records)
         | 
| 339 | 
            -
                          end
         | 
| 270 | 
            +
                          drilldowns =
         | 
| 271 | 
            +
                            parse_labeled_drilldowns(requested_slice.labeled_drilldowns,
         | 
| 272 | 
            +
                                                     raw_drilldowns)
         | 
| 340 273 | 
             
                        else
         | 
| 341 274 | 
             
                          drilldowns = {}
         | 
| 342 275 | 
             
                        end
         | 
| 343 | 
            -
                        n_hits, records =  | 
| 276 | 
            +
                        n_hits, _, _, records = parse_record_set_v1(raw_slice)
         | 
| 344 277 | 
             
                        slices[key] = Slice.new(key, n_hits, records, drilldowns)
         | 
| 345 278 | 
             
                      end
         | 
| 346 279 | 
             
                      slices
         | 
| @@ -349,22 +282,16 @@ module Groonga | |
| 349 282 | 
             
                    def parse_slices_v3(raw_slices)
         | 
| 350 283 | 
             
                      slices = {}
         | 
| 351 284 | 
             
                      (raw_slices || {}).each do |key, raw_slice|
         | 
| 352 | 
            -
                         | 
| 353 | 
            -
                         | 
| 285 | 
            +
                        requested_slice = @command.slices[key]
         | 
| 286 | 
            +
                        n_hits, _, _, records = parse_record_set_v3(raw_slice)
         | 
| 287 | 
            +
                          drilldowns =
         | 
| 288 | 
            +
                            parse_labeled_drilldowns(requested_slice.labeled_drilldowns,
         | 
| 289 | 
            +
                                                     raw_slice["drilldowns"])
         | 
| 354 290 | 
             
                        slices[key] = Slice.new(key, n_hits, records, drilldowns)
         | 
| 355 291 | 
             
                      end
         | 
| 356 292 | 
             
                      slices
         | 
| 357 293 | 
             
                    end
         | 
| 358 294 |  | 
| 359 | 
            -
                    class Record < ::Hash
         | 
| 360 | 
            -
                      include Hashie::Extensions::MethodAccess
         | 
| 361 | 
            -
                    end
         | 
| 362 | 
            -
             | 
| 363 | 
            -
                    class Drilldown < Struct.new(:key, :n_hits, :records)
         | 
| 364 | 
            -
                      # @deprecated since 0.2.6. Use {#records} instead.
         | 
| 365 | 
            -
                      alias_method :items, :records
         | 
| 366 | 
            -
                    end
         | 
| 367 | 
            -
             | 
| 368 295 | 
             
                    class Slice < Struct.new(:key, :n_hits, :records, :drilldowns)
         | 
| 369 296 | 
             
                    end
         | 
| 370 297 | 
             
                  end
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            # Copyright (C) 2013- | 
| 1 | 
            +
            # Copyright (C) 2013-2019  Sutou Kouhei <kou@clear-code.com>
         | 
| 2 2 | 
             
            #
         | 
| 3 3 | 
             
            # This library is free software; you can redistribute it and/or
         | 
| 4 4 | 
             
            # modify it under the terms of the GNU Lesser General Public
         | 
| @@ -16,6 +16,6 @@ | |
| 16 16 |  | 
| 17 17 | 
             
            module Groonga
         | 
| 18 18 | 
             
              class Client
         | 
| 19 | 
            -
                VERSION = "0.6. | 
| 19 | 
            +
                VERSION = "0.6.2"
         | 
| 20 20 | 
             
              end
         | 
| 21 21 | 
             
            end
         | 
| @@ -414,12 +414,6 @@ class TestResponseSelectCommandVersion1 < Test::Unit::TestCase | |
| 414 414 | 
             
                    create_response(body).slices
         | 
| 415 415 | 
             
                  end
         | 
| 416 416 |  | 
| 417 | 
            -
                  def build_drilldown(label, n_hits, records)
         | 
| 418 | 
            -
                    Groonga::Client::Response::Select::Drilldown.new(label,
         | 
| 419 | 
            -
                                                                     n_hits,
         | 
| 420 | 
            -
                                                                     records)
         | 
| 421 | 
            -
                  end
         | 
| 422 | 
            -
             | 
| 423 417 | 
             
                  def collect_values(body)
         | 
| 424 418 | 
             
                    values = {}
         | 
| 425 419 | 
             
                    slices(body).each do |label, slice|
         | 
| @@ -284,6 +284,7 @@ class TestResponseSelectCommandVersion3 < Test::Unit::TestCase | |
| 284 284 | 
             
                  def setup
         | 
| 285 285 | 
             
                    pair_arguments = {
         | 
| 286 286 | 
             
                      "slices[groonga].filter" => 'tag @ "groonga"',
         | 
| 287 | 
            +
                      "slices[groonga].drilldowns[author].keys" => "author",
         | 
| 287 288 | 
             
                    }
         | 
| 288 289 | 
             
                    @command = Groonga::Command::Select.new("select", pair_arguments)
         | 
| 289 290 | 
             
                    @body = {
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            # Copyright (C) 2018  Kouhei  | 
| 1 | 
            +
            # Copyright (C) 2018-2019  Sutou Kouhei <kou@clear-code.com>
         | 
| 2 2 | 
             
            #
         | 
| 3 3 | 
             
            # This library is free software; you can redistribute it and/or
         | 
| 4 4 | 
             
            # modify it under the terms of the GNU Lesser General Public
         | 
| @@ -19,8 +19,18 @@ require "response/helper" | |
| 19 19 | 
             
            class TestResponseSelectTSV < Test::Unit::TestCase
         | 
| 20 20 | 
             
              include TestResponseHelper
         | 
| 21 21 |  | 
| 22 | 
            -
              def drilldown( | 
| 23 | 
            -
             | 
| 22 | 
            +
              def drilldown(label,
         | 
| 23 | 
            +
                            keys,
         | 
| 24 | 
            +
                            n_hits,
         | 
| 25 | 
            +
                            records,
         | 
| 26 | 
            +
                            raw_columns,
         | 
| 27 | 
            +
                            raw_records)
         | 
| 28 | 
            +
                Groonga::Client::Response::Select::Drilldown.new(label,
         | 
| 29 | 
            +
                                                                 keys,
         | 
| 30 | 
            +
                                                                 n_hits,
         | 
| 31 | 
            +
                                                                 records,
         | 
| 32 | 
            +
                                                                 raw_columns,
         | 
| 33 | 
            +
                                                                 raw_records)
         | 
| 24 34 | 
             
              end
         | 
| 25 35 |  | 
| 26 36 | 
             
              def test_error
         | 
| @@ -113,7 +123,19 @@ END | |
| 113 123 | 
             
                               :elapsed_time => 0.0,
         | 
| 114 124 | 
             
                               :records => [],
         | 
| 115 125 | 
             
                               :drilldowns => [
         | 
| 116 | 
            -
                                 drilldown("version", | 
| 126 | 
            +
                                 drilldown("version",
         | 
| 127 | 
            +
                                           ["version"],
         | 
| 128 | 
            +
                                           7,
         | 
| 129 | 
            +
                                           drilldown_records,
         | 
| 130 | 
            +
                                           [
         | 
| 131 | 
            +
                                             ["_key", "ShortText"],
         | 
| 132 | 
            +
                                             ["_nsubrecs", "UInt32"],
         | 
| 133 | 
            +
                                           ],
         | 
| 134 | 
            +
                                           [
         | 
| 135 | 
            +
                                             ["2.2.0", "18044"],
         | 
| 136 | 
            +
                                             ["2.3.0", "18115"],
         | 
| 137 | 
            +
                                             ["2.4.0", "14594"],
         | 
| 138 | 
            +
                                           ]),
         | 
| 117 139 | 
             
                               ],
         | 
| 118 140 | 
             
                             },
         | 
| 119 141 | 
             
                             {
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            # Copyright (C) 2017  Kouhei  | 
| 1 | 
            +
            # Copyright (C) 2017-2019  Sutou Kouhei <kou@clear-code.com>
         | 
| 2 2 | 
             
            #
         | 
| 3 3 | 
             
            # This library is free software; you can redistribute it and/or
         | 
| 4 4 | 
             
            # modify it under the terms of the GNU Lesser General Public
         | 
| @@ -19,8 +19,18 @@ require "response/helper" | |
| 19 19 | 
             
            class TestResponseSelectXML < Test::Unit::TestCase
         | 
| 20 20 | 
             
              include TestResponseHelper
         | 
| 21 21 |  | 
| 22 | 
            -
              def drilldown( | 
| 23 | 
            -
             | 
| 22 | 
            +
              def drilldown(label,
         | 
| 23 | 
            +
                            keys,
         | 
| 24 | 
            +
                            n_hits,
         | 
| 25 | 
            +
                            records,
         | 
| 26 | 
            +
                            raw_columns,
         | 
| 27 | 
            +
                            raw_records)
         | 
| 28 | 
            +
                Groonga::Client::Response::Select::Drilldown.new(label,
         | 
| 29 | 
            +
                                                                 keys,
         | 
| 30 | 
            +
                                                                 n_hits,
         | 
| 31 | 
            +
                                                                 records,
         | 
| 32 | 
            +
                                                                 raw_columns,
         | 
| 33 | 
            +
                                                                 raw_records)
         | 
| 24 34 | 
             
              end
         | 
| 25 35 |  | 
| 26 36 | 
             
              def test_basic
         | 
| @@ -91,7 +101,19 @@ class TestResponseSelectXML < Test::Unit::TestCase | |
| 91 101 | 
             
                               :elapsed_time => 0.0,
         | 
| 92 102 | 
             
                               :records => [],
         | 
| 93 103 | 
             
                               :drilldowns => [
         | 
| 94 | 
            -
                                 drilldown("version", | 
| 104 | 
            +
                                 drilldown("version",
         | 
| 105 | 
            +
                                           ["version"],
         | 
| 106 | 
            +
                                           7,
         | 
| 107 | 
            +
                                           drilldown_records,
         | 
| 108 | 
            +
                                           [
         | 
| 109 | 
            +
                                             ["_key", "ShortText"],
         | 
| 110 | 
            +
                                             ["_nsubrecs", "ShortText"],
         | 
| 111 | 
            +
                                           ],
         | 
| 112 | 
            +
                                           [
         | 
| 113 | 
            +
                                             ["2.2.0", "18044"],
         | 
| 114 | 
            +
                                             ["2.3.0", "18115"],
         | 
| 115 | 
            +
                                             ["2.4.0", "14594"],
         | 
| 116 | 
            +
                                           ]),
         | 
| 95 117 | 
             
                               ],
         | 
| 96 118 | 
             
                             },
         | 
| 97 119 | 
             
                             {
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: groonga-client
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.6. | 
| 4 | 
            +
              version: 0.6.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Haruka Yoshihara
         | 
| @@ -10,7 +10,7 @@ authors: | |
| 10 10 | 
             
            autorequire: 
         | 
| 11 11 | 
             
            bindir: bin
         | 
| 12 12 | 
             
            cert_chain: []
         | 
| 13 | 
            -
            date: 2019- | 
| 13 | 
            +
            date: 2019-09-02 00:00:00.000000000 Z
         | 
| 14 14 | 
             
            dependencies:
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 16 16 | 
             
              name: gqtp
         | 
| @@ -32,14 +32,14 @@ dependencies: | |
| 32 32 | 
             
                requirements:
         | 
| 33 33 | 
             
                - - ">="
         | 
| 34 34 | 
             
                  - !ruby/object:Gem::Version
         | 
| 35 | 
            -
                    version: 1. | 
| 35 | 
            +
                    version: 1.4.5
         | 
| 36 36 | 
             
              type: :runtime
         | 
| 37 37 | 
             
              prerelease: false
         | 
| 38 38 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 39 39 | 
             
                requirements:
         | 
| 40 40 | 
             
                - - ">="
         | 
| 41 41 | 
             
                  - !ruby/object:Gem::Version
         | 
| 42 | 
            -
                    version: 1. | 
| 42 | 
            +
                    version: 1.4.5
         | 
| 43 43 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 44 44 | 
             
              name: groonga-command-parser
         | 
| 45 45 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -209,6 +209,7 @@ files: | |
| 209 209 | 
             
            - lib/groonga/client/response/column-rename.rb
         | 
| 210 210 | 
             
            - lib/groonga/client/response/defrag.rb
         | 
| 211 211 | 
             
            - lib/groonga/client/response/delete.rb
         | 
| 212 | 
            +
            - lib/groonga/client/response/drilldownable.rb
         | 
| 212 213 | 
             
            - lib/groonga/client/response/dump.rb
         | 
| 213 214 | 
             
            - lib/groonga/client/response/error.rb
         | 
| 214 215 | 
             
            - lib/groonga/client/response/load.rb
         | 
| @@ -216,9 +217,12 @@ files: | |
| 216 217 | 
             
            - lib/groonga/client/response/log-level.rb
         | 
| 217 218 | 
             
            - lib/groonga/client/response/log-put.rb
         | 
| 218 219 | 
             
            - lib/groonga/client/response/log-reopen.rb
         | 
| 220 | 
            +
            - lib/groonga/client/response/logical-range-filter.rb
         | 
| 221 | 
            +
            - lib/groonga/client/response/logical-select.rb
         | 
| 219 222 | 
             
            - lib/groonga/client/response/quit.rb
         | 
| 220 223 | 
             
            - lib/groonga/client/response/register.rb
         | 
| 221 224 | 
             
            - lib/groonga/client/response/schema.rb
         | 
| 225 | 
            +
            - lib/groonga/client/response/searchable.rb
         | 
| 222 226 | 
             
            - lib/groonga/client/response/select.rb
         | 
| 223 227 | 
             
            - lib/groonga/client/response/status.rb
         | 
| 224 228 | 
             
            - lib/groonga/client/response/table-create.rb
         |