mongoid 5.4.1 → 6.0.0.beta
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 +0 -0
- data/lib/config/locales/en.yml +23 -16
- data/lib/mongoid.rb +4 -9
- data/lib/mongoid/atomic.rb +1 -1
- data/lib/mongoid/atomic/modifiers.rb +8 -12
- data/lib/mongoid/attributes.rb +9 -11
- data/lib/mongoid/attributes/dynamic.rb +5 -6
- data/lib/mongoid/attributes/nested.rb +1 -1
- data/lib/mongoid/attributes/processing.rb +4 -0
- data/lib/mongoid/attributes/readonly.rb +22 -0
- data/lib/mongoid/cacheable.rb +36 -0
- data/lib/mongoid/changeable.rb +37 -1
- data/lib/mongoid/clients.rb +0 -63
- data/lib/mongoid/clients/factory.rb +0 -2
- data/lib/mongoid/clients/options.rb +54 -249
- data/lib/mongoid/clients/storage_options.rb +1 -69
- data/lib/mongoid/composable.rb +26 -2
- data/lib/mongoid/config.rb +1 -1
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
- data/lib/mongoid/contextual/atomic.rb +6 -9
- data/lib/mongoid/contextual/geo_near.rb +2 -3
- data/lib/mongoid/contextual/map_reduce.rb +97 -24
- data/lib/mongoid/contextual/memory.rb +7 -4
- data/lib/mongoid/contextual/mongo.rb +63 -54
- data/lib/mongoid/contextual/none.rb +2 -2
- data/lib/mongoid/copyable.rb +19 -19
- data/lib/mongoid/criteria.rb +5 -4
- data/lib/mongoid/criteria/findable.rb +2 -3
- data/lib/mongoid/criteria/includable.rb +63 -16
- data/lib/mongoid/criteria/marshalable.rb +2 -2
- data/lib/mongoid/criteria/modifiable.rb +17 -1
- data/lib/mongoid/criteria/options.rb +25 -0
- data/lib/mongoid/criteria/queryable.rb +86 -0
- data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
- data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
- data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
- data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
- data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
- data/lib/mongoid/criteria/queryable/key.rb +103 -0
- data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
- data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
- data/lib/mongoid/criteria/queryable/optional.rb +411 -0
- data/lib/mongoid/criteria/queryable/options.rb +136 -0
- data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
- data/lib/mongoid/criteria/queryable/selector.rb +196 -0
- data/lib/mongoid/criteria/queryable/smash.rb +103 -0
- data/lib/mongoid/document.rb +9 -23
- data/lib/mongoid/errors.rb +2 -1
- data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
- data/lib/mongoid/errors/delete_restriction.rb +2 -2
- data/lib/mongoid/errors/invalid_field.rb +2 -2
- data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
- data/lib/mongoid/errors/invalid_relation.rb +66 -0
- data/lib/mongoid/errors/inverse_not_found.rb +1 -1
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/evolvable.rb +1 -1
- data/lib/mongoid/extensions.rb +0 -5
- data/lib/mongoid/extensions/big_decimal.rb +17 -8
- data/lib/mongoid/extensions/date.rb +4 -1
- data/lib/mongoid/extensions/hash.rb +2 -3
- data/lib/mongoid/extensions/object.rb +2 -2
- data/lib/mongoid/extensions/string.rb +4 -3
- data/lib/mongoid/extensions/time.rb +5 -2
- data/lib/mongoid/factory.rb +1 -0
- data/lib/mongoid/fields/foreign_key.rb +2 -2
- data/lib/mongoid/fields/localized.rb +3 -8
- data/lib/mongoid/fields/validators/macro.rb +18 -0
- data/lib/mongoid/findable.rb +3 -3
- data/lib/mongoid/indexable.rb +17 -16
- data/lib/mongoid/indexable/specification.rb +1 -1
- data/lib/mongoid/indexable/validators/options.rb +1 -2
- data/lib/mongoid/interceptable.rb +6 -17
- data/lib/mongoid/loggable.rb +1 -1
- data/lib/mongoid/matchable.rb +3 -10
- data/lib/mongoid/matchable/gt.rb +2 -0
- data/lib/mongoid/matchable/gte.rb +2 -0
- data/lib/mongoid/matchable/lt.rb +2 -0
- data/lib/mongoid/matchable/lte.rb +2 -0
- data/lib/mongoid/persistable.rb +6 -5
- data/lib/mongoid/persistable/creatable.rb +2 -0
- data/lib/mongoid/persistable/deletable.rb +7 -3
- data/lib/mongoid/persistable/settable.rb +3 -16
- data/lib/mongoid/persistable/updatable.rb +10 -12
- data/lib/mongoid/persistence_context.rb +216 -0
- data/lib/mongoid/query_cache.rb +5 -30
- data/lib/mongoid/relations/accessors.rb +6 -2
- data/lib/mongoid/relations/auto_save.rb +12 -4
- data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
- data/lib/mongoid/relations/conversions.rb +1 -1
- data/lib/mongoid/relations/counter_cache.rb +28 -18
- data/lib/mongoid/relations/eager.rb +19 -7
- data/lib/mongoid/relations/eager/base.rb +5 -5
- data/lib/mongoid/relations/embedded/batchable.rb +9 -33
- data/lib/mongoid/relations/embedded/in.rb +16 -2
- data/lib/mongoid/relations/embedded/many.rb +23 -8
- data/lib/mongoid/relations/embedded/one.rb +17 -2
- data/lib/mongoid/relations/macros.rb +9 -2
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/nested_builder.rb +1 -1
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/proxy.rb +2 -33
- data/lib/mongoid/relations/referenced/in.rb +23 -11
- data/lib/mongoid/relations/referenced/many.rb +24 -16
- data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
- data/lib/mongoid/relations/referenced/one.rb +17 -1
- data/lib/mongoid/relations/reflections.rb +3 -5
- data/lib/mongoid/relations/touchable.rb +1 -1
- data/lib/mongoid/reloadable.rb +1 -1
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/serializable.rb +2 -3
- data/lib/mongoid/tasks/database.rb +1 -2
- data/lib/mongoid/threaded.rb +4 -4
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/validatable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +2 -4
- data/lib/mongoid/validatable/uniqueness.rb +1 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
- data/spec/app/models/album.rb +5 -1
- data/spec/app/models/artist.rb +21 -0
- data/spec/app/models/band.rb +0 -1
- data/spec/app/models/church.rb +0 -2
- data/spec/app/models/ordered_post.rb +5 -0
- data/spec/app/models/oscar.rb +1 -2
- data/spec/app/models/person.rb +3 -1
- data/spec/app/models/post.rb +0 -1
- data/spec/app/models/princess.rb +2 -0
- data/spec/app/models/record.rb +1 -0
- data/spec/app/models/thing.rb +1 -1
- data/spec/config/mongoid.yml +1 -5
- data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
- data/spec/mongoid/atomic_spec.rb +17 -17
- data/spec/mongoid/attributes/nested_spec.rb +14 -14
- data/spec/mongoid/attributes/readonly_spec.rb +87 -44
- data/spec/mongoid/attributes_spec.rb +63 -0
- data/spec/mongoid/cacheable_spec.rb +112 -0
- data/spec/mongoid/changeable_spec.rb +58 -0
- data/spec/mongoid/clients/factory_spec.rb +3 -11
- data/spec/mongoid/clients/options_spec.rb +378 -96
- data/spec/mongoid/clients_spec.rb +207 -170
- data/spec/mongoid/composable_spec.rb +7 -0
- data/spec/mongoid/config_spec.rb +41 -21
- data/spec/mongoid/contextual/atomic_spec.rb +77 -343
- data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
- data/spec/mongoid/contextual/memory_spec.rb +56 -316
- data/spec/mongoid/contextual/mongo_spec.rb +104 -378
- data/spec/mongoid/copyable_spec.rb +8 -15
- data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
- data/spec/mongoid/criteria/options_spec.rb +29 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
- data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
- data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
- data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
- data/spec/mongoid/criteria_spec.rb +45 -63
- data/spec/mongoid/document_spec.rb +21 -88
- data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
- data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
- data/spec/mongoid/extensions/date_spec.rb +2 -6
- data/spec/mongoid/extensions/date_time_spec.rb +2 -6
- data/spec/mongoid/extensions/float_spec.rb +8 -1
- data/spec/mongoid/extensions/integer_spec.rb +8 -1
- data/spec/mongoid/extensions/object_spec.rb +11 -0
- data/spec/mongoid/extensions/string_spec.rb +21 -0
- data/spec/mongoid/extensions/time_spec.rb +4 -8
- data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
- data/spec/mongoid/fields/localized_spec.rb +0 -91
- data/spec/mongoid/findable_spec.rb +46 -1
- data/spec/mongoid/indexable_spec.rb +6 -46
- data/spec/mongoid/interceptable_spec.rb +49 -10
- data/spec/mongoid/matchable/gt_spec.rb +11 -0
- data/spec/mongoid/matchable/gte_spec.rb +10 -0
- data/spec/mongoid/matchable/lt_spec.rb +11 -0
- data/spec/mongoid/matchable/lte_spec.rb +11 -0
- data/spec/mongoid/matchable_spec.rb +1 -51
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +1 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
- data/spec/mongoid/persistable/savable_spec.rb +30 -30
- data/spec/mongoid/persistable/settable_spec.rb +0 -185
- data/spec/mongoid/persistable/updatable_spec.rb +166 -5
- data/spec/mongoid/persistence_context_spec.rb +654 -0
- data/spec/mongoid/positional_spec.rb +10 -10
- data/spec/mongoid/query_cache_spec.rb +89 -65
- data/spec/mongoid/relations/accessors_spec.rb +1 -1
- data/spec/mongoid/relations/auto_save_spec.rb +39 -6
- data/spec/mongoid/relations/builders_spec.rb +37 -10
- data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
- data/spec/mongoid/relations/cyclic_spec.rb +0 -22
- data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
- data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
- data/spec/mongoid/relations/macros_spec.rb +395 -7
- data/spec/mongoid/relations/proxy_spec.rb +3 -1
- data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
- data/spec/mongoid/relations/reflections_spec.rb +9 -9
- data/spec/mongoid/reloadable_spec.rb +51 -0
- data/spec/mongoid/scopable_spec.rb +0 -12
- data/spec/mongoid/serializable_spec.rb +0 -50
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
- data/spec/mongoid/validatable_spec.rb +16 -0
- data/spec/spec_helper.rb +10 -10
- metadata +536 -479
- metadata.gz.sig +0 -0
- data/lib/mongoid/clients/thread_options.rb +0 -19
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
- data/lib/mongoid/extensions/decimal128.rb +0 -39
- data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
- data/lib/mongoid/matchable/regexp.rb +0 -27
- data/spec/app/models/post_genre.rb +0 -6
- data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
- data/spec/mongoid/matchable/regexp_spec.rb +0 -59
@@ -0,0 +1,87 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Criteria::Queryable::Forwardable do
|
4
|
+
|
5
|
+
describe ".select_with" do
|
6
|
+
|
7
|
+
context "when extending from a class" do
|
8
|
+
|
9
|
+
before(:all) do
|
10
|
+
class Mountain
|
11
|
+
extend Mongoid::Criteria::Queryable::Forwardable
|
12
|
+
select_with :queryable
|
13
|
+
|
14
|
+
def self.queryable
|
15
|
+
Query.new
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
after(:all) do
|
21
|
+
Object.send(:remove_const, :Mountain)
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when provided a symbol" do
|
25
|
+
|
26
|
+
Mongoid::Criteria::Queryable::Selectable.forwardables.each do |method|
|
27
|
+
|
28
|
+
it "forwards #{method} to the provided method name" do
|
29
|
+
expect(Mountain).to respond_to(method)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
Mongoid::Criteria::Queryable::Optional.forwardables.each do |method|
|
34
|
+
|
35
|
+
it "forwards #{method} to the provided method name" do
|
36
|
+
expect(Mountain).to respond_to(method)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "when extending from a module" do
|
43
|
+
|
44
|
+
before(:all) do
|
45
|
+
module Finders
|
46
|
+
extend Mongoid::Criteria::Queryable::Forwardable
|
47
|
+
select_with :queryable
|
48
|
+
|
49
|
+
def self.queryable
|
50
|
+
Query.new
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
after(:all) do
|
56
|
+
Object.send(:remove_const, :Finders)
|
57
|
+
end
|
58
|
+
|
59
|
+
context "when provided a symbol" do
|
60
|
+
|
61
|
+
before(:all) do
|
62
|
+
class Mountain
|
63
|
+
extend Finders
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
after(:all) do
|
68
|
+
Object.send(:remove_const, :Mountain)
|
69
|
+
end
|
70
|
+
|
71
|
+
Mongoid::Criteria::Queryable::Selectable.forwardables.each do |method|
|
72
|
+
|
73
|
+
it "forwards #{method} to the provided method name" do
|
74
|
+
expect(Mountain).to respond_to(method)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
Mongoid::Criteria::Queryable::Optional.forwardables.each do |method|
|
79
|
+
|
80
|
+
it "forwards #{method} to the provided method name" do
|
81
|
+
expect(Mountain).to respond_to(method)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Criteria::Queryable::Key do
|
4
|
+
|
5
|
+
describe "#initialize" do
|
6
|
+
|
7
|
+
let(:key) do
|
8
|
+
described_class.new("field", :__union__, "$all")
|
9
|
+
end
|
10
|
+
|
11
|
+
it "sets the name" do
|
12
|
+
expect(key.name).to eq("field")
|
13
|
+
end
|
14
|
+
|
15
|
+
it "sets the operator" do
|
16
|
+
expect(key.operator).to eq("$all")
|
17
|
+
end
|
18
|
+
|
19
|
+
it "sets the strategy" do
|
20
|
+
expect(key.strategy).to eq(:__union__)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#__expr_part__" do
|
25
|
+
|
26
|
+
let(:key) do
|
27
|
+
described_class.new("field", :__union__, "$all")
|
28
|
+
end
|
29
|
+
|
30
|
+
let(:specified) do
|
31
|
+
key.__expr_part__([ 1, 2 ])
|
32
|
+
end
|
33
|
+
|
34
|
+
it "returns the name plus operator and value" do
|
35
|
+
expect(specified).to eq({ "field" => { "$all" => [ 1, 2 ] }})
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#hash' do
|
40
|
+
let(:key) do
|
41
|
+
described_class.new("field", :__union__, "$all")
|
42
|
+
end
|
43
|
+
|
44
|
+
let(:other) do
|
45
|
+
described_class.new("field", :__union__, "$all")
|
46
|
+
end
|
47
|
+
|
48
|
+
it "returns the same hash for keys with the same attributes" do
|
49
|
+
expect(key.hash).to eq(other.hash)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Criteria::Queryable::Mergeable do
|
4
|
+
|
5
|
+
describe "#intersect" do
|
6
|
+
|
7
|
+
let(:query) do
|
8
|
+
Mongoid::Query.new
|
9
|
+
end
|
10
|
+
|
11
|
+
before do
|
12
|
+
query.intersect
|
13
|
+
end
|
14
|
+
|
15
|
+
it "sets the strategy to intersect" do
|
16
|
+
expect(query.strategy).to eq(:__intersect__)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#override" do
|
21
|
+
|
22
|
+
let(:query) do
|
23
|
+
Mongoid::Query.new
|
24
|
+
end
|
25
|
+
|
26
|
+
before do
|
27
|
+
query.override
|
28
|
+
end
|
29
|
+
|
30
|
+
it "sets the strategy to override" do
|
31
|
+
expect(query.strategy).to eq(:__override__)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#union" do
|
36
|
+
|
37
|
+
let(:query) do
|
38
|
+
Mongoid::Query.new
|
39
|
+
end
|
40
|
+
|
41
|
+
before do
|
42
|
+
query.union
|
43
|
+
end
|
44
|
+
|
45
|
+
it "sets the strategy to union" do
|
46
|
+
expect(query.strategy).to eq(:__union__)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,1786 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Criteria::Queryable::Optional do
|
4
|
+
|
5
|
+
let(:query) do
|
6
|
+
Mongoid::Query.new
|
7
|
+
end
|
8
|
+
|
9
|
+
shared_examples_for "a cloning option" do
|
10
|
+
|
11
|
+
it "returns a cloned query" do
|
12
|
+
expect(selection).to_not equal(query)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
[ :asc, :ascending ].each do |method|
|
17
|
+
|
18
|
+
describe "##{method}" do
|
19
|
+
|
20
|
+
context "when using the official mongodb driver syntax" do
|
21
|
+
|
22
|
+
context "when the query is aggregating" do
|
23
|
+
|
24
|
+
let(:selection) do
|
25
|
+
query.project(name: 1).send(method, :field_one, :field_two)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "adds the sorting criteria" do
|
29
|
+
expect(selection.options).to eq(
|
30
|
+
{ sort: { "field_one" => 1, "field_two" => 1 }}
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "adds the sort to the aggregation" do
|
35
|
+
expect(selection.pipeline).to include(
|
36
|
+
{ "$sort" => { "field_one" => 1, "field_two" => 1 }}
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "does not add multiple entries to the pipeline" do
|
41
|
+
expect(selection.pipeline).to_not include(
|
42
|
+
{ "$sort" => { "field_one" => 1 }}
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
it_behaves_like "a cloning option"
|
47
|
+
end
|
48
|
+
|
49
|
+
context "when provided symbols" do
|
50
|
+
|
51
|
+
let(:selection) do
|
52
|
+
query.send(method, :field_one, :field_two)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "adds the sorting criteria" do
|
56
|
+
expect(selection.options).to eq(
|
57
|
+
{ sort: { "field_one" => 1, "field_two" => 1 }}
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
it_behaves_like "a cloning option"
|
62
|
+
end
|
63
|
+
|
64
|
+
context "when provided an array of symbols" do
|
65
|
+
|
66
|
+
let(:selection) do
|
67
|
+
query.send(method, [ :field_one, :field_two ])
|
68
|
+
end
|
69
|
+
|
70
|
+
it "adds the sorting criteria" do
|
71
|
+
expect(selection.options).to eq(
|
72
|
+
{ sort: { "field_one" => 1, "field_two" => 1 }}
|
73
|
+
)
|
74
|
+
end
|
75
|
+
|
76
|
+
it_behaves_like "a cloning option"
|
77
|
+
end
|
78
|
+
|
79
|
+
context "when provided strings" do
|
80
|
+
|
81
|
+
let(:selection) do
|
82
|
+
query.send(method, "field_one", "field_two")
|
83
|
+
end
|
84
|
+
|
85
|
+
it "adds the sorting criteria" do
|
86
|
+
expect(selection.options).to eq(
|
87
|
+
{ sort: { "field_one" => 1, "field_two" => 1 }}
|
88
|
+
)
|
89
|
+
end
|
90
|
+
|
91
|
+
it_behaves_like "a cloning option"
|
92
|
+
end
|
93
|
+
|
94
|
+
context "when provided an array of strings" do
|
95
|
+
|
96
|
+
let(:selection) do
|
97
|
+
query.send(method, [ "field_one", "field_two" ])
|
98
|
+
end
|
99
|
+
|
100
|
+
it "adds the sorting criteria" do
|
101
|
+
expect(selection.options).to eq(
|
102
|
+
{ sort: { "field_one" => 1, "field_two" => 1 }}
|
103
|
+
)
|
104
|
+
end
|
105
|
+
|
106
|
+
it_behaves_like "a cloning option"
|
107
|
+
end
|
108
|
+
|
109
|
+
context "when provided no options" do
|
110
|
+
|
111
|
+
let(:selection) do
|
112
|
+
query.send(method)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "does not add any sorting criteria" do
|
116
|
+
expect(selection.options).to be_empty
|
117
|
+
end
|
118
|
+
|
119
|
+
it "returns the query" do
|
120
|
+
expect(selection).to eq(query)
|
121
|
+
end
|
122
|
+
|
123
|
+
it_behaves_like "a cloning option"
|
124
|
+
end
|
125
|
+
|
126
|
+
context "when provided nil" do
|
127
|
+
|
128
|
+
let(:selection) do
|
129
|
+
query.send(method, nil)
|
130
|
+
end
|
131
|
+
|
132
|
+
it "does not add any sorting criteria" do
|
133
|
+
expect(selection.options).to be_empty
|
134
|
+
end
|
135
|
+
|
136
|
+
it "returns the query" do
|
137
|
+
expect(selection).to eq(query)
|
138
|
+
end
|
139
|
+
|
140
|
+
it_behaves_like "a cloning option"
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context "when using the mongo-1.x driver syntax" do
|
145
|
+
|
146
|
+
let(:query) do
|
147
|
+
Mongoid::Query.new({}, {}, :mongo1x)
|
148
|
+
end
|
149
|
+
|
150
|
+
context "when provided symbols" do
|
151
|
+
|
152
|
+
let(:selection) do
|
153
|
+
query.send(method, :field_one, :field_two)
|
154
|
+
end
|
155
|
+
|
156
|
+
it "adds the sorting criteria" do
|
157
|
+
expect(selection.options).to eq(
|
158
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, 1 ]]}
|
159
|
+
)
|
160
|
+
end
|
161
|
+
|
162
|
+
it_behaves_like "a cloning option"
|
163
|
+
end
|
164
|
+
|
165
|
+
context "when provided an array of symbols" do
|
166
|
+
|
167
|
+
let(:selection) do
|
168
|
+
query.send(method, [ :field_one, :field_two ])
|
169
|
+
end
|
170
|
+
|
171
|
+
it "adds the sorting criteria" do
|
172
|
+
expect(selection.options).to eq(
|
173
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, 1 ]]}
|
174
|
+
)
|
175
|
+
end
|
176
|
+
|
177
|
+
it_behaves_like "a cloning option"
|
178
|
+
end
|
179
|
+
|
180
|
+
context "when provided strings" do
|
181
|
+
|
182
|
+
let(:selection) do
|
183
|
+
query.send(method, "field_one", "field_two")
|
184
|
+
end
|
185
|
+
|
186
|
+
it "adds the sorting criteria" do
|
187
|
+
expect(selection.options).to eq(
|
188
|
+
{ sort: [[ "field_one", 1 ], [ "field_two", 1 ]]}
|
189
|
+
)
|
190
|
+
end
|
191
|
+
|
192
|
+
it_behaves_like "a cloning option"
|
193
|
+
end
|
194
|
+
|
195
|
+
context "when provided an array of strings" do
|
196
|
+
|
197
|
+
let(:selection) do
|
198
|
+
query.send(method, [ "field_one", "field_two" ])
|
199
|
+
end
|
200
|
+
|
201
|
+
it "adds the sorting criteria" do
|
202
|
+
expect(selection.options).to eq(
|
203
|
+
{ sort: [[ "field_one", 1 ], [ "field_two", 1 ]]}
|
204
|
+
)
|
205
|
+
end
|
206
|
+
|
207
|
+
it_behaves_like "a cloning option"
|
208
|
+
end
|
209
|
+
|
210
|
+
context "when provided no options" do
|
211
|
+
|
212
|
+
let(:selection) do
|
213
|
+
query.send(method)
|
214
|
+
end
|
215
|
+
|
216
|
+
it "does not add any sorting criteria" do
|
217
|
+
expect(selection.options).to be_empty
|
218
|
+
end
|
219
|
+
|
220
|
+
it "returns the query" do
|
221
|
+
expect(selection).to eq(query)
|
222
|
+
end
|
223
|
+
|
224
|
+
it_behaves_like "a cloning option"
|
225
|
+
end
|
226
|
+
|
227
|
+
context "when provided nil" do
|
228
|
+
|
229
|
+
let(:selection) do
|
230
|
+
query.send(method, nil)
|
231
|
+
end
|
232
|
+
|
233
|
+
it "does not add any sorting criteria" do
|
234
|
+
expect(selection.options).to be_empty
|
235
|
+
end
|
236
|
+
|
237
|
+
it "returns the query" do
|
238
|
+
expect(selection).to eq(query)
|
239
|
+
end
|
240
|
+
|
241
|
+
it_behaves_like "a cloning option"
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
describe "#batch_size" do
|
248
|
+
|
249
|
+
context "when provided no options" do
|
250
|
+
|
251
|
+
let(:selection) do
|
252
|
+
query.batch_size
|
253
|
+
end
|
254
|
+
|
255
|
+
it "does not add any options" do
|
256
|
+
expect(selection.options).to eq({})
|
257
|
+
end
|
258
|
+
|
259
|
+
it_behaves_like "a cloning option"
|
260
|
+
end
|
261
|
+
|
262
|
+
context "when provided nil" do
|
263
|
+
|
264
|
+
let(:selection) do
|
265
|
+
query.batch_size(nil)
|
266
|
+
end
|
267
|
+
|
268
|
+
it "does not add any options" do
|
269
|
+
expect(selection.options).to eq({})
|
270
|
+
end
|
271
|
+
|
272
|
+
it_behaves_like "a cloning option"
|
273
|
+
end
|
274
|
+
|
275
|
+
context "when provided arguments" do
|
276
|
+
|
277
|
+
let(:selection) do
|
278
|
+
query.batch_size(500)
|
279
|
+
end
|
280
|
+
|
281
|
+
it "adds the field options" do
|
282
|
+
expect(selection.options).to eq({ batch_size: 500 })
|
283
|
+
end
|
284
|
+
|
285
|
+
it_behaves_like "a cloning option"
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
[ :desc, :descending ].each do |method|
|
290
|
+
|
291
|
+
describe "##{method}" do
|
292
|
+
|
293
|
+
context "when using the official mongodb driver syntax" do
|
294
|
+
|
295
|
+
context "when the query is aggregating" do
|
296
|
+
|
297
|
+
let(:selection) do
|
298
|
+
query.project(name: 1).send(method, :field_one, :field_two)
|
299
|
+
end
|
300
|
+
|
301
|
+
it "adds the sorting criteria" do
|
302
|
+
expect(selection.options).to eq(
|
303
|
+
{ sort: { "field_one" => -1, "field_two" => -1 }}
|
304
|
+
)
|
305
|
+
end
|
306
|
+
|
307
|
+
it "adds the sort to the aggregation" do
|
308
|
+
expect(selection.pipeline).to include(
|
309
|
+
{ "$sort" => { "field_one" => -1, "field_two" => -1 }}
|
310
|
+
)
|
311
|
+
end
|
312
|
+
|
313
|
+
it "does not add multiple entries to the pipeline" do
|
314
|
+
expect(selection.pipeline).to_not include(
|
315
|
+
{ "$sort" => { "field_one" => -1 }}
|
316
|
+
)
|
317
|
+
end
|
318
|
+
|
319
|
+
it_behaves_like "a cloning option"
|
320
|
+
end
|
321
|
+
|
322
|
+
context "when provided symbols" do
|
323
|
+
|
324
|
+
let(:selection) do
|
325
|
+
query.send(method, :field_one, :field_two)
|
326
|
+
end
|
327
|
+
|
328
|
+
it "adds the sorting criteria" do
|
329
|
+
expect(selection.options).to eq(
|
330
|
+
{ sort: { "field_one" => -1, "field_two" => -1 }}
|
331
|
+
)
|
332
|
+
end
|
333
|
+
|
334
|
+
it_behaves_like "a cloning option"
|
335
|
+
end
|
336
|
+
|
337
|
+
context "when provided an array of symbols" do
|
338
|
+
|
339
|
+
let(:selection) do
|
340
|
+
query.send(method, [ :field_one, :field_two ])
|
341
|
+
end
|
342
|
+
|
343
|
+
it "adds the sorting criteria" do
|
344
|
+
expect(selection.options).to eq(
|
345
|
+
{ sort: { "field_one" => -1, "field_two" => -1 }}
|
346
|
+
)
|
347
|
+
end
|
348
|
+
|
349
|
+
it_behaves_like "a cloning option"
|
350
|
+
end
|
351
|
+
|
352
|
+
context "when provided strings" do
|
353
|
+
|
354
|
+
let(:selection) do
|
355
|
+
query.send(method, "field_one", "field_two")
|
356
|
+
end
|
357
|
+
|
358
|
+
it "adds the sorting criteria" do
|
359
|
+
expect(selection.options).to eq(
|
360
|
+
{ sort: { "field_one" => -1, "field_two" => -1 }}
|
361
|
+
)
|
362
|
+
end
|
363
|
+
|
364
|
+
it_behaves_like "a cloning option"
|
365
|
+
end
|
366
|
+
|
367
|
+
context "when provided an array of strings" do
|
368
|
+
|
369
|
+
let(:selection) do
|
370
|
+
query.send(method, [ "field_one", "field_two" ])
|
371
|
+
end
|
372
|
+
|
373
|
+
it "adds the sorting criteria" do
|
374
|
+
expect(selection.options).to eq(
|
375
|
+
{ sort: { "field_one" => -1, "field_two" => -1 }}
|
376
|
+
)
|
377
|
+
end
|
378
|
+
|
379
|
+
it_behaves_like "a cloning option"
|
380
|
+
end
|
381
|
+
|
382
|
+
context "when provided no options" do
|
383
|
+
|
384
|
+
let(:selection) do
|
385
|
+
query.send(method)
|
386
|
+
end
|
387
|
+
|
388
|
+
it "does not add any sorting criteria" do
|
389
|
+
expect(selection.options).to be_empty
|
390
|
+
end
|
391
|
+
|
392
|
+
it "returns the query" do
|
393
|
+
expect(selection).to eq(query)
|
394
|
+
end
|
395
|
+
|
396
|
+
it_behaves_like "a cloning option"
|
397
|
+
end
|
398
|
+
|
399
|
+
context "when provided nil" do
|
400
|
+
|
401
|
+
let(:selection) do
|
402
|
+
query.send(method, nil)
|
403
|
+
end
|
404
|
+
|
405
|
+
it "does not add any sorting criteria" do
|
406
|
+
expect(selection.options).to be_empty
|
407
|
+
end
|
408
|
+
|
409
|
+
it "returns the query" do
|
410
|
+
expect(selection).to eq(query)
|
411
|
+
end
|
412
|
+
|
413
|
+
it_behaves_like "a cloning option"
|
414
|
+
end
|
415
|
+
end
|
416
|
+
|
417
|
+
context "when using the mongo-1.x driver syntax" do
|
418
|
+
|
419
|
+
let(:query) do
|
420
|
+
Mongoid::Query.new({}, {}, :mongo1x)
|
421
|
+
end
|
422
|
+
|
423
|
+
context "when provided symbols" do
|
424
|
+
|
425
|
+
let(:selection) do
|
426
|
+
query.send(method, :field_one, :field_two)
|
427
|
+
end
|
428
|
+
|
429
|
+
it "adds the sorting criteria" do
|
430
|
+
expect(selection.options).to eq(
|
431
|
+
{ sort: [[ :field_one, -1 ], [ :field_two, -1 ]]}
|
432
|
+
)
|
433
|
+
end
|
434
|
+
|
435
|
+
it_behaves_like "a cloning option"
|
436
|
+
end
|
437
|
+
|
438
|
+
context "when provided an array of symbols" do
|
439
|
+
|
440
|
+
let(:selection) do
|
441
|
+
query.send(method, [ :field_one, :field_two ])
|
442
|
+
end
|
443
|
+
|
444
|
+
it "adds the sorting criteria" do
|
445
|
+
expect(selection.options).to eq(
|
446
|
+
{ sort: [[ :field_one, -1 ], [ :field_two, -1 ]]}
|
447
|
+
)
|
448
|
+
end
|
449
|
+
|
450
|
+
it_behaves_like "a cloning option"
|
451
|
+
end
|
452
|
+
|
453
|
+
context "when provided strings" do
|
454
|
+
|
455
|
+
let(:selection) do
|
456
|
+
query.send(method, "field_one", "field_two")
|
457
|
+
end
|
458
|
+
|
459
|
+
it "adds the sorting criteria" do
|
460
|
+
expect(selection.options).to eq(
|
461
|
+
{ sort: [[ "field_one", -1 ], [ "field_two", -1 ]]}
|
462
|
+
)
|
463
|
+
end
|
464
|
+
|
465
|
+
it_behaves_like "a cloning option"
|
466
|
+
end
|
467
|
+
|
468
|
+
context "when provided an array of strings" do
|
469
|
+
|
470
|
+
let(:selection) do
|
471
|
+
query.send(method, [ "field_one", "field_two" ])
|
472
|
+
end
|
473
|
+
|
474
|
+
it "adds the sorting criteria" do
|
475
|
+
expect(selection.options).to eq(
|
476
|
+
{ sort: [[ "field_one", -1 ], [ "field_two", -1 ]]}
|
477
|
+
)
|
478
|
+
end
|
479
|
+
|
480
|
+
it_behaves_like "a cloning option"
|
481
|
+
end
|
482
|
+
|
483
|
+
context "when provided no options" do
|
484
|
+
|
485
|
+
let(:selection) do
|
486
|
+
query.send(method)
|
487
|
+
end
|
488
|
+
|
489
|
+
it "does not add any sorting criteria" do
|
490
|
+
expect(selection.options).to be_empty
|
491
|
+
end
|
492
|
+
|
493
|
+
it "returns the query" do
|
494
|
+
expect(selection).to eq(query)
|
495
|
+
end
|
496
|
+
|
497
|
+
it_behaves_like "a cloning option"
|
498
|
+
end
|
499
|
+
|
500
|
+
context "when provided nil" do
|
501
|
+
|
502
|
+
let(:selection) do
|
503
|
+
query.send(method, nil)
|
504
|
+
end
|
505
|
+
|
506
|
+
it "does not add any sorting criteria" do
|
507
|
+
expect(selection.options).to be_empty
|
508
|
+
end
|
509
|
+
|
510
|
+
it "returns the query" do
|
511
|
+
expect(selection).to eq(query)
|
512
|
+
end
|
513
|
+
|
514
|
+
it_behaves_like "a cloning option"
|
515
|
+
end
|
516
|
+
end
|
517
|
+
end
|
518
|
+
end
|
519
|
+
|
520
|
+
describe "#hint" do
|
521
|
+
|
522
|
+
context "when provided no options" do
|
523
|
+
|
524
|
+
let(:selection) do
|
525
|
+
query.hint
|
526
|
+
end
|
527
|
+
|
528
|
+
it "does not add any options" do
|
529
|
+
expect(selection.options).to eq({})
|
530
|
+
end
|
531
|
+
|
532
|
+
it "returns the query" do
|
533
|
+
expect(selection).to eq(query)
|
534
|
+
end
|
535
|
+
|
536
|
+
it_behaves_like "a cloning option"
|
537
|
+
end
|
538
|
+
|
539
|
+
context "when provided nil" do
|
540
|
+
|
541
|
+
let(:selection) do
|
542
|
+
query.hint(nil)
|
543
|
+
end
|
544
|
+
|
545
|
+
it "does not add any options" do
|
546
|
+
expect(selection.options).to eq({})
|
547
|
+
end
|
548
|
+
|
549
|
+
it "returns the query" do
|
550
|
+
expect(selection).to eq(query)
|
551
|
+
end
|
552
|
+
|
553
|
+
it_behaves_like "a cloning option"
|
554
|
+
end
|
555
|
+
|
556
|
+
context "when provided arguments" do
|
557
|
+
|
558
|
+
context "when the argument is a hash" do
|
559
|
+
|
560
|
+
let(:selection) do
|
561
|
+
query.hint("$natural" => 1)
|
562
|
+
end
|
563
|
+
|
564
|
+
it "adds the field options" do
|
565
|
+
expect(selection.options).to eq({ hint: { "$natural" => 1 }})
|
566
|
+
end
|
567
|
+
|
568
|
+
it_behaves_like "a cloning option"
|
569
|
+
end
|
570
|
+
end
|
571
|
+
end
|
572
|
+
|
573
|
+
describe "#limit" do
|
574
|
+
|
575
|
+
context "when provided no options" do
|
576
|
+
|
577
|
+
let(:selection) do
|
578
|
+
query.limit
|
579
|
+
end
|
580
|
+
|
581
|
+
it "does not add any options" do
|
582
|
+
expect(selection.options).to eq({})
|
583
|
+
end
|
584
|
+
|
585
|
+
it "returns the query" do
|
586
|
+
expect(selection).to eq(query)
|
587
|
+
end
|
588
|
+
|
589
|
+
it_behaves_like "a cloning option"
|
590
|
+
end
|
591
|
+
|
592
|
+
context "when provided nil" do
|
593
|
+
|
594
|
+
let(:selection) do
|
595
|
+
query.limit(nil)
|
596
|
+
end
|
597
|
+
|
598
|
+
it "does not add any options" do
|
599
|
+
expect(selection.options).to eq({})
|
600
|
+
end
|
601
|
+
|
602
|
+
it "returns the query" do
|
603
|
+
expect(selection).to eq(query)
|
604
|
+
end
|
605
|
+
|
606
|
+
it_behaves_like "a cloning option"
|
607
|
+
end
|
608
|
+
|
609
|
+
context "when the query is aggregating" do
|
610
|
+
|
611
|
+
let(:selection) do
|
612
|
+
query.project(name: 1).limit(10)
|
613
|
+
end
|
614
|
+
|
615
|
+
it "adds the field options" do
|
616
|
+
expect(selection.options).to eq({ limit: 10 })
|
617
|
+
end
|
618
|
+
|
619
|
+
it "adds the limit to the aggregation" do
|
620
|
+
expect(selection.pipeline).to include({ "$limit" => 10 })
|
621
|
+
end
|
622
|
+
|
623
|
+
it_behaves_like "a cloning option"
|
624
|
+
end
|
625
|
+
|
626
|
+
context "when provided arguments" do
|
627
|
+
|
628
|
+
context "when the argument is an integer" do
|
629
|
+
|
630
|
+
let(:selection) do
|
631
|
+
query.limit(10)
|
632
|
+
end
|
633
|
+
|
634
|
+
it "adds the field options" do
|
635
|
+
expect(selection.options).to eq({ limit: 10 })
|
636
|
+
end
|
637
|
+
|
638
|
+
it_behaves_like "a cloning option"
|
639
|
+
end
|
640
|
+
|
641
|
+
context "when the argument is a float" do
|
642
|
+
|
643
|
+
let(:selection) do
|
644
|
+
query.limit(10.25)
|
645
|
+
end
|
646
|
+
|
647
|
+
it "adds the field options as an integer" do
|
648
|
+
expect(selection.options).to eq({ limit: 10 })
|
649
|
+
end
|
650
|
+
|
651
|
+
it_behaves_like "a cloning option"
|
652
|
+
end
|
653
|
+
|
654
|
+
context "when the argument is a string" do
|
655
|
+
|
656
|
+
let(:selection) do
|
657
|
+
query.limit("10")
|
658
|
+
end
|
659
|
+
|
660
|
+
it "adds the field options as an integer" do
|
661
|
+
expect(selection.options).to eq({ limit: 10 })
|
662
|
+
end
|
663
|
+
|
664
|
+
it_behaves_like "a cloning option"
|
665
|
+
end
|
666
|
+
end
|
667
|
+
end
|
668
|
+
|
669
|
+
describe "#max_scan" do
|
670
|
+
|
671
|
+
context "when provided no options" do
|
672
|
+
|
673
|
+
let(:selection) do
|
674
|
+
query.max_scan
|
675
|
+
end
|
676
|
+
|
677
|
+
it "does not add any options" do
|
678
|
+
expect(selection.options).to eq({})
|
679
|
+
end
|
680
|
+
|
681
|
+
it "returns the query" do
|
682
|
+
expect(selection).to eq(query)
|
683
|
+
end
|
684
|
+
|
685
|
+
it_behaves_like "a cloning option"
|
686
|
+
end
|
687
|
+
|
688
|
+
context "when provided nil" do
|
689
|
+
|
690
|
+
let(:selection) do
|
691
|
+
query.max_scan(nil)
|
692
|
+
end
|
693
|
+
|
694
|
+
it "does not add any options" do
|
695
|
+
expect(selection.options).to eq({})
|
696
|
+
end
|
697
|
+
|
698
|
+
it "returns the query" do
|
699
|
+
expect(selection).to eq(query)
|
700
|
+
end
|
701
|
+
|
702
|
+
it_behaves_like "a cloning option"
|
703
|
+
end
|
704
|
+
|
705
|
+
context "when provided arguments" do
|
706
|
+
|
707
|
+
let(:selection) do
|
708
|
+
query.max_scan(500)
|
709
|
+
end
|
710
|
+
|
711
|
+
it "adds the field options" do
|
712
|
+
expect(selection.options).to eq({ max_scan: 500 })
|
713
|
+
end
|
714
|
+
|
715
|
+
it_behaves_like "a cloning option"
|
716
|
+
end
|
717
|
+
end
|
718
|
+
|
719
|
+
describe "#max_time_ms" do
|
720
|
+
|
721
|
+
context "when provided no options" do
|
722
|
+
|
723
|
+
let(:selection) do
|
724
|
+
query.max_time_ms
|
725
|
+
end
|
726
|
+
|
727
|
+
it "does not add any options" do
|
728
|
+
expect(selection.options).to eq({})
|
729
|
+
end
|
730
|
+
|
731
|
+
it "returns the query" do
|
732
|
+
expect(selection).to eq(query)
|
733
|
+
end
|
734
|
+
|
735
|
+
it_behaves_like "a cloning option"
|
736
|
+
end
|
737
|
+
|
738
|
+
context "when provided nil" do
|
739
|
+
|
740
|
+
let(:selection) do
|
741
|
+
query.max_time_ms(nil)
|
742
|
+
end
|
743
|
+
|
744
|
+
it "does not add any options" do
|
745
|
+
expect(selection.options).to eq({})
|
746
|
+
end
|
747
|
+
|
748
|
+
it "returns the query" do
|
749
|
+
expect(selection).to eq(query)
|
750
|
+
end
|
751
|
+
|
752
|
+
it_behaves_like "a cloning option"
|
753
|
+
end
|
754
|
+
|
755
|
+
context "when provided arguments" do
|
756
|
+
|
757
|
+
let(:selection) do
|
758
|
+
query.max_time_ms(500)
|
759
|
+
end
|
760
|
+
|
761
|
+
it "adds the field options" do
|
762
|
+
expect(selection.options).to eq({ max_time_ms: 500 })
|
763
|
+
end
|
764
|
+
|
765
|
+
it_behaves_like "a cloning option"
|
766
|
+
end
|
767
|
+
end
|
768
|
+
|
769
|
+
describe "#no_timeout" do
|
770
|
+
|
771
|
+
let(:selection) do
|
772
|
+
query.no_timeout
|
773
|
+
end
|
774
|
+
|
775
|
+
it "adds the timeout option" do
|
776
|
+
expect(selection.options).to eq({ timeout: false })
|
777
|
+
end
|
778
|
+
|
779
|
+
it_behaves_like "a cloning option"
|
780
|
+
end
|
781
|
+
|
782
|
+
describe "#only" do
|
783
|
+
|
784
|
+
context "when provided no options" do
|
785
|
+
|
786
|
+
let(:selection) do
|
787
|
+
query.only
|
788
|
+
end
|
789
|
+
|
790
|
+
it "does not add any options" do
|
791
|
+
expect(selection.options).to eq({})
|
792
|
+
end
|
793
|
+
|
794
|
+
it "returns the query" do
|
795
|
+
expect(selection).to eq(query)
|
796
|
+
end
|
797
|
+
|
798
|
+
it_behaves_like "a cloning option"
|
799
|
+
end
|
800
|
+
|
801
|
+
context "when provided nil" do
|
802
|
+
|
803
|
+
let(:selection) do
|
804
|
+
query.only(nil)
|
805
|
+
end
|
806
|
+
|
807
|
+
it "does not add any options" do
|
808
|
+
expect(selection.options).to eq({})
|
809
|
+
end
|
810
|
+
|
811
|
+
it "returns the query" do
|
812
|
+
expect(selection).to eq(query)
|
813
|
+
end
|
814
|
+
|
815
|
+
it_behaves_like "a cloning option"
|
816
|
+
end
|
817
|
+
|
818
|
+
context "when provided fields" do
|
819
|
+
|
820
|
+
context "as several arguments" do
|
821
|
+
|
822
|
+
let(:selection) do
|
823
|
+
query.only(:first, :second)
|
824
|
+
end
|
825
|
+
|
826
|
+
it "adds the field options" do
|
827
|
+
expect(selection.options).to eq(
|
828
|
+
{ fields: { "first" => 1, "second" => 1 }}
|
829
|
+
)
|
830
|
+
end
|
831
|
+
|
832
|
+
it_behaves_like "a cloning option"
|
833
|
+
end
|
834
|
+
|
835
|
+
context "as one argument - array" do
|
836
|
+
|
837
|
+
let(:selection) do
|
838
|
+
query.only([:first, :second])
|
839
|
+
end
|
840
|
+
|
841
|
+
it "adds the field options" do
|
842
|
+
expect(selection.options).to eq(
|
843
|
+
{ fields: { "first" => 1, "second" => 1 }}
|
844
|
+
)
|
845
|
+
end
|
846
|
+
|
847
|
+
it_behaves_like "a cloning option"
|
848
|
+
end
|
849
|
+
end
|
850
|
+
|
851
|
+
context "when #without was called first" do
|
852
|
+
|
853
|
+
let(:selection) do
|
854
|
+
query.without(:id).only(:first)
|
855
|
+
end
|
856
|
+
|
857
|
+
it "adds both fields to option" do
|
858
|
+
expect(selection.options).to eq(
|
859
|
+
{ fields: { "id" => 0, "first" => 1 } }
|
860
|
+
)
|
861
|
+
end
|
862
|
+
end
|
863
|
+
end
|
864
|
+
|
865
|
+
[ :order, :order_by ].each do |method|
|
866
|
+
|
867
|
+
describe "##{method}" do
|
868
|
+
|
869
|
+
context "when using the official mongodb driver syntax" do
|
870
|
+
|
871
|
+
context "when provided a hash" do
|
872
|
+
|
873
|
+
context "when the query is aggregating" do
|
874
|
+
|
875
|
+
let(:selection) do
|
876
|
+
query.project(name: 1).send("#{method}", field_one: 1, field_two: -1)
|
877
|
+
end
|
878
|
+
|
879
|
+
it "adds the sorting criteria" do
|
880
|
+
expect(selection.options).to eq(
|
881
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
882
|
+
)
|
883
|
+
end
|
884
|
+
|
885
|
+
it "adds the sort to the aggregation" do
|
886
|
+
expect(selection.pipeline).to include(
|
887
|
+
{ "$sort" => { "field_one" => 1, "field_two" => -1 }}
|
888
|
+
)
|
889
|
+
end
|
890
|
+
|
891
|
+
it "does not add multiple entries to the pipeline" do
|
892
|
+
expect(selection.pipeline).to_not include(
|
893
|
+
{ "$sort" => { "field_one" => 1 }}
|
894
|
+
)
|
895
|
+
end
|
896
|
+
|
897
|
+
it_behaves_like "a cloning option"
|
898
|
+
end
|
899
|
+
|
900
|
+
context "when the hash has integer values" do
|
901
|
+
|
902
|
+
let(:selection) do
|
903
|
+
query.send("#{method}", field_one: 1, field_two: -1)
|
904
|
+
end
|
905
|
+
|
906
|
+
it "adds the sorting criteria" do
|
907
|
+
expect(selection.options).to eq(
|
908
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
909
|
+
)
|
910
|
+
end
|
911
|
+
|
912
|
+
it_behaves_like "a cloning option"
|
913
|
+
end
|
914
|
+
|
915
|
+
context "when the hash has symbol values" do
|
916
|
+
|
917
|
+
let(:selection) do
|
918
|
+
query.send("#{method}", field_one: :asc, field_two: :desc)
|
919
|
+
end
|
920
|
+
|
921
|
+
it "adds the sorting criteria" do
|
922
|
+
expect(selection.options).to eq(
|
923
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
924
|
+
)
|
925
|
+
end
|
926
|
+
|
927
|
+
it_behaves_like "a cloning option"
|
928
|
+
end
|
929
|
+
|
930
|
+
context "when the hash has string values" do
|
931
|
+
|
932
|
+
let(:selection) do
|
933
|
+
query.send("#{method}", field_one: "asc", field_two: "desc")
|
934
|
+
end
|
935
|
+
|
936
|
+
it "adds the sorting criteria" do
|
937
|
+
expect(selection.options).to eq(
|
938
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
939
|
+
)
|
940
|
+
end
|
941
|
+
|
942
|
+
it_behaves_like "a cloning option"
|
943
|
+
end
|
944
|
+
end
|
945
|
+
|
946
|
+
context "when provided an array" do
|
947
|
+
|
948
|
+
context "when the array is multi-dimensional" do
|
949
|
+
|
950
|
+
context "when the arrays have integer values" do
|
951
|
+
|
952
|
+
let(:selection) do
|
953
|
+
query.send("#{method}", [[ :field_one, 1 ],[ :field_two, -1 ]])
|
954
|
+
end
|
955
|
+
|
956
|
+
it "adds the sorting criteria" do
|
957
|
+
expect(selection.options).to eq(
|
958
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
959
|
+
)
|
960
|
+
end
|
961
|
+
|
962
|
+
it_behaves_like "a cloning option"
|
963
|
+
end
|
964
|
+
|
965
|
+
context "when the arrays have symbol values" do
|
966
|
+
|
967
|
+
let(:selection) do
|
968
|
+
query.send("#{method}", [[ :field_one, :asc ],[ :field_two, :desc ]])
|
969
|
+
end
|
970
|
+
|
971
|
+
it "adds the sorting criteria" do
|
972
|
+
expect(selection.options).to eq(
|
973
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
974
|
+
)
|
975
|
+
end
|
976
|
+
|
977
|
+
it_behaves_like "a cloning option"
|
978
|
+
end
|
979
|
+
|
980
|
+
context "when the arrays have string values" do
|
981
|
+
|
982
|
+
let(:selection) do
|
983
|
+
query.send("#{method}", [[ :field_one, "asc" ],[ :field_two, "desc" ]])
|
984
|
+
end
|
985
|
+
|
986
|
+
it "adds the sorting criteria" do
|
987
|
+
expect(selection.options).to eq(
|
988
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
989
|
+
)
|
990
|
+
end
|
991
|
+
|
992
|
+
it_behaves_like "a cloning option"
|
993
|
+
end
|
994
|
+
end
|
995
|
+
|
996
|
+
context "when the array is selectable keys" do
|
997
|
+
|
998
|
+
let(:selection) do
|
999
|
+
query.send("#{method}", [ :field_one.asc, :field_two.desc ])
|
1000
|
+
end
|
1001
|
+
|
1002
|
+
it "adds the sorting criteria" do
|
1003
|
+
expect(selection.options).to eq(
|
1004
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
1005
|
+
)
|
1006
|
+
end
|
1007
|
+
|
1008
|
+
it_behaves_like "a cloning option"
|
1009
|
+
end
|
1010
|
+
end
|
1011
|
+
|
1012
|
+
context "when provided values" do
|
1013
|
+
|
1014
|
+
context "when the values are arrays" do
|
1015
|
+
|
1016
|
+
context "when the values have integer directions" do
|
1017
|
+
|
1018
|
+
let(:selection) do
|
1019
|
+
query.send("#{method}", [ :field_one, 1 ],[ :field_two, -1 ])
|
1020
|
+
end
|
1021
|
+
|
1022
|
+
it "adds the sorting criteria" do
|
1023
|
+
expect(selection.options).to eq(
|
1024
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
1025
|
+
)
|
1026
|
+
end
|
1027
|
+
|
1028
|
+
it_behaves_like "a cloning option"
|
1029
|
+
end
|
1030
|
+
|
1031
|
+
context "when the values have symbol directions" do
|
1032
|
+
|
1033
|
+
let(:selection) do
|
1034
|
+
query.send("#{method}", [ :field_one, :asc ],[ :field_two, :desc ])
|
1035
|
+
end
|
1036
|
+
|
1037
|
+
it "adds the sorting criteria" do
|
1038
|
+
expect(selection.options).to eq(
|
1039
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
1040
|
+
)
|
1041
|
+
end
|
1042
|
+
|
1043
|
+
it_behaves_like "a cloning option"
|
1044
|
+
end
|
1045
|
+
|
1046
|
+
context "when the values have string directions" do
|
1047
|
+
|
1048
|
+
let(:selection) do
|
1049
|
+
query.send("#{method}", [ :field_one, "asc" ],[ :field_two, "desc" ])
|
1050
|
+
end
|
1051
|
+
|
1052
|
+
it "adds the sorting criteria" do
|
1053
|
+
expect(selection.options).to eq(
|
1054
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
1055
|
+
)
|
1056
|
+
end
|
1057
|
+
|
1058
|
+
it_behaves_like "a cloning option"
|
1059
|
+
end
|
1060
|
+
end
|
1061
|
+
|
1062
|
+
context "when the values are selectable keys" do
|
1063
|
+
|
1064
|
+
let(:selection) do
|
1065
|
+
query.send("#{method}", :field_one.asc, :field_two.desc)
|
1066
|
+
end
|
1067
|
+
|
1068
|
+
it "adds the sorting criteria" do
|
1069
|
+
expect(selection.options).to eq(
|
1070
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
1071
|
+
)
|
1072
|
+
end
|
1073
|
+
|
1074
|
+
it_behaves_like "a cloning option"
|
1075
|
+
end
|
1076
|
+
end
|
1077
|
+
|
1078
|
+
context "when provided a string" do
|
1079
|
+
|
1080
|
+
context "when the direction is lowercase" do
|
1081
|
+
|
1082
|
+
context "when abbreviated" do
|
1083
|
+
|
1084
|
+
let(:selection) do
|
1085
|
+
query.send("#{method}", "field_one asc, field_two desc")
|
1086
|
+
end
|
1087
|
+
|
1088
|
+
it "adds the sorting criteria" do
|
1089
|
+
expect(selection.options).to eq(
|
1090
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
1091
|
+
)
|
1092
|
+
end
|
1093
|
+
|
1094
|
+
it_behaves_like "a cloning option"
|
1095
|
+
end
|
1096
|
+
|
1097
|
+
context "when spelled out" do
|
1098
|
+
|
1099
|
+
let(:selection) do
|
1100
|
+
query.send("#{method}", "field_one ascending, field_two descending")
|
1101
|
+
end
|
1102
|
+
|
1103
|
+
it "adds the sorting criteria" do
|
1104
|
+
expect(selection.options).to eq(
|
1105
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
1106
|
+
)
|
1107
|
+
end
|
1108
|
+
|
1109
|
+
it_behaves_like "a cloning option"
|
1110
|
+
end
|
1111
|
+
end
|
1112
|
+
|
1113
|
+
context "when the direction is uppercase" do
|
1114
|
+
|
1115
|
+
context "when abbreviated" do
|
1116
|
+
|
1117
|
+
let(:selection) do
|
1118
|
+
query.send("#{method}", "field_one ASC, field_two DESC")
|
1119
|
+
end
|
1120
|
+
|
1121
|
+
it "adds the sorting criteria" do
|
1122
|
+
expect(selection.options).to eq(
|
1123
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
1124
|
+
)
|
1125
|
+
end
|
1126
|
+
|
1127
|
+
it_behaves_like "a cloning option"
|
1128
|
+
end
|
1129
|
+
|
1130
|
+
context "when spelled out" do
|
1131
|
+
|
1132
|
+
let(:selection) do
|
1133
|
+
query.send("#{method}", "field_one ASCENDING, field_two DESCENDING")
|
1134
|
+
end
|
1135
|
+
|
1136
|
+
it "adds the sorting criteria" do
|
1137
|
+
expect(selection.options).to eq(
|
1138
|
+
{ sort: { "field_one" => 1, "field_two" => -1 }}
|
1139
|
+
)
|
1140
|
+
end
|
1141
|
+
|
1142
|
+
it_behaves_like "a cloning option"
|
1143
|
+
end
|
1144
|
+
end
|
1145
|
+
end
|
1146
|
+
|
1147
|
+
context "when provided no options" do
|
1148
|
+
|
1149
|
+
let(:selection) do
|
1150
|
+
query.order_by
|
1151
|
+
end
|
1152
|
+
|
1153
|
+
it "returns the query" do
|
1154
|
+
expect(selection).to eq(query)
|
1155
|
+
end
|
1156
|
+
|
1157
|
+
it_behaves_like "a cloning option"
|
1158
|
+
end
|
1159
|
+
|
1160
|
+
context "when provided nil" do
|
1161
|
+
|
1162
|
+
let(:selection) do
|
1163
|
+
query.send("#{method}", nil)
|
1164
|
+
end
|
1165
|
+
|
1166
|
+
it "returns the query" do
|
1167
|
+
expect(selection).to eq(query)
|
1168
|
+
end
|
1169
|
+
|
1170
|
+
it_behaves_like "a cloning option"
|
1171
|
+
end
|
1172
|
+
end
|
1173
|
+
|
1174
|
+
context "when using the mongo-1.x driver syntax" do
|
1175
|
+
|
1176
|
+
let(:query) do
|
1177
|
+
Mongoid::Query.new({}, {}, :mongo1x)
|
1178
|
+
end
|
1179
|
+
|
1180
|
+
context "when provided a hash" do
|
1181
|
+
|
1182
|
+
context "when the hash has integer values" do
|
1183
|
+
|
1184
|
+
let(:selection) do
|
1185
|
+
query.send("#{method}", field_one: 1, field_two: -1)
|
1186
|
+
end
|
1187
|
+
|
1188
|
+
it "adds the sorting criteria" do
|
1189
|
+
expect(selection.options).to eq(
|
1190
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1191
|
+
)
|
1192
|
+
end
|
1193
|
+
|
1194
|
+
it_behaves_like "a cloning option"
|
1195
|
+
end
|
1196
|
+
|
1197
|
+
context "when the hash has symbol values" do
|
1198
|
+
|
1199
|
+
let(:selection) do
|
1200
|
+
query.send("#{method}", field_one: :asc, field_two: :desc)
|
1201
|
+
end
|
1202
|
+
|
1203
|
+
it "adds the sorting criteria" do
|
1204
|
+
expect(selection.options).to eq(
|
1205
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1206
|
+
)
|
1207
|
+
end
|
1208
|
+
|
1209
|
+
it_behaves_like "a cloning option"
|
1210
|
+
end
|
1211
|
+
|
1212
|
+
context "when the hash has string values" do
|
1213
|
+
|
1214
|
+
let(:selection) do
|
1215
|
+
query.send("#{method}", field_one: "asc", field_two: "desc")
|
1216
|
+
end
|
1217
|
+
|
1218
|
+
it "adds the sorting criteria" do
|
1219
|
+
expect(selection.options).to eq(
|
1220
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1221
|
+
)
|
1222
|
+
end
|
1223
|
+
|
1224
|
+
it_behaves_like "a cloning option"
|
1225
|
+
end
|
1226
|
+
end
|
1227
|
+
|
1228
|
+
context "when provided an array" do
|
1229
|
+
|
1230
|
+
context "when the array is multi-dimensional" do
|
1231
|
+
|
1232
|
+
context "when the arrays have integer values" do
|
1233
|
+
|
1234
|
+
let(:selection) do
|
1235
|
+
query.send("#{method}", [[ :field_one, 1 ],[ :field_two, -1 ]])
|
1236
|
+
end
|
1237
|
+
|
1238
|
+
it "adds the sorting criteria" do
|
1239
|
+
expect(selection.options).to eq(
|
1240
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1241
|
+
)
|
1242
|
+
end
|
1243
|
+
|
1244
|
+
it_behaves_like "a cloning option"
|
1245
|
+
end
|
1246
|
+
|
1247
|
+
context "when the arrays have symbol values" do
|
1248
|
+
|
1249
|
+
let(:selection) do
|
1250
|
+
query.send("#{method}", [[ :field_one, :asc ],[ :field_two, :desc ]])
|
1251
|
+
end
|
1252
|
+
|
1253
|
+
it "adds the sorting criteria" do
|
1254
|
+
expect(selection.options).to eq(
|
1255
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1256
|
+
)
|
1257
|
+
end
|
1258
|
+
|
1259
|
+
it_behaves_like "a cloning option"
|
1260
|
+
end
|
1261
|
+
|
1262
|
+
context "when the arrays have string values" do
|
1263
|
+
|
1264
|
+
let(:selection) do
|
1265
|
+
query.send("#{method}", [[ :field_one, "asc" ],[ :field_two, "desc" ]])
|
1266
|
+
end
|
1267
|
+
|
1268
|
+
it "adds the sorting criteria" do
|
1269
|
+
expect(selection.options).to eq(
|
1270
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1271
|
+
)
|
1272
|
+
end
|
1273
|
+
|
1274
|
+
it_behaves_like "a cloning option"
|
1275
|
+
end
|
1276
|
+
end
|
1277
|
+
|
1278
|
+
context "when the array is selectable keys" do
|
1279
|
+
|
1280
|
+
let(:selection) do
|
1281
|
+
query.send("#{method}", [ :field_one.asc, :field_two.desc ])
|
1282
|
+
end
|
1283
|
+
|
1284
|
+
it "adds the sorting criteria" do
|
1285
|
+
expect(selection.options).to eq(
|
1286
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1287
|
+
)
|
1288
|
+
end
|
1289
|
+
|
1290
|
+
it_behaves_like "a cloning option"
|
1291
|
+
end
|
1292
|
+
end
|
1293
|
+
|
1294
|
+
context "when provided values" do
|
1295
|
+
|
1296
|
+
context "when the values are arrays" do
|
1297
|
+
|
1298
|
+
context "when the values have integer directions" do
|
1299
|
+
|
1300
|
+
let(:selection) do
|
1301
|
+
query.send("#{method}", [ :field_one, 1 ],[ :field_two, -1 ])
|
1302
|
+
end
|
1303
|
+
|
1304
|
+
it "adds the sorting criteria" do
|
1305
|
+
expect(selection.options).to eq(
|
1306
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1307
|
+
)
|
1308
|
+
end
|
1309
|
+
|
1310
|
+
it_behaves_like "a cloning option"
|
1311
|
+
end
|
1312
|
+
|
1313
|
+
context "when the values have symbol directions" do
|
1314
|
+
|
1315
|
+
let(:selection) do
|
1316
|
+
query.send("#{method}", [ :field_one, :asc ],[ :field_two, :desc ])
|
1317
|
+
end
|
1318
|
+
|
1319
|
+
it "adds the sorting criteria" do
|
1320
|
+
expect(selection.options).to eq(
|
1321
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1322
|
+
)
|
1323
|
+
end
|
1324
|
+
|
1325
|
+
it_behaves_like "a cloning option"
|
1326
|
+
end
|
1327
|
+
|
1328
|
+
context "when the values have string directions" do
|
1329
|
+
|
1330
|
+
let(:selection) do
|
1331
|
+
query.send("#{method}", [ :field_one, "asc" ],[ :field_two, "desc" ])
|
1332
|
+
end
|
1333
|
+
|
1334
|
+
it "adds the sorting criteria" do
|
1335
|
+
expect(selection.options).to eq(
|
1336
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1337
|
+
)
|
1338
|
+
end
|
1339
|
+
|
1340
|
+
it_behaves_like "a cloning option"
|
1341
|
+
end
|
1342
|
+
end
|
1343
|
+
|
1344
|
+
context "when the values are selectable keys" do
|
1345
|
+
|
1346
|
+
let(:selection) do
|
1347
|
+
query.send("#{method}", :field_one.asc, :field_two.desc)
|
1348
|
+
end
|
1349
|
+
|
1350
|
+
it "adds the sorting criteria" do
|
1351
|
+
expect(selection.options).to eq(
|
1352
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1353
|
+
)
|
1354
|
+
end
|
1355
|
+
|
1356
|
+
it_behaves_like "a cloning option"
|
1357
|
+
end
|
1358
|
+
end
|
1359
|
+
|
1360
|
+
context "when provided a string" do
|
1361
|
+
|
1362
|
+
context "when the direction is lowercase" do
|
1363
|
+
|
1364
|
+
context "when abbreviated" do
|
1365
|
+
|
1366
|
+
let(:selection) do
|
1367
|
+
query.send("#{method}", "field_one asc, field_two desc")
|
1368
|
+
end
|
1369
|
+
|
1370
|
+
it "adds the sorting criteria" do
|
1371
|
+
expect(selection.options).to eq(
|
1372
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1373
|
+
)
|
1374
|
+
end
|
1375
|
+
|
1376
|
+
it_behaves_like "a cloning option"
|
1377
|
+
end
|
1378
|
+
|
1379
|
+
context "when spelled out" do
|
1380
|
+
|
1381
|
+
let(:selection) do
|
1382
|
+
query.send("#{method}", "field_one ascending, field_two descending")
|
1383
|
+
end
|
1384
|
+
|
1385
|
+
it "adds the sorting criteria" do
|
1386
|
+
expect(selection.options).to eq(
|
1387
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1388
|
+
)
|
1389
|
+
end
|
1390
|
+
|
1391
|
+
it_behaves_like "a cloning option"
|
1392
|
+
end
|
1393
|
+
end
|
1394
|
+
|
1395
|
+
context "when the direction is uppercase" do
|
1396
|
+
|
1397
|
+
context "when abbreviated" do
|
1398
|
+
|
1399
|
+
let(:selection) do
|
1400
|
+
query.send("#{method}", "field_one ASC, field_two DESC")
|
1401
|
+
end
|
1402
|
+
|
1403
|
+
it "adds the sorting criteria" do
|
1404
|
+
expect(selection.options).to eq(
|
1405
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1406
|
+
)
|
1407
|
+
end
|
1408
|
+
|
1409
|
+
it_behaves_like "a cloning option"
|
1410
|
+
end
|
1411
|
+
|
1412
|
+
context "when spelled out" do
|
1413
|
+
|
1414
|
+
let(:selection) do
|
1415
|
+
query.send("#{method}", "field_one ASCENDING, field_two DESCENDING")
|
1416
|
+
end
|
1417
|
+
|
1418
|
+
it "adds the sorting criteria" do
|
1419
|
+
expect(selection.options).to eq(
|
1420
|
+
{ sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
|
1421
|
+
)
|
1422
|
+
end
|
1423
|
+
|
1424
|
+
it_behaves_like "a cloning option"
|
1425
|
+
end
|
1426
|
+
end
|
1427
|
+
end
|
1428
|
+
|
1429
|
+
context "when provided no options" do
|
1430
|
+
|
1431
|
+
let(:selection) do
|
1432
|
+
query.order_by
|
1433
|
+
end
|
1434
|
+
|
1435
|
+
it "returns the query" do
|
1436
|
+
expect(selection).to eq(query)
|
1437
|
+
end
|
1438
|
+
|
1439
|
+
it_behaves_like "a cloning option"
|
1440
|
+
end
|
1441
|
+
|
1442
|
+
context "when provided nil" do
|
1443
|
+
|
1444
|
+
let(:selection) do
|
1445
|
+
query.send("#{method}", nil)
|
1446
|
+
end
|
1447
|
+
|
1448
|
+
it "returns the query" do
|
1449
|
+
expect(selection).to eq(query)
|
1450
|
+
end
|
1451
|
+
|
1452
|
+
it_behaves_like "a cloning option"
|
1453
|
+
end
|
1454
|
+
end
|
1455
|
+
end
|
1456
|
+
end
|
1457
|
+
|
1458
|
+
describe "#reoder" do
|
1459
|
+
|
1460
|
+
let(:selection) do
|
1461
|
+
query.order_by(field_one: 1, field_two: -1)
|
1462
|
+
end
|
1463
|
+
|
1464
|
+
let!(:reordered) do
|
1465
|
+
selection.reorder(field_three: 1)
|
1466
|
+
end
|
1467
|
+
|
1468
|
+
it "replaces all order options with the new options" do
|
1469
|
+
expect(reordered.options).to eq(sort: { "field_three" => 1 })
|
1470
|
+
end
|
1471
|
+
|
1472
|
+
it 'does not alter the original criteria object' do
|
1473
|
+
expect(selection.options[:sort]).to eq({ 'field_one' => 1, 'field_two' => -1 })
|
1474
|
+
end
|
1475
|
+
end
|
1476
|
+
|
1477
|
+
[ :skip, :offset ].each do |method|
|
1478
|
+
|
1479
|
+
describe "\##{method}" do
|
1480
|
+
|
1481
|
+
context "when provided no options" do
|
1482
|
+
|
1483
|
+
let(:selection) do
|
1484
|
+
query.send(method)
|
1485
|
+
end
|
1486
|
+
|
1487
|
+
it "does not add any options" do
|
1488
|
+
expect(selection.options).to eq({})
|
1489
|
+
end
|
1490
|
+
|
1491
|
+
it "returns the query" do
|
1492
|
+
expect(selection).to eq(query)
|
1493
|
+
end
|
1494
|
+
|
1495
|
+
it_behaves_like "a cloning option"
|
1496
|
+
end
|
1497
|
+
|
1498
|
+
context "when provided nil" do
|
1499
|
+
|
1500
|
+
let(:selection) do
|
1501
|
+
query.send(method, nil)
|
1502
|
+
end
|
1503
|
+
|
1504
|
+
it "does not add any options" do
|
1505
|
+
expect(selection.options).to eq({})
|
1506
|
+
end
|
1507
|
+
|
1508
|
+
it "returns the query" do
|
1509
|
+
expect(selection).to eq(query)
|
1510
|
+
end
|
1511
|
+
|
1512
|
+
it_behaves_like "a cloning option"
|
1513
|
+
end
|
1514
|
+
|
1515
|
+
context "when the query is aggregating" do
|
1516
|
+
|
1517
|
+
let(:selection) do
|
1518
|
+
query.project(name: 1).skip(10)
|
1519
|
+
end
|
1520
|
+
|
1521
|
+
it "adds the field options" do
|
1522
|
+
expect(selection.options).to eq({ skip: 10 })
|
1523
|
+
end
|
1524
|
+
|
1525
|
+
it "adds the skip to the aggregation" do
|
1526
|
+
expect(selection.pipeline).to include({ "$skip" => 10 })
|
1527
|
+
end
|
1528
|
+
|
1529
|
+
it_behaves_like "a cloning option"
|
1530
|
+
end
|
1531
|
+
|
1532
|
+
context "when provided arguments" do
|
1533
|
+
|
1534
|
+
context "when provided an integer" do
|
1535
|
+
|
1536
|
+
let(:selection) do
|
1537
|
+
query.send(method, 10)
|
1538
|
+
end
|
1539
|
+
|
1540
|
+
it "adds the field options" do
|
1541
|
+
expect(selection.options).to eq({ skip: 10 })
|
1542
|
+
end
|
1543
|
+
|
1544
|
+
it_behaves_like "a cloning option"
|
1545
|
+
end
|
1546
|
+
|
1547
|
+
context "when provided a float" do
|
1548
|
+
|
1549
|
+
let(:selection) do
|
1550
|
+
query.send(method, 10.25)
|
1551
|
+
end
|
1552
|
+
|
1553
|
+
it "adds the field options converted to an integer" do
|
1554
|
+
expect(selection.options).to eq({ skip: 10 })
|
1555
|
+
end
|
1556
|
+
|
1557
|
+
it_behaves_like "a cloning option"
|
1558
|
+
end
|
1559
|
+
|
1560
|
+
context "when provided a non number" do
|
1561
|
+
|
1562
|
+
let(:selection) do
|
1563
|
+
query.send(method, "10")
|
1564
|
+
end
|
1565
|
+
|
1566
|
+
it "adds the field options converted to an integer" do
|
1567
|
+
expect(selection.options).to eq({ skip: 10 })
|
1568
|
+
end
|
1569
|
+
|
1570
|
+
it_behaves_like "a cloning option"
|
1571
|
+
end
|
1572
|
+
end
|
1573
|
+
end
|
1574
|
+
end
|
1575
|
+
|
1576
|
+
describe "#slice" do
|
1577
|
+
|
1578
|
+
context "when provided no options" do
|
1579
|
+
|
1580
|
+
let(:selection) do
|
1581
|
+
query.slice
|
1582
|
+
end
|
1583
|
+
|
1584
|
+
it "does not add any options" do
|
1585
|
+
expect(selection.options).to eq({})
|
1586
|
+
end
|
1587
|
+
|
1588
|
+
it "returns the query" do
|
1589
|
+
expect(selection).to eq(query)
|
1590
|
+
end
|
1591
|
+
|
1592
|
+
it_behaves_like "a cloning option"
|
1593
|
+
end
|
1594
|
+
|
1595
|
+
context "when provided nil" do
|
1596
|
+
|
1597
|
+
let(:selection) do
|
1598
|
+
query.slice(nil)
|
1599
|
+
end
|
1600
|
+
|
1601
|
+
it "does not add any options" do
|
1602
|
+
expect(selection.options).to eq({})
|
1603
|
+
end
|
1604
|
+
|
1605
|
+
it "returns the query" do
|
1606
|
+
expect(selection).to eq(query)
|
1607
|
+
end
|
1608
|
+
|
1609
|
+
it_behaves_like "a cloning option"
|
1610
|
+
end
|
1611
|
+
|
1612
|
+
context "when provided a single argument" do
|
1613
|
+
|
1614
|
+
let(:selection) do
|
1615
|
+
query.slice(:first => 5)
|
1616
|
+
end
|
1617
|
+
|
1618
|
+
it "adds the field options" do
|
1619
|
+
expect(selection.options).to eq(
|
1620
|
+
{ fields: { "first" => { "$slice" => 5 }}}
|
1621
|
+
)
|
1622
|
+
end
|
1623
|
+
|
1624
|
+
it_behaves_like "a cloning option"
|
1625
|
+
end
|
1626
|
+
|
1627
|
+
context "when provided a multiple arguments" do
|
1628
|
+
|
1629
|
+
let(:selection) do
|
1630
|
+
query.slice(:first => 5, :second => [ 0, 3 ])
|
1631
|
+
end
|
1632
|
+
|
1633
|
+
it "adds the field options" do
|
1634
|
+
expect(selection.options).to eq({ fields:
|
1635
|
+
{ "first" => { "$slice" => 5 }, "second" => { "$slice" => [ 0, 3 ] }}
|
1636
|
+
})
|
1637
|
+
end
|
1638
|
+
|
1639
|
+
it_behaves_like "a cloning option"
|
1640
|
+
end
|
1641
|
+
|
1642
|
+
context "when existing field arguments exist" do
|
1643
|
+
|
1644
|
+
let(:limited) do
|
1645
|
+
query.only(:name)
|
1646
|
+
end
|
1647
|
+
|
1648
|
+
let(:selection) do
|
1649
|
+
limited.slice(:first => 5, :second => [ 0, 3 ])
|
1650
|
+
end
|
1651
|
+
|
1652
|
+
it "adds the field options" do
|
1653
|
+
expect(selection.options).to eq({
|
1654
|
+
fields: {
|
1655
|
+
"name" => 1,
|
1656
|
+
"first" => { "$slice" => 5 },
|
1657
|
+
"second" => { "$slice" => [ 0, 3 ] }
|
1658
|
+
}
|
1659
|
+
})
|
1660
|
+
end
|
1661
|
+
|
1662
|
+
it_behaves_like "a cloning option"
|
1663
|
+
end
|
1664
|
+
end
|
1665
|
+
|
1666
|
+
describe "#snapshot" do
|
1667
|
+
|
1668
|
+
let(:selection) do
|
1669
|
+
query.snapshot
|
1670
|
+
end
|
1671
|
+
|
1672
|
+
it "adds the snapshot option" do
|
1673
|
+
expect(selection.options).to eq({ snapshot: true })
|
1674
|
+
end
|
1675
|
+
|
1676
|
+
it_behaves_like "a cloning option"
|
1677
|
+
end
|
1678
|
+
|
1679
|
+
describe "#comment" do
|
1680
|
+
|
1681
|
+
let(:selection) do
|
1682
|
+
query.comment('slow query')
|
1683
|
+
end
|
1684
|
+
|
1685
|
+
it "adds the comment option" do
|
1686
|
+
expect(selection.options).to eq({ comment: 'slow query' })
|
1687
|
+
end
|
1688
|
+
|
1689
|
+
it_behaves_like "a cloning option"
|
1690
|
+
end
|
1691
|
+
|
1692
|
+
describe "#cursor_type" do
|
1693
|
+
|
1694
|
+
let(:selection) do
|
1695
|
+
query.cursor_type(:tailable)
|
1696
|
+
end
|
1697
|
+
|
1698
|
+
it "adds the cursor type option" do
|
1699
|
+
expect(selection.options).to eq({ cursor_type: :tailable })
|
1700
|
+
end
|
1701
|
+
|
1702
|
+
it_behaves_like "a cloning option"
|
1703
|
+
end
|
1704
|
+
|
1705
|
+
describe "#without" do
|
1706
|
+
|
1707
|
+
context "when provided no options" do
|
1708
|
+
|
1709
|
+
let(:selection) do
|
1710
|
+
query.without
|
1711
|
+
end
|
1712
|
+
|
1713
|
+
it "does not add any options" do
|
1714
|
+
expect(selection.options).to eq({})
|
1715
|
+
end
|
1716
|
+
|
1717
|
+
it "returns the query" do
|
1718
|
+
expect(selection).to eq(query)
|
1719
|
+
end
|
1720
|
+
|
1721
|
+
it_behaves_like "a cloning option"
|
1722
|
+
end
|
1723
|
+
|
1724
|
+
context "when provided nil" do
|
1725
|
+
|
1726
|
+
let(:selection) do
|
1727
|
+
query.without(nil)
|
1728
|
+
end
|
1729
|
+
|
1730
|
+
it "does not add any options" do
|
1731
|
+
expect(selection.options).to eq({})
|
1732
|
+
end
|
1733
|
+
|
1734
|
+
it "returns the query" do
|
1735
|
+
expect(selection).to eq(query)
|
1736
|
+
end
|
1737
|
+
|
1738
|
+
it_behaves_like "a cloning option"
|
1739
|
+
end
|
1740
|
+
|
1741
|
+
context "when provided fields" do
|
1742
|
+
|
1743
|
+
context "as sevaral arguments" do
|
1744
|
+
|
1745
|
+
let(:selection) do
|
1746
|
+
query.without(:first, :second)
|
1747
|
+
end
|
1748
|
+
|
1749
|
+
it "adds the field options" do
|
1750
|
+
expect(selection.options).to eq(
|
1751
|
+
{ fields: { "first" => 0, "second" => 0 }}
|
1752
|
+
)
|
1753
|
+
end
|
1754
|
+
|
1755
|
+
it_behaves_like "a cloning option"
|
1756
|
+
end
|
1757
|
+
|
1758
|
+
context "as one argument - array" do
|
1759
|
+
|
1760
|
+
let(:selection) do
|
1761
|
+
query.without([:first, :second])
|
1762
|
+
end
|
1763
|
+
|
1764
|
+
it "adds the field options" do
|
1765
|
+
expect(selection.options).to eq(
|
1766
|
+
{ fields: { "first" => 0, "second" => 0 }}
|
1767
|
+
)
|
1768
|
+
end
|
1769
|
+
|
1770
|
+
it_behaves_like "a cloning option"
|
1771
|
+
end
|
1772
|
+
end
|
1773
|
+
|
1774
|
+
context "when #only was called before" do
|
1775
|
+
let(:selection) do
|
1776
|
+
query.only(:first).without(:id)
|
1777
|
+
end
|
1778
|
+
|
1779
|
+
it "adds both fields to options" do
|
1780
|
+
expect(selection.options).to eq(
|
1781
|
+
{ fields: { "first" => 1, "id" => 0 } }
|
1782
|
+
)
|
1783
|
+
end
|
1784
|
+
end
|
1785
|
+
end
|
1786
|
+
end
|