lib/dolly/mango.rb in dolly-3.0.1 vs lib/dolly/mango.rb in dolly-3.1.0

- old
+ new

@@ -45,37 +45,72 @@ def find_by(query, opts = {}) build_model_from_doc(find_doc_by(query, opts)) end def find_doc_by(query, opts = {}) - raise Dolly::IndexNotFoundError unless index_exists?(query) opts.merge!(limit: 1) - perform_query(build_query(query, opts))[:docs].first + response = perform_query(build_query(query, opts)) + print_index_warning(query) if response.fetch(:warning, nil) + response[:docs].first end def where(query, opts = {}) docs_where(query, opts).map do |doc| build_model_from_doc(doc) end end def docs_where(query, opts = {}) - raise Dolly::IndexNotFoundError unless index_exists?(query) - perform_query(build_query(query, opts))[:docs] + response = perform_query(build_query(query, opts)) + print_index_warning(query) if response.fetch(:warning, nil) + response[:docs] end - private + def find_bare(id, fields, options = {}) + q = { _id: id } + opts = { fields: fields }.merge(options) + query = build_query(q, opts) + response = perform_query(query) + response[:docs] + end - def build_model_from_doc(doc) - return nil if doc.nil? - new(doc.slice(*all_property_keys)) + def where_bare(selector, fields, options = {}) + opts = { fields: fields }.merge(options) + query = build_query(selector, opts) + response = perform_query(query) + response[:docs] end + def find_with_metadata(query, options = {}) + opts = options.merge!(limit: 1) + perform_query(build_query(query, opts)) + end + + def where_with_metadata(query, options = {}) + perform_query(build_query(query, options)) + end + def perform_query(structured_query) connection.post(DESIGN, structured_query) end + private + + def print_index_warning(query) + message = "Index not found for #{query.inspect}" + if (defined?(Rails.logger) && Rails&.env&.development?) + Rails.logger.info(message) + else + puts message + end + end + + def build_model_from_doc(doc) + return nil if doc.nil? + new(doc.slice(*all_property_keys)).tap { |d| d.rev = doc[:_rev] } + end + def build_query(query, opts) { 'selector' => build_selectors(query) }.merge(opts) end def build_selectors(query) @@ -86,18 +121,15 @@ key end end def build_key(key) + return key if key.to_s.starts_with?(SELECTOR_SYMBOL) "#{SELECTOR_SYMBOL}#{key}" end def is_operator?(key) - ALL_OPERATORS.include?(key) - end - - def index_exists?(query) - Dolly::MangoIndex.find_by_fields(fetch_fields(query)) + ALL_OPERATORS.include?(key) || key.to_s.starts_with?(SELECTOR_SYMBOL) end def fetch_fields(query) deep_keys(query).reject do |key| is_operator?(key) || is_type_operator?(key)