class RSolr::Xml::Generator

def add data, add_attrs = nil, &block


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

end
nickname.attrs[:boost] = 20 if nickname.value=='Tim' # boost a field
nickname = doc_msg.field_by_name(:nickname)
doc_msg.attrs[:boost] = 10.00 # boost the document
solr.add({:id=>1, :nickname=>'Tim'}, {:boost=>5.0, :commitWithin=>1.0}) do |doc_msg|

For example:

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

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

If a value is an array, multiple fields will be created.
- each hash should be a simple key=>value pair representing a solr doc.
"data" can be a hash or an array of hashes.
generates "add" xml for updating solr
def add data, add_attrs = nil, &block
  add_attrs ||= {}
  data = [data] unless data.is_a?(Array)
  build do |xml|
    xml.add(add_attrs) do |add_node|
      data.each do |doc|
        doc = RSolr::Xml::Document.new(doc) if doc.respond_to?(:each_pair)
        yield doc if block_given?
        add_node.doc(doc.attrs) do |doc_node|
          doc.fields.each do |field_obj|
            doc_node.field field_obj.value, field_obj.attrs
          end
        end
      end
    end
  end
end

def build &block

def build &block
  require 'builder'
  b = ::Builder::XmlMarkup.new(:indent => 0, :margin => 0, :encoding => 'UTF-8')
  b.instruct!
  block_given? ? yield(b) : b
end

def commit opts = nil

generates a message
def commit opts = nil
  opts ||= {}
  build {|xml| xml.commit(opts) }
end

def delete_by_id ids

"ids" can be a single value or array of values
generates a ID message
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

def delete_by_query(queries)

"queries" can be a single value or an array of values
generates a ID message
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

def optimize opts = nil

generates a message
def optimize opts = nil
  opts ||= {}
  build {|xml| xml.optimize(opts) }
end

def rollback

generates a message
def rollback
  build {|xml| xml.rollback({}) }
end