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)