Module: RSolr::Connection::Utils

Included in:
Direct, NetHttp
Defined in:
lib/rsolr/connection.rb

Overview

Helpful utility methods for building queries to a Solr server

Instance Method Summary collapse

Instance Method Details

#build_param(k, v) ⇒ Object

converts a key value pair to an escaped string: Example: build_param(:id, 1) == “id=1”



46
47
48
# File 'lib/rsolr/connection.rb', line 46

def build_param(k,v)
  "#{escape(k)}=#{escape(v)}"
end

#build_url(url = '', params = {}, string_query = '') ⇒ Object

creates and returns a url as a string “url” is the base url “params” is an optional hash of GET style query params “string_query” is an extra query string that will be appended to the result of “url” and “params”.



36
37
38
39
40
41
# File 'lib/rsolr/connection.rb', line 36

def build_url url='', params={}, string_query=''
  queries = [string_query, hash_to_query(params)]
  queries.delete_if{|i| i.to_s.empty?}
  url += "?#{queries.join('&')}" unless queries.empty?
  url
end

#bytesize(string) ⇒ Object



22
23
24
# File 'lib/rsolr/connection.rb', line 22

def bytesize(string)
  string.bytesize
end

#escape(s) ⇒ Object

Performs URI escaping so that you can construct proper query strings faster. Use this rather than the cgi.rb version since it’s faster. (Stolen from Rack).



12
13
14
15
16
17
# File 'lib/rsolr/connection.rb', line 12

def escape(s)
  s.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/n) {
    #'%'+$1.unpack('H2'*$1.size).join('%').upcase
    '%'+$1.unpack('H2'*bytesize($1)).join('%').upcase
  }.tr(' ', '+')
end

#hash_to_query(params) ⇒ Object

converts hash into URL query string, keys get an alpha sort if a value is an array, the array values get mapped to the same key:

hash_to_query(:q=>'blah', :fq=>['blah', 'blah'], :facet=>{:field=>['location_facet', 'format_facet']})

returns:

?q=blah&fq=blah&fq=blah&facet.field=location_facet&facet.field=format.facet

if a value is empty/nil etc., it is not added



58
59
60
61
62
63
64
65
66
67
68
# File 'lib/rsolr/connection.rb', line 58

def hash_to_query(params)
  mapped = params.map do |k, v|
    next if v.to_s.empty?
    if v.class == Array
      hash_to_query(v.map { |x| [k, x] })
    else
      build_param k, v
    end
  end
  mapped.compact.join("&")
end