mongoid 7.4.0 → 8.0.1
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +3 -3
- data/lib/config/locales/en.yml +51 -28
- data/lib/mongoid/association/accessors.rb +32 -3
- data/lib/mongoid/association/bindable.rb +48 -0
- data/lib/mongoid/association/builders.rb +4 -2
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +48 -8
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
- data/lib/mongoid/association/macros.rb +22 -1
- data/lib/mongoid/association/many.rb +5 -0
- data/lib/mongoid/association/nested/many.rb +2 -1
- data/lib/mongoid/association/proxy.rb +12 -0
- data/lib/mongoid/association/referenced/auto_save.rb +3 -2
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
- data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -14
- data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
- data/lib/mongoid/association/referenced/syncable.rb +2 -2
- data/lib/mongoid/association/relatable.rb +38 -4
- data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
- data/lib/mongoid/attributes/processing.rb +9 -2
- data/lib/mongoid/attributes.rb +30 -27
- data/lib/mongoid/changeable.rb +37 -2
- data/lib/mongoid/clients/options.rb +4 -0
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/config/environment.rb +20 -4
- data/lib/mongoid/config.rb +25 -10
- data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +176 -17
- data/lib/mongoid/contextual/mongo.rb +226 -206
- data/lib/mongoid/contextual/none.rb +66 -4
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/includable.rb +24 -20
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -13
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
- data/lib/mongoid/criteria/queryable/optional.rb +3 -9
- data/lib/mongoid/criteria/queryable/options.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +28 -34
- data/lib/mongoid/criteria/queryable/selector.rb +89 -4
- data/lib/mongoid/criteria/queryable/smash.rb +39 -6
- data/lib/mongoid/criteria/queryable.rb +11 -6
- data/lib/mongoid/criteria.rb +1 -26
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +96 -32
- data/lib/mongoid/errors/document_not_found.rb +29 -8
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +5 -1
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors.rb +2 -2
- data/lib/mongoid/extensions/array.rb +8 -6
- data/lib/mongoid/extensions/big_decimal.rb +29 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/float.rb +4 -5
- data/lib/mongoid/extensions/hash.rb +12 -5
- data/lib/mongoid/extensions/integer.rb +4 -5
- data/lib/mongoid/extensions/object.rb +2 -0
- data/lib/mongoid/extensions/range.rb +41 -10
- data/lib/mongoid/extensions/regexp.rb +11 -4
- data/lib/mongoid/extensions/set.rb +11 -4
- data/lib/mongoid/extensions/string.rb +2 -13
- data/lib/mongoid/extensions/symbol.rb +3 -14
- data/lib/mongoid/extensions/time.rb +27 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +42 -7
- data/lib/mongoid/fields/foreign_key.rb +7 -0
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +194 -28
- data/lib/mongoid/findable.rb +27 -7
- data/lib/mongoid/indexable/specification.rb +1 -1
- data/lib/mongoid/indexable/validators/options.rb +4 -1
- data/lib/mongoid/interceptable.rb +69 -9
- data/lib/mongoid/persistable/creatable.rb +14 -5
- data/lib/mongoid/persistable/updatable.rb +12 -5
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/persistence_context.rb +19 -2
- data/lib/mongoid/query_cache.rb +6 -258
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/reloadable.rb +7 -3
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/stateful.rb +27 -1
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +1 -1
- data/lib/mongoid/touchable.rb +2 -3
- data/lib/mongoid/traversable.rb +5 -1
- data/lib/mongoid/validatable/uniqueness.rb +2 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +28 -0
- data/lib/mongoid.rb +2 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +11 -5
- data/spec/config/mongoid.yml +16 -0
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/app_spec.rb +28 -26
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_dirty_spec.rb +28 -0
- data/spec/integration/associations/embedded_spec.rb +15 -0
- data/spec/integration/associations/embeds_many_spec.rb +15 -2
- data/spec/integration/associations/embeds_one_spec.rb +18 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
- data/spec/integration/associations/has_one_spec.rb +97 -1
- data/spec/integration/associations/scope_option_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +95 -1
- data/spec/integration/callbacks_spec.rb +226 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +115 -76
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/lite_spec_helper.rb +1 -1
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +219 -8
- data/spec/mongoid/association/embedded/embeds_many_models.rb +157 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +67 -4
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +82 -13
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +14 -0
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/atomic_spec.rb +22 -0
- data/spec/mongoid/attributes/nested_spec.rb +80 -11
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes_spec.rb +524 -27
- data/spec/mongoid/changeable_spec.rb +130 -13
- data/spec/mongoid/clients/factory_spec.rb +34 -42
- data/spec/mongoid/clients/options_spec.rb +1 -0
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +32 -2
- data/spec/mongoid/config/environment_spec.rb +39 -1
- data/spec/mongoid/config_spec.rb +104 -13
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
- data/spec/mongoid/contextual/memory_spec.rb +1337 -69
- data/spec/mongoid/contextual/mongo_spec.rb +1105 -172
- data/spec/mongoid/contextual/none_spec.rb +38 -0
- data/spec/mongoid/copyable_spec.rb +451 -1
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
- data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
- data/spec/mongoid/criteria_spec.rb +474 -1198
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +48 -76
- data/spec/mongoid/extensions/hash_spec.rb +30 -0
- data/spec/mongoid/extensions/integer_spec.rb +45 -66
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +634 -66
- data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields_spec.rb +321 -50
- data/spec/mongoid/findable_spec.rb +80 -15
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +16 -19
- data/spec/mongoid/interceptable_spec.rb +584 -5
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +2 -2
- data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
- data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
- data/spec/mongoid/persistence_context_spec.rb +50 -1
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +0 -154
- data/spec/mongoid/reloadable_spec.rb +35 -2
- data/spec/mongoid/scopable_spec.rb +21 -1
- data/spec/mongoid/shardable_spec.rb +14 -0
- data/spec/mongoid/stateful_spec.rb +28 -0
- data/spec/mongoid/timestamps_spec.rb +390 -0
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +116 -0
- data/spec/mongoid/touchable_spec_models.rb +12 -8
- data/spec/mongoid/traversable_spec.rb +4 -11
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/constraints.rb +8 -16
- data/spec/shared/lib/mrss/docker_runner.rb +23 -3
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +32 -1
- data/spec/shared/share/Dockerfile.erb +34 -48
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/server.sh +32 -19
- data/spec/shared/shlib/set_env.sh +37 -0
- data/spec/support/constraints.rb +24 -0
- data/spec/support/macros.rb +39 -0
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +3 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/code.rb +2 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -0
- data/spec/support/models/membership.rb +1 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +1 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/registry.rb +1 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/support/models/weapon.rb +12 -0
- data/spec/support/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_local.json +18 -0
- data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/spec_config.rb +4 -0
- data.tar.gz.sig +0 -0
- metadata +76 -13
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -4,11 +4,11 @@ require "spec_helper"
|
|
4
4
|
|
5
5
|
describe Mongoid::Contextual::Aggregable::Memory do
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
7
|
+
let(:context) do
|
8
|
+
Mongoid::Contextual::Memory.new(criteria)
|
9
|
+
end
|
11
10
|
|
11
|
+
describe "#aggregates" do
|
12
12
|
subject { context.aggregates(:likes) }
|
13
13
|
|
14
14
|
context 'when no documents found' do
|
@@ -46,289 +46,527 @@ describe Mongoid::Contextual::Aggregable::Memory do
|
|
46
46
|
|
47
47
|
describe "#avg" do
|
48
48
|
|
49
|
-
context "when
|
49
|
+
context "when the types are Integers" do
|
50
50
|
|
51
|
-
|
51
|
+
let!(:depeche) do
|
52
|
+
Band.create!(name: "Depeche Mode", likes: 1000)
|
53
|
+
end
|
52
54
|
|
53
|
-
|
55
|
+
let!(:tool) do
|
56
|
+
Band.create!(name: "Tool", likes: 500)
|
57
|
+
end
|
54
58
|
|
55
|
-
|
56
|
-
|
57
|
-
|
59
|
+
let(:criteria) do
|
60
|
+
Band.all.tap do |criteria|
|
61
|
+
criteria.documents = [ depeche, tool ]
|
62
|
+
end
|
63
|
+
end
|
58
64
|
|
59
|
-
|
60
|
-
|
61
|
-
|
65
|
+
let(:avg) do
|
66
|
+
context.avg(:likes)
|
67
|
+
end
|
62
68
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
end
|
67
|
-
end
|
69
|
+
it "returns the avg of the provided field" do
|
70
|
+
expect(avg).to eq(750)
|
71
|
+
end
|
68
72
|
|
69
|
-
|
70
|
-
|
71
|
-
|
73
|
+
it 'returns a float' do
|
74
|
+
avg.should be_a(Float)
|
75
|
+
end
|
72
76
|
|
73
|
-
|
74
|
-
context.avg(:likes)
|
75
|
-
end
|
77
|
+
context 'when integers are negative' do
|
76
78
|
|
77
|
-
|
78
|
-
|
79
|
-
end
|
79
|
+
let!(:depeche) do
|
80
|
+
Band.create!(name: "Depeche Mode", likes: -1000)
|
80
81
|
end
|
81
82
|
|
82
|
-
|
83
|
+
it "returns the avg of the provided field" do
|
84
|
+
expect(avg).to eq(-250)
|
85
|
+
end
|
83
86
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
+
it 'returns a float' do
|
88
|
+
avg.should be_a(Float)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
87
92
|
|
88
|
-
|
89
|
-
Band.create!(name: "Tool", rating: 5)
|
90
|
-
end
|
93
|
+
context "when the types are Floats" do
|
91
94
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
let(:context) do
|
99
|
-
Mongoid::Contextual::Memory.new(criteria)
|
100
|
-
end
|
95
|
+
let!(:depeche) do
|
96
|
+
Band.create!(name: "Depeche Mode", rating: 10)
|
97
|
+
end
|
101
98
|
|
102
|
-
|
103
|
-
|
104
|
-
|
99
|
+
let!(:tool) do
|
100
|
+
Band.create!(name: "Tool", rating: 5)
|
101
|
+
end
|
105
102
|
|
106
|
-
|
107
|
-
|
108
|
-
|
103
|
+
let(:criteria) do
|
104
|
+
Band.all.tap do |criteria|
|
105
|
+
criteria.documents = [ depeche, tool ]
|
109
106
|
end
|
110
107
|
end
|
111
108
|
|
112
|
-
|
109
|
+
let(:avg) do
|
110
|
+
context.avg(:rating)
|
111
|
+
end
|
113
112
|
|
114
|
-
|
115
|
-
|
116
|
-
|
113
|
+
it "returns the avg of the provided field" do
|
114
|
+
expect(avg).to eq(7.5)
|
115
|
+
end
|
116
|
+
end
|
117
117
|
|
118
|
-
|
119
|
-
Band.where(name: "New Order")
|
120
|
-
end
|
118
|
+
context "when no documents match" do
|
121
119
|
|
122
|
-
|
123
|
-
|
124
|
-
|
120
|
+
let!(:depeche) do
|
121
|
+
Band.create!(name: "Depeche Mode", likes: 1000)
|
122
|
+
end
|
123
|
+
|
124
|
+
let(:criteria) do
|
125
|
+
Band.where(name: "New Order")
|
126
|
+
end
|
127
|
+
|
128
|
+
let(:avg) do
|
129
|
+
context.avg(:likes)
|
130
|
+
end
|
131
|
+
|
132
|
+
it "returns nil" do
|
133
|
+
expect(avg).to be_nil
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
context "when there are a mix of types" do
|
125
138
|
|
126
|
-
|
127
|
-
|
139
|
+
let!(:bands) do
|
140
|
+
[ Band.create!(name: "The Flaming Lips", mojo: 7.7),
|
141
|
+
Band.create!(name: "Spirit of the Beehive", mojo: 10),
|
142
|
+
Band.create!(name: "Justin Bieber", mojo: nil) ]
|
143
|
+
end
|
144
|
+
|
145
|
+
let(:criteria) do
|
146
|
+
Band.all.tap do |criteria|
|
147
|
+
criteria.documents = bands
|
128
148
|
end
|
149
|
+
end
|
129
150
|
|
130
|
-
|
131
|
-
|
151
|
+
let(:avg) do
|
152
|
+
context.avg(:mojo)
|
153
|
+
end
|
154
|
+
|
155
|
+
it "coerces types to calculate avg" do
|
156
|
+
expect(avg).to eq(8.85)
|
157
|
+
end
|
158
|
+
|
159
|
+
it "database only averages Numeric types" do
|
160
|
+
expect(Band.all.avg(:mojo)).to be_within(0.000001).of(8.85)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
context "when there no numeric values" do
|
165
|
+
|
166
|
+
let!(:bands) do
|
167
|
+
[ Band.create!(name: "Justin Bieber", mojo: nil) ]
|
168
|
+
end
|
169
|
+
|
170
|
+
let(:criteria) do
|
171
|
+
Band.all.tap do |criteria|
|
172
|
+
criteria.documents = bands
|
132
173
|
end
|
133
174
|
end
|
175
|
+
|
176
|
+
let(:avg) do
|
177
|
+
context.avg(:mojo)
|
178
|
+
end
|
179
|
+
|
180
|
+
it "returns avg as nil" do
|
181
|
+
expect(avg).to be_nil
|
182
|
+
end
|
183
|
+
|
184
|
+
it "database returns avg as nil" do
|
185
|
+
expect(Band.all.avg(:mojo)).to eq(nil)
|
186
|
+
end
|
134
187
|
end
|
135
188
|
end
|
136
189
|
|
137
190
|
describe "#max" do
|
138
191
|
|
139
|
-
|
192
|
+
let!(:depeche) do
|
193
|
+
Band.create!(name: "Depeche Mode", likes: 1000)
|
194
|
+
end
|
140
195
|
|
141
|
-
|
142
|
-
|
143
|
-
|
196
|
+
let!(:tool) do
|
197
|
+
Band.create!(name: "Tool", likes: 500)
|
198
|
+
end
|
144
199
|
|
145
|
-
|
146
|
-
|
200
|
+
let(:criteria) do
|
201
|
+
Band.all.tap do |crit|
|
202
|
+
crit.documents = [ depeche, tool ]
|
147
203
|
end
|
204
|
+
end
|
148
205
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
206
|
+
context "when provided a Symbol" do
|
207
|
+
|
208
|
+
let(:max) do
|
209
|
+
context.max(:likes)
|
153
210
|
end
|
154
211
|
|
155
|
-
|
156
|
-
|
212
|
+
it "returns the max of the provided field" do
|
213
|
+
expect(max).to eq(1000)
|
157
214
|
end
|
158
215
|
|
159
|
-
context "when
|
216
|
+
context "when no documents match" do
|
217
|
+
|
218
|
+
let(:criteria) do
|
219
|
+
Band.where(name: "New Order")
|
220
|
+
end
|
160
221
|
|
161
222
|
let(:max) do
|
162
223
|
context.max(:likes)
|
163
224
|
end
|
164
225
|
|
165
|
-
it "returns
|
166
|
-
expect(max).to
|
226
|
+
it "returns nil" do
|
227
|
+
expect(max).to be_nil
|
167
228
|
end
|
229
|
+
end
|
168
230
|
|
169
|
-
|
231
|
+
context "when there are a mix of types" do
|
170
232
|
|
171
|
-
|
172
|
-
|
173
|
-
|
233
|
+
let!(:bands) do
|
234
|
+
[ Band.create!(name: "The Flaming Lips", mojo: 7.7),
|
235
|
+
Band.create!(name: "Spirit of the Beehive", mojo: 10),
|
236
|
+
Band.create!(name: "Justin Bieber", mojo: nil) ]
|
237
|
+
end
|
174
238
|
|
175
|
-
|
176
|
-
|
239
|
+
let(:criteria) do
|
240
|
+
Band.all.tap do |criteria|
|
241
|
+
criteria.documents = bands
|
177
242
|
end
|
243
|
+
end
|
178
244
|
|
179
|
-
|
180
|
-
|
181
|
-
|
245
|
+
let(:max) do
|
246
|
+
context.max(:mojo)
|
247
|
+
end
|
182
248
|
|
183
|
-
|
184
|
-
|
185
|
-
|
249
|
+
it "coerces types to calculate max" do
|
250
|
+
expect(max).to eq 10
|
251
|
+
expect(max).to be_a Integer
|
186
252
|
end
|
187
253
|
end
|
188
254
|
|
189
|
-
context "when
|
255
|
+
context "when there no numeric values" do
|
190
256
|
|
191
|
-
let(:
|
192
|
-
|
193
|
-
|
257
|
+
let!(:bands) do
|
258
|
+
[ Band.create!(name: "Justin Bieber", mojo: nil) ]
|
259
|
+
end
|
260
|
+
|
261
|
+
let(:criteria) do
|
262
|
+
Band.all.tap do |criteria|
|
263
|
+
criteria.documents = bands
|
194
264
|
end
|
195
265
|
end
|
196
266
|
|
197
|
-
|
198
|
-
|
267
|
+
let(:max) do
|
268
|
+
context.avg(:mojo)
|
199
269
|
end
|
270
|
+
|
271
|
+
it "returns max as nil" do
|
272
|
+
expect(max).to be_nil
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
context "when provided a block" do
|
278
|
+
|
279
|
+
let(:max) do
|
280
|
+
context.max do |a, b|
|
281
|
+
a.likes <=> b.likes
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
it "returns the document with the max value for the field" do
|
286
|
+
expect(max).to eq(depeche)
|
200
287
|
end
|
201
288
|
end
|
202
289
|
end
|
203
290
|
|
204
291
|
describe "#min" do
|
205
292
|
|
206
|
-
|
293
|
+
let!(:depeche) do
|
294
|
+
Band.create!(name: "Depeche Mode", likes: 1000)
|
295
|
+
end
|
207
296
|
|
208
|
-
|
209
|
-
|
210
|
-
|
297
|
+
let!(:tool) do
|
298
|
+
Band.create!(name: "Tool", likes: 500)
|
299
|
+
end
|
211
300
|
|
212
|
-
|
213
|
-
|
301
|
+
let(:criteria) do
|
302
|
+
Band.all.tap do |crit|
|
303
|
+
crit.documents = [ depeche, tool ]
|
214
304
|
end
|
305
|
+
end
|
215
306
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
307
|
+
context "when provided a Symbol" do
|
308
|
+
|
309
|
+
let(:min) do
|
310
|
+
context.min(:likes)
|
220
311
|
end
|
221
312
|
|
222
|
-
|
223
|
-
|
313
|
+
it "returns the min of the provided field" do
|
314
|
+
expect(min).to eq(500)
|
224
315
|
end
|
225
316
|
|
226
|
-
context "when
|
317
|
+
context "when no documents match" do
|
318
|
+
|
319
|
+
let(:criteria) do
|
320
|
+
Band.where(name: "New Order")
|
321
|
+
end
|
227
322
|
|
228
323
|
let(:min) do
|
229
324
|
context.min(:likes)
|
230
325
|
end
|
231
326
|
|
232
|
-
it "returns
|
233
|
-
expect(min).to
|
327
|
+
it "returns nil" do
|
328
|
+
expect(min).to be_nil
|
234
329
|
end
|
330
|
+
end
|
235
331
|
|
236
|
-
|
332
|
+
context "when there are a mix of types" do
|
237
333
|
|
238
|
-
|
239
|
-
|
240
|
-
|
334
|
+
let!(:bands) do
|
335
|
+
[ Band.create!(name: "The Flaming Lips", mojo: 7.7),
|
336
|
+
Band.create!(name: "Spirit of the Beehive", mojo: 10),
|
337
|
+
Band.create!(name: "Justin Bieber", mojo: nil) ]
|
338
|
+
end
|
241
339
|
|
242
|
-
|
243
|
-
|
340
|
+
let(:criteria) do
|
341
|
+
Band.all.tap do |criteria|
|
342
|
+
criteria.documents = bands
|
244
343
|
end
|
344
|
+
end
|
245
345
|
|
246
|
-
|
247
|
-
|
248
|
-
|
346
|
+
let(:min) do
|
347
|
+
context.min(:mojo)
|
348
|
+
end
|
249
349
|
|
250
|
-
|
251
|
-
|
252
|
-
|
350
|
+
it "coerces types to calculate min" do
|
351
|
+
expect(min).to eq 7.7
|
352
|
+
expect(min).to be_a Float
|
253
353
|
end
|
254
354
|
end
|
255
355
|
|
256
|
-
context "when
|
356
|
+
context "when there no numeric values" do
|
257
357
|
|
258
|
-
let(:
|
259
|
-
|
260
|
-
|
358
|
+
let!(:bands) do
|
359
|
+
[ Band.create!(name: "Justin Bieber", mojo: nil) ]
|
360
|
+
end
|
361
|
+
|
362
|
+
let(:criteria) do
|
363
|
+
Band.all.tap do |criteria|
|
364
|
+
criteria.documents = bands
|
261
365
|
end
|
262
366
|
end
|
263
367
|
|
264
|
-
|
265
|
-
|
368
|
+
let(:min) do
|
369
|
+
context.min(:mojo)
|
370
|
+
end
|
371
|
+
|
372
|
+
it "returns min as nil" do
|
373
|
+
expect(min).to be_nil
|
374
|
+
end
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
context "when provided a block" do
|
379
|
+
|
380
|
+
let(:min) do
|
381
|
+
context.min do |a, b|
|
382
|
+
a.likes <=> b.likes
|
266
383
|
end
|
267
384
|
end
|
385
|
+
|
386
|
+
it "returns the document with the min value for the field" do
|
387
|
+
expect(min).to eq(tool)
|
388
|
+
end
|
268
389
|
end
|
269
390
|
end
|
270
391
|
|
271
392
|
describe "#sum" do
|
272
393
|
|
273
|
-
|
394
|
+
let!(:depeche) do
|
395
|
+
Band.create!(name: "Depeche Mode", likes: 1000)
|
396
|
+
end
|
397
|
+
|
398
|
+
let!(:tool) do
|
399
|
+
Band.create!(name: "Tool", likes: 500)
|
400
|
+
end
|
274
401
|
|
275
|
-
|
276
|
-
|
402
|
+
let(:criteria) do
|
403
|
+
Band.all.tap do |crit|
|
404
|
+
crit.documents = [ depeche, tool ]
|
277
405
|
end
|
406
|
+
end
|
278
407
|
|
279
|
-
|
280
|
-
|
408
|
+
context 'when values are integers' do
|
409
|
+
|
410
|
+
let(:sum) do
|
411
|
+
context.sum(:likes)
|
281
412
|
end
|
282
413
|
|
283
|
-
|
284
|
-
|
285
|
-
|
414
|
+
shared_examples 'sums and returns an integer' do
|
415
|
+
it 'sums' do
|
416
|
+
sum.should == 1500
|
417
|
+
end
|
418
|
+
|
419
|
+
it 'returns integer' do
|
420
|
+
sum.should be_a(Integer)
|
421
|
+
end
|
422
|
+
end
|
423
|
+
|
424
|
+
include_examples 'sums and returns an integer'
|
425
|
+
|
426
|
+
context 'when values are numeric strings' do
|
427
|
+
|
428
|
+
let!(:depeche) do
|
429
|
+
Band.create!(name: "Depeche Mode", likes: '1000')
|
286
430
|
end
|
431
|
+
|
432
|
+
include_examples 'sums and returns an integer'
|
433
|
+
end
|
434
|
+
|
435
|
+
context 'when values are negative integers' do
|
436
|
+
|
437
|
+
let!(:depeche) do
|
438
|
+
Band.create!(name: "Depeche Mode", likes: -1000)
|
439
|
+
end
|
440
|
+
|
441
|
+
shared_examples 'sums and returns an integer' do
|
442
|
+
it 'sums' do
|
443
|
+
sum.should == -500
|
444
|
+
end
|
445
|
+
|
446
|
+
it 'returns integer' do
|
447
|
+
sum.should be_a(Integer)
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
451
|
+
include_examples 'sums and returns an integer'
|
452
|
+
|
453
|
+
context 'when values are negative numeric strings' do
|
454
|
+
|
455
|
+
let!(:depeche) do
|
456
|
+
Band.create!(name: "Depeche Mode", likes: '-1000')
|
457
|
+
end
|
458
|
+
|
459
|
+
include_examples 'sums and returns an integer'
|
460
|
+
end
|
461
|
+
end
|
462
|
+
end
|
463
|
+
|
464
|
+
context 'when values are floats' do
|
465
|
+
|
466
|
+
let!(:depeche) do
|
467
|
+
Band.create!(name: "Depeche Mode", likes: 1000.0)
|
468
|
+
end
|
469
|
+
|
470
|
+
let(:sum) do
|
471
|
+
context.sum(:likes)
|
472
|
+
end
|
473
|
+
|
474
|
+
it 'sums' do
|
475
|
+
sum.should == 1500
|
476
|
+
end
|
477
|
+
|
478
|
+
it 'returns integer' do
|
479
|
+
sum.should be_a(Integer)
|
287
480
|
end
|
481
|
+
end
|
288
482
|
|
289
|
-
|
290
|
-
|
483
|
+
context "when provided a Symbol" do
|
484
|
+
|
485
|
+
let(:sum) do
|
486
|
+
context.sum(:likes)
|
291
487
|
end
|
292
488
|
|
293
|
-
|
489
|
+
it "returns the sum of the provided field" do
|
490
|
+
expect(sum).to eq(1500)
|
491
|
+
end
|
492
|
+
|
493
|
+
context "when no documents match" do
|
494
|
+
|
495
|
+
let(:criteria) do
|
496
|
+
Band.where(name: "New Order")
|
497
|
+
end
|
294
498
|
|
295
499
|
let(:sum) do
|
296
500
|
context.sum(:likes)
|
297
501
|
end
|
298
502
|
|
299
|
-
it "returns
|
300
|
-
expect(sum).to eq(
|
503
|
+
it "returns zero" do
|
504
|
+
expect(sum).to eq(0)
|
301
505
|
end
|
506
|
+
end
|
302
507
|
|
303
|
-
|
508
|
+
context "when there are a mix of types" do
|
304
509
|
|
305
|
-
|
306
|
-
|
307
|
-
|
510
|
+
let!(:bands) do
|
511
|
+
[ Band.create!(name: "The Flaming Lips", mojo: 7.7),
|
512
|
+
Band.create!(name: "Spirit of the Beehive", mojo: 10),
|
513
|
+
Band.create!(name: "Justin Bieber", mojo: nil) ]
|
514
|
+
end
|
308
515
|
|
309
|
-
|
310
|
-
|
516
|
+
let(:criteria) do
|
517
|
+
Band.all.tap do |criteria|
|
518
|
+
criteria.documents = bands
|
311
519
|
end
|
520
|
+
end
|
312
521
|
|
313
|
-
|
314
|
-
|
315
|
-
|
522
|
+
let(:sum) do
|
523
|
+
context.sum(:mojo)
|
524
|
+
end
|
316
525
|
|
317
|
-
|
318
|
-
|
319
|
-
|
526
|
+
it "coerces types to calculate sum" do
|
527
|
+
expect(sum).to eq 17.7
|
528
|
+
expect(sum).to be_a Float
|
529
|
+
end
|
530
|
+
|
531
|
+
it "database only sums Float and Integer types" do
|
532
|
+
expect(Band.all.sum(:mojo)).to be_within(Float::EPSILON).of(17.7)
|
320
533
|
end
|
321
534
|
end
|
322
535
|
|
323
|
-
context "when
|
536
|
+
context "when there no numeric values" do
|
537
|
+
|
538
|
+
let!(:bands) do
|
539
|
+
[ Band.create!(name: "Justin Bieber", mojo: nil) ]
|
540
|
+
end
|
541
|
+
|
542
|
+
let(:criteria) do
|
543
|
+
Band.all.tap do |criteria|
|
544
|
+
criteria.documents = bands
|
545
|
+
end
|
546
|
+
end
|
324
547
|
|
325
548
|
let(:sum) do
|
326
|
-
context.sum(
|
549
|
+
context.sum(:mojo)
|
327
550
|
end
|
328
551
|
|
329
|
-
it "returns
|
330
|
-
expect(sum).to eq
|
552
|
+
it "returns sum as zero" do
|
553
|
+
expect(sum).to eq 0
|
331
554
|
end
|
555
|
+
|
556
|
+
it "database returns sum as zero" do
|
557
|
+
expect(Band.all.sum(:mojo)).to eq(0)
|
558
|
+
end
|
559
|
+
end
|
560
|
+
end
|
561
|
+
|
562
|
+
context "when provided a block" do
|
563
|
+
|
564
|
+
let(:sum) do
|
565
|
+
context.sum(&:likes)
|
566
|
+
end
|
567
|
+
|
568
|
+
it "returns the sum for the provided block" do
|
569
|
+
expect(sum).to eq(1500)
|
332
570
|
end
|
333
571
|
end
|
334
572
|
end
|