Module: Curator::Repository::ClassMethods

Defined in:
lib/curator/repository.rb

Instance Method Summary collapse

Instance Method Details

#_build_finder_methods(field_name) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
# File 'lib/curator/repository.rb', line 85

def _build_finder_methods(field_name)
  eigenclass = class << self; self; end
  eigenclass.class_eval do
    define_method("find_by_#{field_name}") do |value|
      _find_by_index(collection_name, field_name, value)
    end
    define_method("find_first_by_#{field_name}") do |value|
      _find_by_index(collection_name, field_name, value).first
    end
  end
end

#_deserialize(id, data) ⇒ Object



109
110
111
112
113
114
115
116
# File 'lib/curator/repository.rb', line 109

def _deserialize(id, data)
  attributes = data.with_indifferent_access
  migrated_attributes = migrator.migrate(attributes)
  migrated_attributes[:id] = id
  migrated_attributes[:created_at] = Time.parse(migrated_attributes[:created_at]) if migrated_attributes[:created_at]
  migrated_attributes[:updated_at] = Time.parse(migrated_attributes[:updated_at]) if migrated_attributes[:updated_at]
  deserialize(migrated_attributes)
end

#_find_by_index(collection_name, field_name, value) ⇒ Object



97
98
99
100
101
102
103
# File 'lib/curator/repository.rb', line 97

def _find_by_index(collection_name, field_name, value)
  if results = data_store.find_by_index(collection_name, field_name, value)
    results.map do |hash|
      _deserialize(hash[:key], hash[:data])
    end
  end
end

#_format_time_for_index(time) ⇒ Object



118
119
120
# File 'lib/curator/repository.rb', line 118

def _format_time_for_index(time)
  time.to_json.gsub('"', '')
end

#_indexed_fieldsObject



122
123
124
# File 'lib/curator/repository.rb', line 122

def _indexed_fields
  @indexed_fields || []
end

#_indexes(object) ⇒ Object



126
127
128
129
130
131
132
133
134
# File 'lib/curator/repository.rb', line 126

def _indexes(object)
  index_values = _indexed_fields.map { |field| [field, object.send(field)] }
  index_values += [
    [:created_at, _format_time_for_index(object.send(:created_at))],
    [:updated_at, _format_time_for_index(object.send(:updated_at))],
    [:version, object.version]
  ]
  Hash[index_values]
end

#_serialize(object) ⇒ Object



136
137
138
# File 'lib/curator/repository.rb', line 136

def _serialize(object)
  serialize(object).reject { |key, val| val.nil? }.merge(:version => object.version)
end

#_update_timestamps(object) ⇒ Object



140
141
142
143
# File 'lib/curator/repository.rb', line 140

def _update_timestamps(object)
  object.updated_at = Time.now.utc
  object.created_at ||= object.updated_at
end

#collection_nameObject



11
12
13
# File 'lib/curator/repository.rb', line 11

def collection_name
  ActiveSupport::Inflector.tableize(klass)
end

#data_storeObject



15
16
17
# File 'lib/curator/repository.rb', line 15

def data_store
  @data_store ||= Curator.data_store
end

#data_store=(store) ⇒ Object



19
20
21
# File 'lib/curator/repository.rb', line 19

def data_store=(store)
  @data_store = store
end

#delete(object) ⇒ Object



23
24
25
# File 'lib/curator/repository.rb', line 23

def delete(object)
  data_store.delete(collection_name, object.id)
end

#deserialize(attributes) ⇒ Object



105
106
107
# File 'lib/curator/repository.rb', line 105

def deserialize(attributes)
  klass.new(attributes)
end

#find_by_created_at(start_time, end_time) ⇒ Object



27
28
29
# File 'lib/curator/repository.rb', line 27

def find_by_created_at(start_time, end_time)
  _find_by_index(collection_name, :created_at, _format_time_for_index(start_time).._format_time_for_index(end_time))
end

#find_by_id(id) ⇒ Object



39
40
41
42
43
# File 'lib/curator/repository.rb', line 39

def find_by_id(id)
  if hash = data_store.find_by_key(collection_name, id)
    _deserialize(hash[:key], hash[:data])
  end
end

#find_by_updated_at(start_time, end_time) ⇒ Object



31
32
33
# File 'lib/curator/repository.rb', line 31

def find_by_updated_at(start_time, end_time)
  _find_by_index(collection_name, :updated_at, _format_time_for_index(start_time).._format_time_for_index(end_time))
end

#find_by_version(version) ⇒ Object



35
36
37
# File 'lib/curator/repository.rb', line 35

def find_by_version(version)
  _find_by_index(collection_name, :version, version)
end

#indexed_fields(*fields) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/curator/repository.rb', line 45

def indexed_fields(*fields)
  @indexed_fields = fields

  @indexed_fields.each do |field_name|
    _build_finder_methods(field_name)
  end
end

#klassObject



53
54
55
# File 'lib/curator/repository.rb', line 53

def klass
  name.to_s.gsub("Repository", "").constantize
end

#migratorObject



57
58
59
# File 'lib/curator/repository.rb', line 57

def migrator
  @migrator ||= Curator::Migrator.new(collection_name)
end

#save(object) ⇒ Object



61
62
63
64
# File 'lib/curator/repository.rb', line 61

def save(object)
  object.touch
  save_without_timestamps(object)
end

#save_without_timestamps(object) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/curator/repository.rb', line 66

def save_without_timestamps(object)
  hash = {
    :collection_name => collection_name,
    :value => _serialize(object),
    :index => _indexes(object)
  }

  if object.id
    hash[:key] = object.id
    data_store.save(hash)
  else
    object.instance_variable_set("@id", data_store.save(hash).key)
  end
end

#serialize(object) ⇒ Object



81
82
83
# File 'lib/curator/repository.rb', line 81

def serialize(object)
  object.instance_values
end