Module: Mongo::QueryCache
Relationships & Source Files | |
Namespace Children | |
Classes:
| |
Defined in: | lib/mongo/query_cache.rb |
Class Attribute Summary
-
.enabled=(value)
rw
Set whether the cache is enabled.
-
.enabled? ⇒ true, false
rw
Is the query cache enabled on the current thread?
Class Method Summary
-
.cache ⇒ Object
Execute the block while using the query cache.
- .cache_table
-
.clear ⇒ nil
Clear the query cache.
-
.clear_namespace(namespace) ⇒ nil
Internal use only
Internal use only
Clear the section of the query cache storing cursors with results from this namespace.
-
.get(**opts) ⇒ Mongo::CachingCursor | nil
Internal use only
Internal use only
For the given query options, retrieve a cached cursor that can be used to obtain the correct query results, if one exists in the cache.
- .normalized_limit(limit)
-
.set(cursor, **opts) ⇒ true
Internal use only
Internal use only
Store a
CachingCursor
instance in the query cache associated with the specified query options. -
.uncached ⇒ Object
Execute the block with the query cache disabled.
- .cache_key(**opts) private
-
.namespace_key(**opts)
private
If the cached results can come from multiple collections, store this cursor under the nil namespace to be cleared on every write operation.
Class Attribute Details
.enabled=(value) (rw)
Set whether the cache is enabled.
# File 'lib/mongo/query_cache.rb', line 28
def enabled=(value) Thread.current["[mongo]:query_cache:enabled"] = value end
.enabled? ⇒ true
, false
(rw)
Is the query cache enabled on the current thread?
# File 'lib/mongo/query_cache.rb', line 38
def enabled? !!Thread.current["[mongo]:query_cache:enabled"] end
Class Method Details
.cache ⇒ Object
Execute the block while using the query cache.
# File 'lib/mongo/query_cache.rb', line 48
def cache enabled = enabled? self.enabled = true begin yield ensure self.enabled = enabled end end
.cache_key(**opts) (private)
[ GitHub ]# File 'lib/mongo/query_cache.rb', line 223
def cache_key(**opts) unless opts[:namespace] raise ArgumentError.new("Cannot generate cache key without namespace") end unless opts[:selector] raise ArgumentError.new("Cannot generate cache key without selector") end [ opts[:namespace], opts[:selector], opts[:skip], opts[:sort], opts[:projection], opts[:collation], opts[:read_concern], opts[:read_preference] ] end
.cache_table
[ GitHub ]# File 'lib/mongo/query_cache.rb', line 80
private def cache_table Thread.current["[mongo]:query_cache"] ||= {} end
.clear ⇒ nil
Clear the query cache.
# File 'lib/mongo/query_cache.rb', line 90
def clear Thread.current["[mongo]:query_cache"] = nil end
.clear_namespace(namespace) ⇒ nil
Clear the section of the query cache storing cursors with results from this namespace.
# File 'lib/mongo/query_cache.rb', line 103
def clear_namespace(namespace) cache_table.delete(namespace) # The nil key is where cursors are stored that could potentially read from # multiple collections. This key should be cleared on every write operation # to prevent returning stale data. cache_table.delete(nil) nil end
.get(**opts) ⇒ Mongo::CachingCursor | nil
For the given query options, retrieve a cached cursor that can be used to obtain the correct query results, if one exists in the cache.
# File 'lib/mongo/query_cache.rb', line 181
def get(**opts) limit = normalized_limit(opts[:limit]) _namespace_key = namespace_key(**opts) _cache_key = cache_key(**opts) namespace_hash = cache_table[_namespace_key] return nil unless namespace_hash caching_cursor = namespace_hash[_cache_key] return nil unless caching_cursor caching_cursor_limit = normalized_limit(caching_cursor.view.limit) # There are two scenarios in which a caching cursor could fulfill the # query: # 1. The query has a limit, and the stored cursor has no limit or # a larger limit. # 2. The query has no limit and the stored cursor has no limit. # # Otherwise, return nil because the stored cursor will not satisfy # the query. if limit && (caching_cursor_limit.nil? || caching_cursor_limit >= limit) caching_cursor elsif limit.nil? && caching_cursor_limit.nil? caching_cursor else nil end end
.namespace_key(**opts) (private)
If the cached results can come from multiple collections, store this cursor under the nil namespace to be cleared on every write operation. Otherwise, store it under the specified namespace.
# File 'lib/mongo/query_cache.rb', line 246
def namespace_key(**opts) if opts[:multi_collection] nil else opts[:namespace] end end
.normalized_limit(limit)
[ GitHub ]# File 'lib/mongo/query_cache.rb', line 213
def normalized_limit(limit) return nil unless limit # For the purposes of caching, a limit of 0 means no limit, as mongo treats it as such. return nil if limit == 0 # For the purposes of caching, a negative limit is the same as as a positive limit. limit.abs end
.set(cursor, **opts) ⇒ true
Store a CachingCursor
instance in the query cache associated with the specified query options.
# File 'lib/mongo/query_cache.rb', line 142
def set(cursor, **opts) _cache_key = cache_key(**opts) _namespace_key = namespace_key(**opts) cache_table[_namespace_key] ||= {} cache_table[_namespace_key][_cache_key] = cursor true end
.uncached ⇒ Object
Execute the block with the query cache disabled.
# File 'lib/mongo/query_cache.rb', line 64
def uncached enabled = enabled? self.enabled = false begin yield ensure self.enabled = enabled end end