Method: SolrQuery.build

Defined in:
lib/solr_query.rb

.build(conditions = {}, keyword_key = :keyword) ⇒ Object

build a query for solr

SolrQuery.build(:keyword => "Feather duster")
=> "feather duster"

SolrQuery.build(:keyword => "clean", :organisation => [organisation1, organisation2])
=> "clean AND organisation:(275 OR 6534)"

SolrQuery.build(:colour => ["red", "pink"], :item_type => ["Toy", "Train"])
=> "colour:(red OR pink) AND item_type:(Toy OR Train)"

or you can specify a different magical key for keyword;

SolrQuery.build({:keyword => "old one", :new_keyword => "new one"}, :new_keyword)
=> "new one AND keyword:(old one)"

if you need to do range queries;

SolrQuery.build(:salary => {:min => "010000", :max => "050000"})
=> "salary:([010000 TO 050000])"

SolrQuery.build(:salary => "010000".."050000")
=> "salary:([010000 TO 050000])"

SolrQuery.build(:surname => {:min => "jacobs")
=> "surname:([jacobs TO *])"


28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/solr_query.rb', line 28

def build(conditions = {}, keyword_key=:keyword)
  conditions = conditions.dup # let's not accidentally kill our original params
  query_parts = []
  keyword = conditions.delete(keyword_key) # keyword is magical
  if !blank?(keyword) # ie. !keyword.blank?
    query_parts << "#{solr_value(keyword, :downcase => true)}"
  end

  conditions.each do |field, value|
    unless value.nil?
      query_parts << "#{field}:(#{solr_value(value)})"
    end
  end
  
  if query_parts.empty?
    return ""
  else
    return query_parts.join(" AND ")
  end
end