mongoid 6.4.1 → 6.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -3
- data/Rakefile +26 -0
- data/lib/mongoid.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +1 -1
- data/lib/mongoid/criteria/modifiable.rb +12 -2
- data/lib/mongoid/criteria/queryable/selectable.rb +34 -7
- data/lib/mongoid/document.rb +4 -4
- data/lib/mongoid/extensions/big_decimal.rb +1 -1
- data/lib/mongoid/extensions/regexp.rb +1 -0
- data/lib/mongoid/extensions/string.rb +3 -1
- data/lib/mongoid/matchable.rb +3 -0
- data/lib/mongoid/matchable/nor.rb +37 -0
- data/lib/mongoid/persistable/settable.rb +5 -5
- data/lib/mongoid/persistence_context.rb +4 -0
- data/lib/mongoid/query_cache.rb +64 -19
- data/lib/mongoid/railtie.rb +17 -0
- data/lib/mongoid/railties/controller_runtime.rb +86 -0
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/threaded.rb +36 -0
- data/lib/mongoid/version.rb +1 -1
- data/spec/app/models/array_field.rb +7 -0
- data/spec/app/models/delegating_patient.rb +16 -0
- data/spec/integration/document_spec.rb +22 -0
- data/spec/mongoid/clients/factory_spec.rb +52 -28
- data/spec/mongoid/clients/options_spec.rb +30 -15
- data/spec/mongoid/clients/sessions_spec.rb +12 -3
- data/spec/mongoid/contextual/geo_near_spec.rb +1 -0
- data/spec/mongoid/contextual/mongo_spec.rb +2 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +59 -10
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +42 -3
- data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
- data/spec/mongoid/criteria/scopable_spec.rb +81 -0
- data/spec/mongoid/criteria_spec.rb +4 -1
- data/spec/mongoid/document_spec.rb +54 -0
- data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
- data/spec/mongoid/extensions/regexp_spec.rb +23 -0
- data/spec/mongoid/extensions/string_spec.rb +35 -7
- data/spec/mongoid/fields_spec.rb +1 -1
- data/spec/mongoid/findable_spec.rb +1 -1
- data/spec/mongoid/matchable/nor_spec.rb +209 -0
- data/spec/mongoid/matchable_spec.rb +26 -1
- data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
- data/spec/mongoid/persistable/settable_spec.rb +19 -0
- data/spec/mongoid/query_cache_spec.rb +87 -18
- data/spec/mongoid/scopable_spec.rb +13 -0
- data/spec/mongoid/threaded_spec.rb +68 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/cluster_config.rb +158 -0
- data/spec/support/constraints.rb +101 -0
- data/spec/support/macros.rb +20 -0
- data/spec/support/session_registry.rb +50 -0
- data/spec/support/spec_config.rb +42 -0
- metadata +43 -23
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b8c453904dce4061c6cd88c36e21f3514fb778b37976ffd12e985aaf80fc2b98
|
4
|
+
data.tar.gz: d10421a146387851daa6a9c27184b48da1cc50d96a946bce0851aa69fd56c9a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c0e672470d68faab3afc70e65524baa771801b46bbbb51b831a5cc709baf6df4ed7f0d81aed2dd5d0c3e3cf6730166da9bc8345b33577298f4438ec6c11fca3
|
7
|
+
data.tar.gz: 2008465437ba6eafe50235b22204df40b560b8e3bd27d064e97912c3249f5443af2ad1016c9a545d9d487abc6c1b38835624090a6d9165d06f9c4e676b561a23
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
@@ -1,3 +1 @@
|
|
1
|
-
���
|
2
|
-
�
|
3
|
-
j�%d�=HcPx���ͺ'�eMP�|���_�R�4�*��ot�-�/iF�";�'3�h�[�4�|`0.�ȃ�ʙ]i�U_cAQ�Zix��g��
|
1
|
+
��9V6����r~��[t�or�;��͞ð|�ƪ@����N��o!+5|�f.e�^�[%�p�eص"�q��$�J\��LO@�zV�[�!IJ�7W���i�:9�9,>��u.NI�h��UT$`��m��Q��x��o�6~��D~H��ƴ���ib�7��fa��3��Y�fd6���>!�}�?>0������^���-"c�\\��ݳ��q���:��i��n���;�4�����dW��u�0�'�Tk�DE m;Bry��
|
data/Rakefile
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "bundler"
|
2
|
+
require "bundler/gem_tasks"
|
2
3
|
Bundler.setup
|
3
4
|
|
4
5
|
require "rake"
|
@@ -7,6 +8,9 @@ require "rspec/core/rake_task"
|
|
7
8
|
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
8
9
|
require "mongoid/version"
|
9
10
|
|
11
|
+
tasks = Rake.application.instance_variable_get('@tasks')
|
12
|
+
tasks['release:do'] = tasks.delete('release')
|
13
|
+
|
10
14
|
task :gem => :build
|
11
15
|
task :build do
|
12
16
|
system "gem build mongoid.gemspec"
|
@@ -33,3 +37,25 @@ RSpec::Core::RakeTask.new('spec:progress') do |spec|
|
|
33
37
|
end
|
34
38
|
|
35
39
|
task :default => :spec
|
40
|
+
|
41
|
+
desc "Generate all documentation"
|
42
|
+
task :docs => 'docs:yard'
|
43
|
+
|
44
|
+
namespace :docs do
|
45
|
+
desc "Generate yard documention"
|
46
|
+
task :yard do
|
47
|
+
out = File.join('yard-docs', Mongoid::VERSION)
|
48
|
+
FileUtils.rm_rf(out)
|
49
|
+
system "yardoc -o #{out} --title mongoid-#{Mongoid::VERSION}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
namespace :release do
|
54
|
+
task :check_private_key do
|
55
|
+
unless File.exist?('gem-private_key.pem')
|
56
|
+
raise "No private key present, cannot release"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
task :release => ['release:check_private_key', 'release:do']
|
data/lib/mongoid.rb
CHANGED
@@ -101,5 +101,5 @@ module Mongoid
|
|
101
101
|
# Mongoid.database = Mongo::Connection.new.db("test")
|
102
102
|
#
|
103
103
|
# @since 1.0.0
|
104
|
-
delegate(*(Config.public_instance_methods(false) - [ :logger=, :logger ]
|
104
|
+
delegate(*(Config.public_instance_methods(false) - [ :logger=, :logger ]), to: Config)
|
105
105
|
end
|
@@ -165,7 +165,7 @@ module Mongoid
|
|
165
165
|
def raw
|
166
166
|
validate_out!
|
167
167
|
cmd = command
|
168
|
-
opts = { read: cmd.delete(:read)
|
168
|
+
opts = { read: cmd.delete(:read) } if cmd[:read]
|
169
169
|
@map_reduce.database.command(cmd, (opts || {}).merge(session: _session)).first
|
170
170
|
end
|
171
171
|
alias :results :raw
|
@@ -3,6 +3,10 @@ module Mongoid
|
|
3
3
|
class Criteria
|
4
4
|
module Modifiable
|
5
5
|
|
6
|
+
# @attribute [r] create_attrs Additional attributes to add to the Document upon creation.
|
7
|
+
# @api private
|
8
|
+
attr_reader :create_attrs
|
9
|
+
|
6
10
|
# Build a document given the selector and return it.
|
7
11
|
# Complex criteria, such as $in and $or operations will get ignored.
|
8
12
|
#
|
@@ -57,6 +61,9 @@ module Mongoid
|
|
57
61
|
|
58
62
|
# Define attributes with which new documents will be created.
|
59
63
|
#
|
64
|
+
# Note that if `find_or_create_by` is called after this in a method chain, the attributes in
|
65
|
+
# the query will override those from this method.
|
66
|
+
#
|
60
67
|
# @example Define attributes to be used when a new document is created.
|
61
68
|
# Person.create_with(job: 'Engineer').find_or_create_by(employer: 'MongoDB')
|
62
69
|
#
|
@@ -64,7 +71,9 @@ module Mongoid
|
|
64
71
|
#
|
65
72
|
# @since 5.1.0
|
66
73
|
def create_with(attrs = {})
|
67
|
-
|
74
|
+
tap do
|
75
|
+
(@create_attrs ||= {}).merge!(attrs)
|
76
|
+
end
|
68
77
|
end
|
69
78
|
|
70
79
|
# Find the first +Document+ given the conditions, or creates a new document
|
@@ -172,7 +181,8 @@ module Mongoid
|
|
172
181
|
#
|
173
182
|
# @since 3.0.0
|
174
183
|
def create_document(method, attrs = nil, &block)
|
175
|
-
|
184
|
+
attrs = (create_attrs || {}).merge(attrs || {})
|
185
|
+
attributes = selector.reduce(attrs) do |hash, (key, value)|
|
176
186
|
unless invalid_key?(hash, key) || invalid_embedded_doc?(value)
|
177
187
|
hash[key] = value
|
178
188
|
end
|
@@ -24,7 +24,7 @@ module Mongoid
|
|
24
24
|
# @since 2.0.0
|
25
25
|
POLYGON = "Polygon"
|
26
26
|
|
27
|
-
# @attribute [rw] negating If the next
|
27
|
+
# @attribute [rw] negating If the next expression is negated.
|
28
28
|
# @attribute [rw] selector The query selector.
|
29
29
|
attr_accessor :negating, :selector
|
30
30
|
|
@@ -134,13 +134,21 @@ module Mongoid
|
|
134
134
|
::Boolean.evolve(value)
|
135
135
|
end
|
136
136
|
|
137
|
-
# Add a $geoIntersects or $geoWithin selection. Symbol operators must
|
138
|
-
# the examples to expand the criteria.
|
137
|
+
# Add a $geoIntersects or $geoWithin selection. Symbol operators must
|
138
|
+
# be used as shown in the examples to expand the criteria.
|
139
139
|
#
|
140
140
|
# @note The only valid geometry shapes for a $geoIntersects are:
|
141
141
|
# :intersects_line, :intersects_point, and :intersects_polygon.
|
142
142
|
#
|
143
|
-
# @note The only valid
|
143
|
+
# @note The only valid options for a $geoWithin query are the geometry
|
144
|
+
# shape :within_polygon and the operator :within_box.
|
145
|
+
#
|
146
|
+
# @note The :within_box operator for the $geoWithin query expects the
|
147
|
+
# lower left (south west) coordinate pair as the first argument and
|
148
|
+
# the upper right (north east) as the second argument.
|
149
|
+
# Important: When latitude and longitude are passed, longitude is
|
150
|
+
# expected as the first element of the coordinate pair.
|
151
|
+
# Source: https://docs.mongodb.com/manual/reference/operator/query/box/
|
144
152
|
#
|
145
153
|
# @example Add a geo intersect criterion for a line.
|
146
154
|
# query.geo_spacial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
|
@@ -154,6 +162,9 @@ module Mongoid
|
|
154
162
|
# @example Add a geo within criterion for a polygon.
|
155
163
|
# query.geo_spacial(:location.within_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
|
156
164
|
#
|
165
|
+
# @example Add a geo within criterion for a box.
|
166
|
+
# query.geo_spacial(:location.within_box => [[ 1, 10 ], [ 2, 10 ])
|
167
|
+
#
|
157
168
|
# @param [ Hash ] criterion The criterion.
|
158
169
|
#
|
159
170
|
# @return [ Selectable ] The cloned selectable.
|
@@ -174,6 +185,7 @@ module Mongoid
|
|
174
185
|
key :within_polygon, :override, "$geoWithin", "$geometry" do |value|
|
175
186
|
{ "type" => POLYGON, "coordinates" => value }
|
176
187
|
end
|
188
|
+
key :within_box, :override, "$geoWithin", "$box"
|
177
189
|
|
178
190
|
# Add the $gt criterion to the selector.
|
179
191
|
#
|
@@ -501,6 +513,11 @@ module Mongoid
|
|
501
513
|
# @example Construct a text search selector with options.
|
502
514
|
# selectable.text_search("testing", :$language => "fr")
|
503
515
|
#
|
516
|
+
# @note Per https://docs.mongodb.com/manual/reference/operator/query/text/
|
517
|
+
# it is not currently possible to supply multiple text search
|
518
|
+
# conditions in a query. Mongoid will build such a query but the
|
519
|
+
# server will return an error when trying to execute it.
|
520
|
+
#
|
504
521
|
# @param [ String, Symbol ] terms A string of terms that MongoDB parses
|
505
522
|
# and uses to query the text index.
|
506
523
|
# @param [ Hash ] opts Text search options. See MongoDB documentation
|
@@ -512,9 +529,19 @@ module Mongoid
|
|
512
529
|
def text_search(terms, opts = nil)
|
513
530
|
clone.tap do |query|
|
514
531
|
if terms
|
515
|
-
criterion = {
|
516
|
-
criterion[
|
517
|
-
query.selector
|
532
|
+
criterion = {'$text' => { '$search' => terms }}
|
533
|
+
criterion['$text'].merge!(opts) if opts
|
534
|
+
if query.selector['$text']
|
535
|
+
# Per https://docs.mongodb.com/manual/reference/operator/query/text/
|
536
|
+
# multiple $text expressions are not currently supported by
|
537
|
+
# MongoDB server, but build the query correctly instead of
|
538
|
+
# overwriting previous text search condition with the currently
|
539
|
+
# given one.
|
540
|
+
Mongoid.logger.warn('Multiple $text expressions per query are not currently supported by the server')
|
541
|
+
query.selector = {'$and' => [query.selector]}.merge(criterion)
|
542
|
+
else
|
543
|
+
query.selector = query.selector.merge(criterion)
|
544
|
+
end
|
518
545
|
end
|
519
546
|
end
|
520
547
|
end
|
data/lib/mongoid/document.rb
CHANGED
@@ -190,11 +190,11 @@ module Mongoid
|
|
190
190
|
#
|
191
191
|
# @since 5.1.0
|
192
192
|
def as_json(options = nil)
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
super(options)
|
193
|
+
rv = super
|
194
|
+
if options && options[:compact]
|
195
|
+
rv = rv.compact
|
197
196
|
end
|
197
|
+
rv
|
198
198
|
end
|
199
199
|
|
200
200
|
# Returns an instance of the specified class with the attributes,
|
@@ -53,7 +53,7 @@ module Mongoid
|
|
53
53
|
#
|
54
54
|
# @since 3.0.0
|
55
55
|
def demongoize(object)
|
56
|
-
object && object.numeric? ?
|
56
|
+
object && object.numeric? ? BigDecimal(object.to_s) : nil
|
57
57
|
end
|
58
58
|
|
59
59
|
# Mongoize an object of any type to how it's stored in the db as a String.
|
data/lib/mongoid/matchable.rb
CHANGED
@@ -11,6 +11,7 @@ require "mongoid/matchable/lte"
|
|
11
11
|
require "mongoid/matchable/ne"
|
12
12
|
require "mongoid/matchable/nin"
|
13
13
|
require "mongoid/matchable/or"
|
14
|
+
require "mongoid/matchable/nor"
|
14
15
|
require "mongoid/matchable/size"
|
15
16
|
require "mongoid/matchable/elem_match"
|
16
17
|
require "mongoid/matchable/regexp"
|
@@ -40,6 +41,7 @@ module Mongoid
|
|
40
41
|
"$ne" => Ne,
|
41
42
|
"$nin" => Nin,
|
42
43
|
"$or" => Or,
|
44
|
+
"$nor" => Nor,
|
43
45
|
"$size" => Size
|
44
46
|
}.with_indifferent_access.freeze
|
45
47
|
|
@@ -124,6 +126,7 @@ module Mongoid
|
|
124
126
|
case key.to_s
|
125
127
|
when "$or" then Or.new(value, document)
|
126
128
|
when "$and" then And.new(value, document)
|
129
|
+
when "$nor" then Nor.new(value, document)
|
127
130
|
else Default.new(extract_attribute(document, key))
|
128
131
|
end
|
129
132
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
module Mongoid
|
4
|
+
module Matchable
|
5
|
+
|
6
|
+
# Defines behavior for handling $nor expressions in embedded documents.
|
7
|
+
class Nor < Default
|
8
|
+
|
9
|
+
# Does the supplied query match the attribute?
|
10
|
+
#
|
11
|
+
# Note: an empty array as an argument to $nor is prohibited by
|
12
|
+
# MongoDB server. Mongoid does allow this and returns false in this case.
|
13
|
+
#
|
14
|
+
# @example Does this match?
|
15
|
+
# matcher._matches?("$nor" => [ { field => value } ])
|
16
|
+
#
|
17
|
+
# @param [ Array ] conditions The or expression.
|
18
|
+
#
|
19
|
+
# @return [ true, false ] True if matches, false if not.
|
20
|
+
#
|
21
|
+
# @since 6.4.2/7.0.2/7.1.0
|
22
|
+
def _matches?(conditions)
|
23
|
+
if conditions.length == 0
|
24
|
+
# MongoDB does not allow $nor array to be empty, but
|
25
|
+
# Mongoid accepts an empty array for $or which MongoDB also
|
26
|
+
# prohibits
|
27
|
+
return false
|
28
|
+
end
|
29
|
+
conditions.none? do |condition|
|
30
|
+
condition.all? do |key, value|
|
31
|
+
document._matches?(key => value)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -25,15 +25,15 @@ module Mongoid
|
|
25
25
|
|
26
26
|
field_and_value_hash = hasherizer(field.split('.'), value)
|
27
27
|
field = field_and_value_hash.keys.first.to_s
|
28
|
+
value = field_and_value_hash[field]
|
28
29
|
|
29
|
-
if fields[field] && fields[field].type == Hash && attributes.key?(field) && !value.empty?
|
30
|
+
if fields[field] && fields[field].type == Hash && attributes.key?(field) && Hash === value && !value.empty?
|
30
31
|
merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
|
31
|
-
value = (attributes[field] || {}).merge(
|
32
|
-
process_attribute(field.to_s, value)
|
33
|
-
else
|
34
|
-
process_attribute(field.to_s, field_and_value_hash[field])
|
32
|
+
value = (attributes[field] || {}).merge(value, &merger)
|
35
33
|
end
|
36
34
|
|
35
|
+
process_attribute(field.to_s, value)
|
36
|
+
|
37
37
|
unless relations.include?(field.to_s)
|
38
38
|
ops[atomic_attribute_name(field)] = attributes[field]
|
39
39
|
end
|
@@ -107,6 +107,10 @@ module Mongoid
|
|
107
107
|
#
|
108
108
|
# @since 6.0.0
|
109
109
|
def client
|
110
|
+
client_options = send(:client_options)
|
111
|
+
if client_options[:read].is_a?(Symbol)
|
112
|
+
client_options = client_options.merge(read: {mode: client_options[:read]})
|
113
|
+
end
|
110
114
|
@client ||= (client = Clients.with_name(client_name)
|
111
115
|
client = client.use(database_name) if database_name_option
|
112
116
|
client.with(client_options))
|
data/lib/mongoid/query_cache.rb
CHANGED
@@ -159,11 +159,14 @@ module Mongoid
|
|
159
159
|
private
|
160
160
|
|
161
161
|
def process(result)
|
162
|
-
|
163
|
-
|
164
|
-
@
|
165
|
-
|
166
|
-
|
162
|
+
documents = super
|
163
|
+
|
164
|
+
if @cursor_id.zero? && !@after_first_batch
|
165
|
+
@cached_documents ||= []
|
166
|
+
@cached_documents.concat(documents)
|
167
|
+
end
|
168
|
+
|
169
|
+
@after_first_batch = true
|
167
170
|
documents
|
168
171
|
end
|
169
172
|
end
|
@@ -218,20 +221,40 @@ module Mongoid
|
|
218
221
|
#
|
219
222
|
# @since 5.0.0
|
220
223
|
def each
|
221
|
-
if system_collection? || !QueryCache.enabled?
|
224
|
+
if system_collection? || !QueryCache.enabled? || (respond_to?(:write?, true) && write?)
|
222
225
|
super
|
223
226
|
else
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
227
|
+
@cursor = nil
|
228
|
+
unless @cursor = cached_cursor
|
229
|
+
|
230
|
+
if driver_supports_cursor_sessions?
|
231
|
+
session = client.send(:get_session, @options)
|
232
|
+
read_with_retry(session, server_selector) do |server|
|
233
|
+
result = send_initial_query(server, session)
|
234
|
+
@cursor = get_cursor(result, server, session)
|
235
|
+
end
|
236
|
+
else
|
237
|
+
read_with_retry do
|
238
|
+
server = server_selector.select_server(cluster)
|
239
|
+
result = send_initial_query(server)
|
240
|
+
@cursor = get_cursor(result, server)
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
if block_given?
|
246
|
+
if limit && limit != -1
|
247
|
+
@cursor.to_a[0...limit].each do |doc|
|
248
|
+
yield doc
|
249
|
+
end
|
250
|
+
else
|
251
|
+
@cursor.each do |doc|
|
252
|
+
yield doc
|
253
|
+
end
|
229
254
|
end
|
255
|
+
else
|
256
|
+
@cursor.to_enum
|
230
257
|
end
|
231
|
-
cursor.each do |doc|
|
232
|
-
yield doc
|
233
|
-
end if block_given?
|
234
|
-
cursor
|
235
258
|
end
|
236
259
|
end
|
237
260
|
|
@@ -241,14 +264,30 @@ module Mongoid
|
|
241
264
|
if limit
|
242
265
|
key = [ collection.namespace, selector, nil, skip, sort, projection, collation ]
|
243
266
|
cursor = QueryCache.cache_table[key]
|
244
|
-
if cursor
|
245
|
-
limited_docs = cursor.to_a[0...limit.abs]
|
246
|
-
cursor.instance_variable_set(:@cached_documents, limited_docs)
|
247
|
-
end
|
248
267
|
end
|
249
268
|
cursor || QueryCache.cache_table[cache_key]
|
250
269
|
end
|
251
270
|
|
271
|
+
def get_cursor(result, server, session = nil)
|
272
|
+
if result.cursor_id == 0 || result.cursor_id.nil?
|
273
|
+
cursor = if session
|
274
|
+
CachedCursor.new(view, result, server, session: session)
|
275
|
+
else
|
276
|
+
CachedCursor.new(view, result, server)
|
277
|
+
end
|
278
|
+
|
279
|
+
QueryCache.cache_table[cache_key] = cursor
|
280
|
+
else
|
281
|
+
cursor = if session
|
282
|
+
Mongo::Cursor.new(view, result, server, session: session)
|
283
|
+
else
|
284
|
+
Mongo::Cursor.new(view, result, server)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
cursor
|
289
|
+
end
|
290
|
+
|
252
291
|
def cache_key
|
253
292
|
[ collection.namespace, selector, limit, skip, sort, projection, collation ]
|
254
293
|
end
|
@@ -256,6 +295,12 @@ module Mongoid
|
|
256
295
|
def system_collection?
|
257
296
|
collection.namespace =~ /^system./
|
258
297
|
end
|
298
|
+
|
299
|
+
def driver_supports_cursor_sessions?
|
300
|
+
# Driver versions 2.9 and newer support passing in a session to the
|
301
|
+
# cursor object.
|
302
|
+
(Mongo::VERSION.split('.').map(&:to_i) <=> [2, 9, 0]) > 0
|
303
|
+
end
|
259
304
|
end
|
260
305
|
|
261
306
|
# Adds behaviour to the query cache for collections.
|