Method: CouchDiff#initialize

Defined in:
lib/couchdiff.rb

#initialize(src_docs, dst_docs, &changed) ⇒ CouchDiff

Returns a new instance of CouchDiff.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/couchdiff.rb', line 42

def initialize src_docs, dst_docs, &changed
  # default behavior is to compare all fields besides the _rev and revpos field
  changed ||= proc{ |doc1, doc2| doc1.diff(doc2, EXCLUDED_KEYS).size > 0 }

  @added, @updated, @deleted, @unchanged = [], [], [], []

  dst_doc_map, src_doc_map = {}, {}

  # create hash maps for fast lookup
  src_docs.each {|doc| src_doc_map[doc['id']] = doc; assert_doc(doc)}
  dst_docs.each {|doc| dst_doc_map[doc['id']] = doc; assert_doc(doc)}

  # updated/added docs
  src_docs.each do |doc|
    id = doc['id']
    if !(dst_doc = dst_doc_map[id]).nil?
      if changed.yield(doc['doc'], dst_doc['doc']) || attachments_changed(doc['doc'], dst_doc['doc'])
        @updated << [doc, dst_doc]
      else
        @unchanged << doc
      end
    else
      @added << doc
    end
  end

  # deleted docs
  dst_docs.each do |doc|
    id = doc['id']
    @deleted << doc unless src_doc_map[id]
  end
end