Class: RSolr::Message::Generator

Inherits:
Object
  • Object
show all
Defined in:
lib/rsolr/message/generator.rb

Instance Method Summary collapse

Instance Method Details

#add(data, add_attrs = {}, &block) ⇒ Object

generates “add” xml for updating solr “data” can be a hash or an array of hashes.

  • each hash should be a simple key=>value pair representing a solr doc.

If a value is an array, multiple fields will be created.

“add_attrs” can be a hash for setting the add xml element attributes.

This method can also accept a block. The value yielded to the block is a Message::Document; for each solr doc in “data”. You can set xml element attributes for each “doc” element or individual “field” elements.

For example:

solr.add(:nickname=>‘Tim’, :commitWithin=>1.0) do |doc_msg|

doc_msg.attrs[:boost] = 10.00 # boost the document
nickname = doc_msg.field_by_name(:nickname)
nickname.attrs[:boost] = 20 if nickname.value=='Tim' # boost a field

end

would result in an add element having the attributes boost=“10.0” and a commitWithin=“1.0”. Each doc element would have a boost=“10.0”. The “nickname” field would have a boost=“20.0” if the doc had a “nickname” field with the value of “Tim”.



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/rsolr/message/generator.rb', line 35

def add data, add_attrs={}, &block
  data = [data] unless data.is_a?(Array)
  build do |xml|
    xml.add(add_attrs) { #do |add_node|
      data.each do |doc|
        doc = RSolr::Message::Document.new(doc) if doc.respond_to?(:each_pair)
        yield doc if block_given?
        xml.doc_(doc.attrs) {
          doc.fields.each do |field_obj|
            xml.field(field_obj.attrs) {
              text field_obj.value
            }
          end
        }
      end
    }
  end
end

#build {|b| ... } ⇒ Object

Yields:

  • (b)


3
4
5
6
7
8
# File 'lib/rsolr/message/generator.rb', line 3

def build &block
  require 'nokogiri'
  b = Nokogiri::XML::Builder.new(:encoding => 'UTF-8')
  yield(b) if block_given?
  b.to_xml(:indent => 0)
end

#commit(opts = {}) ⇒ Object

generates a <commit/> message



55
56
57
# File 'lib/rsolr/message/generator.rb', line 55

def commit(opts={})
  build {|xml| xml.commit opts}
end

#delete_by_id(ids) ⇒ Object

generates a <delete><id>ID</id></delete> message “ids” can be a single value or array of values



71
72
73
74
75
76
77
78
# File 'lib/rsolr/message/generator.rb', line 71

def delete_by_id(ids)
  ids = [ids] unless ids.is_a?(Array)
  build do |xml|
    xml.delete do |delete_node|
      ids.each { |id| delete_node.id(id) }
    end
  end
end

#delete_by_query(queries) ⇒ Object

generates a <delete><query>ID</query></delete> message “queries” can be a single value or an array of values



82
83
84
85
86
87
88
89
# File 'lib/rsolr/message/generator.rb', line 82

def delete_by_query(queries)
  queries = [queries] unless queries.is_a?(Array)
  build do |xml|
    xml.delete do |delete_node|
      queries.each { |query| delete_node.query query }
    end
  end
end

#optimize(opts = {}) ⇒ Object

generates a <optimize/> message



60
61
62
# File 'lib/rsolr/message/generator.rb', line 60

def optimize(opts={})
  build {|xml| xml.optimize opts}
end

#rollback(opts = {}) ⇒ Object

generates a <rollback/> message



65
66
67
# File 'lib/rsolr/message/generator.rb', line 65

def rollback opts={}
  build {|xml| xml.rollback opts}
end