Sha256: 320fb908e9f79d318e39ddaafab4cdc9181bc5afc87510db69fd7ce141a1e418

Contents?: true

Size: 1.91 KB

Versions: 30

Compression:

Stored size: 1.91 KB

Contents

require 'dolly/bulk_error'

module Dolly
  class BulkDocument
    include Enumerable
    extend Forwardable

    DOC_NAME  = "_bulk_docs".freeze

    attr_reader :payload, :database
    attr_accessor :errors, :response

    def_delegators :docs, :[], :<<

    def initialize database, ary = []
      @database = database
      @payload = Hash.new
      self.payload[:docs] = ary
    end

    def docs
      self.payload[:docs]
    end

    def save
      return if docs.empty?
      self.response = JSON::parse self.database.post(DOC_NAME, json_payload)
      build_errors
      update_revs
    end

    def delete
      return if docs.empty?
      JSON::parse database.post DOC_NAME, json_payload("_deleted" => true)
    end

    def clear
      self.payload[:docs] = []
      self.response = []
      self.errors = []
    end

    def with_errors?
      response_errors.present?
    end

    private
    def update_revs
      self.response.each do |doc|
        next if doc['error']
        item = self.payload[:docs].detect{|d| d.id == doc['id']}
        if item.nil?
          self.errors << BulkError.new({"error" => "Document saved but not local rev updated.", "reason" => "Document with id #{doc['id']} on bulk doc was not found in payload.", "obj" => nil})
          next
        end
        item.doc['_rev'] = doc['rev']
        self.payload[:docs].delete item
      end
      clean_response
    end

    def clean_response
      self.response.delete_if {|doc| !doc['error'] }
    end

    def build_errors
      self.errors = response_errors.map do |err|
        obj = self.payload[:docs].detect{|d| d.id == err['id']} if err['id']
        BulkError.new err.merge!("obj" => obj)
      end
    end

    def bare_docs
      self.payload[:docs].map(&:doc)
    end

    def json_payload opts = {}
      {docs: bare_docs.map{|d| d.merge(opts)} }.to_json
    end

    def response_errors
      self.response.select{|d| d['error']}
    end
  end
end

Version data entries

30 entries across 30 versions & 1 rubygems

Version Path
dolly-1.1.7 lib/dolly/bulk_document.rb
dolly-1.1.6 lib/dolly/bulk_document.rb
dolly-1.1.5 lib/dolly/bulk_document.rb
dolly-1.1.4 lib/dolly/bulk_document.rb
dolly-1.1.3 lib/dolly/bulk_document.rb
dolly-1.1.2 lib/dolly/bulk_document.rb
dolly-1.1.1 lib/dolly/bulk_document.rb
dolly-1.1.0 lib/dolly/bulk_document.rb
dolly-1.0.1 lib/dolly/bulk_document.rb
dolly-1.0.0 lib/dolly/bulk_document.rb
dolly-0.9.0 lib/dolly/bulk_document.rb
dolly-0.8.1 lib/dolly/bulk_document.rb
dolly-0.8.0 lib/dolly/bulk_document.rb
dolly-0.7.6 lib/dolly/bulk_document.rb
dolly-0.7.5 lib/dolly/bulk_document.rb
dolly-0.7.3 lib/dolly/bulk_document.rb
dolly-0.7.2 lib/dolly/bulk_document.rb
dolly-0.7.1 lib/dolly/bulk_document.rb
dolly-0.7.0 lib/dolly/bulk_document.rb
dolly-0.6.2 lib/dolly/bulk_document.rb