elasticsearch-persistence/lib/elasticsearch/persistence/repository/find.rb (40 lines of code) (raw):

# Licensed to Elasticsearch B.V. under one or more contributor # license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright # ownership. Elasticsearch B.V. licenses this file to you under # the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. module Elasticsearch module Persistence module Repository class DocumentNotFound < StandardError; end # Retrieves one or more domain objects from the repository # module Find # Retrieve a single object or multiple objects from Elasticsearch by ID or IDs # # @example Retrieve a single object by ID # # repository.find(1) # # => <Note ...> # # @example Retrieve multiple objects by IDs # # repository.find(1, 2) # # => [<Note ...>, <Note ...> # # @return [Object,Array] # def find(*args) options = args.last.is_a?(Hash) ? args.pop : {} ids = args if args.size == 1 id = args.pop id.is_a?(Array) ? __find_many(id, options) : __find_one(id, options) else __find_many args, options end end # Return if object exists in the repository # # @example # # repository.exists?(1) # => true # # @param [ String, Integer ] id The id to search. # @param [ Hash ] options The options. # # @return [true, false] # def exists?(id, options={}) request = { index: index_name, id: id } client.exists(request.merge(options)) end private # The key for accessing the document found and returned from an # Elasticsearch _mget query. # DOCS = 'docs'.freeze # The key for the boolean value indicating whether a particular id # has been successfully found in an Elasticsearch _mget query. # FOUND = 'found'.freeze # @api private # def __find_one(id, options={}) request = { index: index_name, id: id } document = client.get(request.merge(options)) deserialize(document) rescue Elastic::Transport::Transport::Errors::NotFound => e raise DocumentNotFound, e.message, caller end # @api private # def __find_many(ids, options={}) request = { index: index_name, body: { ids: ids } } documents = client.mget(request.merge(options)) documents[DOCS].map do |document| deserialize(document) if document[FOUND] end end end end end end