# File lib/addressable/uri.rb, line 1502
    def query_values=(new_query_values)
      if new_query_values == nil
        self.query = nil
        return nil
      end

      if !new_query_values.is_a?(Array)
        if !new_query_values.respond_to?(:to_hash)
          raise TypeError,
            "Can't convert #{new_query_values.class} into Hash."
        end
        new_query_values = new_query_values.to_hash
        new_query_values = new_query_values.map do |key, value|
          key = key.to_s if key.kind_of?(Symbol)
          [key, value]
        end
        # Useful default for OAuth and caching.
        # Only to be used for non-Array inputs. Arrays should preserve order.
        new_query_values.sort!
      end

      ##
      # Joins and converts parent and value into a properly encoded and
      # ordered URL query.
      #
      # @private
      # @param [String] parent an URI encoded component.
      # @param [Array, Hash, Symbol, #to_str] value
      #
      # @return [String] a properly escaped and ordered URL query.
      to_query = lambda do |parent, value|
        if value.is_a?(Hash)
          value = value.map do |key, val|
            [
              URI.encode_component(key, CharacterClasses::UNRESERVED),
              val
            ]
          end
          value.sort!
          buffer = ""
          value.each do |key, val|
            new_parent = "#{parent}[#{key}]"
            buffer << "#{to_query.call(new_parent, val)}&"
          end
          return buffer.chop
        elsif value.is_a?(Array)
          buffer = ""
          value.each_with_index do |val, i|
            new_parent = "#{parent}[#{i}]"
            buffer << "#{to_query.call(new_parent, val)}&"
          end
          return buffer.chop
        elsif value == true
          return parent
        else
          encoded_value = URI.encode_component(
            value, CharacterClasses::UNRESERVED
          )
          return "#{parent}=#{encoded_value}"
        end
      end

      # new_query_values have form [['key1', 'value1'], ['key2', 'value2']]
      buffer = ""
      new_query_values.each do |parent, value|
        encoded_parent = URI.encode_component(
          parent, CharacterClasses::UNRESERVED
        )
        buffer << "#{to_query.call(encoded_parent, value)}&"
      end
      self.query = buffer.chop
    end