module Mumukit::Service::Collection

Public Instance Methods

all() click to toggle source
# File lib/mumukit/service/collection.rb, line 8
def all
  project
end
any?(criteria) click to toggle source
# File lib/mumukit/service/collection.rb, line 16
def any?(criteria)
  mongo_collection.find(criteria).count > 0
end
count() click to toggle source
# File lib/mumukit/service/collection.rb, line 12
def count
  mongo_collection.find.count
end
delete!(id) click to toggle source
# File lib/mumukit/service/collection.rb, line 24
def delete!(id)
  mongo_collection.delete_one(id: id)
end
exists?(id) click to toggle source
# File lib/mumukit/service/collection.rb, line 20
def exists?(id)
  any?(id: id)
end
find(id) click to toggle source
# File lib/mumukit/service/collection.rb, line 28
def find(id)
  find_by(id: id)
end
find!(id) click to toggle source
# File lib/mumukit/service/collection.rb, line 37
def find!(id)
  find_by!(id: id)
end
find_by(args) click to toggle source
# File lib/mumukit/service/collection.rb, line 32
def find_by(args)
  _find_by(args).
      try { |it| wrap it }
end
find_by!(args) click to toggle source
# File lib/mumukit/service/collection.rb, line 41
def find_by!(args)
  _find_by(args).
      tap { |first| validate_presence(args, first) }.
      try { |it| wrap it }
end
first_by(args, options, projection={}) click to toggle source
# File lib/mumukit/service/collection.rb, line 77
def first_by(args, options, projection={})
  find_projection(args, projection).sort(options).first.try { |it| wrap(it) }
end
id_for_query(query) click to toggle source
# File lib/mumukit/service/collection.rb, line 64
def id_for_query(query)
  mongo_collection.find(query).projection(id: 1).first.try { |it| it[:id] }
end
insert!(json) click to toggle source
# File lib/mumukit/service/collection.rb, line 47
def insert!(json)
  json.validate!

  with_id new_id do |id|
    mongo_collection.insert_one json.raw.merge(id)
  end
end
method_missing(name, *args, &block) click to toggle source
# File lib/mumukit/service/collection.rb, line 4
def method_missing(name, *args, &block)
  mongo_collection.send(name, *args, &block)
end
migrate!(query={}) { |document| ... } click to toggle source
# File lib/mumukit/service/collection.rb, line 86
def migrate!(query={})
  where(query).each do |document|
    yield document
    upsert_by! :id, document
  end
end
order_by(args, options, projection={}) click to toggle source
# File lib/mumukit/service/collection.rb, line 81
def order_by(args, options, projection={})
  raw = find_projection(args, projection).sort(options).map { |it| wrap(it) }
  wrap_array raw
end
uniq(key, filter, uniq_value) click to toggle source
# File lib/mumukit/service/collection.rb, line 68
def uniq(key, filter, uniq_value)
  distinct(key, filter).uniq { |result| result[uniq_value] }
end
update_attributes!(query, attribute) click to toggle source
# File lib/mumukit/service/collection.rb, line 97
def update_attributes!(query, attribute)
  mongo_collection.update_one query, '$set': attribute
end
upsert_attributes!(query, attribute) click to toggle source
# File lib/mumukit/service/collection.rb, line 93
def upsert_attributes!(query, attribute)
  mongo_collection.update_one query, {'$set': attribute}, {upsert: true}
end
upsert_by!(field, document) click to toggle source
# File lib/mumukit/service/collection.rb, line 55
def upsert_by!(field, document)
  query = {field => document[field]}
  document.validate!

  with_id(id_for_query(query) || new_id) do |id|
    upsert_attributes!(query, document.raw.merge(id))
  end
end
where(args, projection={}) click to toggle source
# File lib/mumukit/service/collection.rb, line 72
def where(args, projection={})
  raw = find_projection(args, projection).map { |it| wrap it }
  wrap_array raw
end

Private Instance Methods

_find_by(args) click to toggle source
# File lib/mumukit/service/collection.rb, line 107
def _find_by(args)
  mongo_collection.find(args).projection(_id: 0).first
end
find_projection(args={}, projection={}) click to toggle source
# File lib/mumukit/service/collection.rb, line 115
def find_projection(args={}, projection={})
  mongo_collection.find(args).projection(projection.merge(_id: 0))
end
mongo_collection() click to toggle source
# File lib/mumukit/service/collection.rb, line 111
def mongo_collection
  mongo_database.client[mongo_collection_name]
end
new_id() click to toggle source
# File lib/mumukit/service/collection.rb, line 135
def new_id
  Mumukit::Service::IdGenerator.next
end
project(&block) click to toggle source
# File lib/mumukit/service/collection.rb, line 119
def project(&block)
  raw = find_projection.map { |it| wrap it }

  raw = raw.select(&block) if block_given?

  wrap_array raw
end
validate_presence(args, first) click to toggle source
# File lib/mumukit/service/collection.rb, line 103
def validate_presence(args, first)
  raise Mumukit::Service::DocumentNotFoundError, "document #{args.to_json} not found" unless first
end
with_id(id) { |id_object| ... } click to toggle source
# File lib/mumukit/service/collection.rb, line 139
def with_id(id)
  id_object = {id: id}
  yield id_object
  id_object
end
wrap(mongo_document) click to toggle source
# File lib/mumukit/service/collection.rb, line 127
def wrap(mongo_document)
  Mumukit::Service::Document.new mongo_document
end
wrap_array(array) click to toggle source
# File lib/mumukit/service/collection.rb, line 131
def wrap_array(array)
  Mumukit::Service::DocumentArray.new array, default_key: mongo_collection_name
end