mongoid 7.6.2 → 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 +2 -0
- data/README.md +3 -3
- data/Rakefile +21 -85
- data/lib/config/locales/en.yml +46 -56
- 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/depending.rb +4 -8
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +28 -5
- 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 +2 -1
- data/lib/mongoid/association/many.rb +5 -0
- data/lib/mongoid/association/nested/many.rb +5 -39
- data/lib/mongoid/association/nested/nested_buildable.rb +0 -14
- 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 -18
- data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -107
- 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/attributes/processing.rb +9 -2
- data/lib/mongoid/attributes.rb +30 -27
- data/lib/mongoid/cacheable.rb +2 -2
- data/lib/mongoid/changeable.rb +37 -2
- data/lib/mongoid/clients/factory.rb +0 -4
- data/lib/mongoid/clients/options.rb +4 -0
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/config.rb +15 -73
- data/lib/mongoid/contextual/aggregable/memory.rb +22 -20
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +63 -47
- data/lib/mongoid/contextual/mongo.rb +173 -287
- data/lib/mongoid/contextual/none.rb +33 -15
- 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 -15
- 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 -16
- 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 +0 -12
- 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 +2 -133
- data/lib/mongoid/criteria/queryable/selector.rb +90 -5
- data/lib/mongoid/criteria/queryable/smash.rb +39 -6
- data/lib/mongoid/criteria/queryable/storable.rb +1 -1
- data/lib/mongoid/criteria/queryable.rb +11 -6
- data/lib/mongoid/criteria.rb +1 -28
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +88 -33
- data/lib/mongoid/equality.rb +4 -4
- data/lib/mongoid/errors/document_not_found.rb +6 -2
- 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 -3
- 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 +13 -32
- 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 +49 -7
- data/lib/mongoid/findable.rb +21 -16
- 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/matchable.rb +1 -6
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +5 -3
- data/lib/mongoid/matcher/regex.rb +9 -8
- data/lib/mongoid/matcher.rb +0 -1
- data/lib/mongoid/persistable/creatable.rb +14 -5
- data/lib/mongoid/persistable/updatable.rb +12 -5
- data/lib/mongoid/persistence_context.rb +8 -42
- 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/scopable.rb +9 -11
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/shardable.rb +11 -35
- data/lib/mongoid/stateful.rb +27 -1
- data/lib/mongoid/threaded.rb +0 -3
- 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 +1 -0
- data/lib/mongoid/validatable/uniqueness.rb +2 -1
- data/lib/mongoid/version.rb +1 -5
- data/lib/mongoid/warnings.rb +3 -5
- data/lib/mongoid.rb +1 -0
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +8 -20
- data/spec/integration/associations/belongs_to_spec.rb +18 -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/i18n_fallbacks_spec.rb +1 -15
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/regex.yml +0 -21
- 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/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 +198 -8
- data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -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 +36 -51
- 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 +2 -56
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +60 -156
- 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/attributes/nested_spec.rb +73 -198
- 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 +480 -27
- data/spec/mongoid/cacheable_spec.rb +3 -3
- data/spec/mongoid/changeable_spec.rb +130 -13
- data/spec/mongoid/clients/factory_spec.rb +22 -60
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +2 -2
- data/spec/mongoid/config_spec.rb +52 -15
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +371 -231
- 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 +467 -156
- data/spec/mongoid/contextual/mongo_spec.rb +566 -426
- data/spec/mongoid/contextual/none_spec.rb +11 -19
- data/spec/mongoid/copyable_spec.rb +451 -2
- 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/bignum_spec.rb +1 -2
- 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/fixnum_spec.rb +1 -2
- 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 -2
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +0 -200
- data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
- data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
- data/spec/mongoid/criteria_spec.rb +469 -1203
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/equality_spec.rb +12 -12
- data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
- 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 -236
- 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 +64 -29
- 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 +24 -0
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +1 -156
- data/spec/mongoid/reloadable_spec.rb +35 -2
- data/spec/mongoid/scopable_spec.rb +36 -34
- data/spec/mongoid/serializable_spec.rb +14 -7
- data/spec/mongoid/shardable_models.rb +0 -14
- data/spec/mongoid/shardable_spec.rb +61 -153
- 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/mongoid_spec.rb +1 -7
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/cluster_config.rb +40 -5
- data/spec/shared/lib/mrss/constraints.rb +46 -7
- data/spec/shared/lib/mrss/docker_runner.rb +21 -17
- data/spec/shared/lib/mrss/eg_config_utils.rb +31 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
- data/spec/shared/lib/mrss/lite_constraints.rb +2 -10
- data/spec/shared/lib/mrss/server_version_registry.rb +29 -18
- data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
- data/spec/shared/lib/mrss/utils.rb +6 -28
- data/spec/shared/share/Dockerfile.erb +114 -38
- data/spec/shared/shlib/distro.sh +0 -10
- data/spec/shared/shlib/server.sh +83 -64
- data/spec/shared/shlib/set_env.sh +81 -16
- data/spec/support/constraints.rb +24 -0
- data/spec/support/expectations.rb +17 -20
- data/spec/support/macros.rb +30 -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/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -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.tar.gz.sig +0 -0
- metadata +695 -650
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/in_memory_regexp_timeout.rb +0 -26
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/lib/mongoid/field_readable.rb +0 -70
- data/lib/mongoid/matcher/regexp_budget.rb +0 -389
- data/spec/integration/matcher_regexp_timeout_spec.rb +0 -215
- data/spec/integration/query_operator_guard_spec.rb +0 -89
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
- data/spec/mongoid/matcher/regexp_budget_spec.rb +0 -570
- data/spec/shared/CANDIDATE.md +0 -28
- data/spec/shared/lib/mrss/release/candidate.rb +0 -287
- data/spec/shared/lib/mrss/release/product_data.rb +0 -144
- data/spec/shared/lib/tasks/candidate.rake +0 -64
|
@@ -9,10 +9,6 @@ describe Mongoid::Contextual::Aggregable::Memory do
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
describe "#aggregates" do
|
|
12
|
-
let(:context) do
|
|
13
|
-
Mongoid::Contextual::Memory.new(criteria)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
12
|
subject { context.aggregates(:likes) }
|
|
17
13
|
|
|
18
14
|
context 'when no documents found' do
|
|
@@ -50,384 +46,528 @@ describe Mongoid::Contextual::Aggregable::Memory do
|
|
|
50
46
|
|
|
51
47
|
describe "#avg" do
|
|
52
48
|
|
|
53
|
-
context "when
|
|
49
|
+
context "when the types are Integers" do
|
|
54
50
|
|
|
55
|
-
|
|
51
|
+
let!(:depeche) do
|
|
52
|
+
Band.create!(name: "Depeche Mode", likes: 1000)
|
|
53
|
+
end
|
|
56
54
|
|
|
57
|
-
|
|
55
|
+
let!(:tool) do
|
|
56
|
+
Band.create!(name: "Tool", likes: 500)
|
|
57
|
+
end
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
let(:criteria) do
|
|
60
|
+
Band.all.tap do |criteria|
|
|
61
|
+
criteria.documents = [ depeche, tool ]
|
|
62
|
+
end
|
|
63
|
+
end
|
|
62
64
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
65
|
+
let(:avg) do
|
|
66
|
+
context.avg(:likes)
|
|
67
|
+
end
|
|
66
68
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
end
|
|
71
|
-
end
|
|
69
|
+
it "returns the avg of the provided field" do
|
|
70
|
+
expect(avg).to eq(750)
|
|
71
|
+
end
|
|
72
72
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
it 'returns a float' do
|
|
74
|
+
avg.should be_a(Float)
|
|
75
|
+
end
|
|
76
76
|
|
|
77
|
-
|
|
78
|
-
context.avg(:likes)
|
|
79
|
-
end
|
|
77
|
+
context 'when integers are negative' do
|
|
80
78
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
end
|
|
79
|
+
let!(:depeche) do
|
|
80
|
+
Band.create!(name: "Depeche Mode", likes: -1000)
|
|
84
81
|
end
|
|
85
82
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
Band.create!(name: "Depeche Mode", rating: 10)
|
|
90
|
-
end
|
|
83
|
+
it "returns the avg of the provided field" do
|
|
84
|
+
expect(avg).to eq(-250)
|
|
85
|
+
end
|
|
91
86
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
87
|
+
it 'returns a float' do
|
|
88
|
+
avg.should be_a(Float)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
95
92
|
|
|
96
|
-
|
|
97
|
-
Band.all.tap do |criteria|
|
|
98
|
-
criteria.documents = [ depeche, tool ]
|
|
99
|
-
end
|
|
100
|
-
end
|
|
93
|
+
context "when the types are Floats" do
|
|
101
94
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
95
|
+
let!(:depeche) do
|
|
96
|
+
Band.create!(name: "Depeche Mode", rating: 10)
|
|
97
|
+
end
|
|
105
98
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
99
|
+
let!(:tool) do
|
|
100
|
+
Band.create!(name: "Tool", rating: 5)
|
|
101
|
+
end
|
|
109
102
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
103
|
+
let(:criteria) do
|
|
104
|
+
Band.all.tap do |criteria|
|
|
105
|
+
criteria.documents = [ depeche, tool ]
|
|
113
106
|
end
|
|
114
107
|
end
|
|
115
108
|
|
|
116
|
-
|
|
109
|
+
let(:avg) do
|
|
110
|
+
context.avg(:rating)
|
|
111
|
+
end
|
|
117
112
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
113
|
+
it "returns the avg of the provided field" do
|
|
114
|
+
expect(avg).to eq(7.5)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
121
117
|
|
|
122
|
-
|
|
123
|
-
Band.where(name: "New Order")
|
|
124
|
-
end
|
|
118
|
+
context "when no documents match" do
|
|
125
119
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
120
|
+
let!(:depeche) do
|
|
121
|
+
Band.create!(name: "Depeche Mode", likes: 1000)
|
|
122
|
+
end
|
|
129
123
|
|
|
130
|
-
|
|
131
|
-
|
|
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
|
|
138
|
+
|
|
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
|
|
132
148
|
end
|
|
149
|
+
end
|
|
133
150
|
|
|
134
|
-
|
|
135
|
-
|
|
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
|
|
136
173
|
end
|
|
137
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
|
|
138
187
|
end
|
|
139
188
|
end
|
|
140
189
|
|
|
141
190
|
describe "#max" do
|
|
142
191
|
|
|
143
|
-
|
|
192
|
+
let!(:depeche) do
|
|
193
|
+
Band.create!(name: "Depeche Mode", likes: 1000)
|
|
194
|
+
end
|
|
195
|
+
|
|
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
|
-
Band.create!(name: "Tool", likes: 500)
|
|
151
|
-
end
|
|
206
|
+
context "when provided a Symbol" do
|
|
152
207
|
|
|
153
|
-
let(:
|
|
154
|
-
|
|
155
|
-
crit.documents = [ depeche, tool ]
|
|
156
|
-
end
|
|
208
|
+
let(:max) do
|
|
209
|
+
context.max(:likes)
|
|
157
210
|
end
|
|
158
211
|
|
|
159
|
-
|
|
160
|
-
|
|
212
|
+
it "returns the max of the provided field" do
|
|
213
|
+
expect(max).to eq(1000)
|
|
161
214
|
end
|
|
162
215
|
|
|
163
|
-
context "when
|
|
216
|
+
context "when no documents match" do
|
|
217
|
+
|
|
218
|
+
let(:criteria) do
|
|
219
|
+
Band.where(name: "New Order")
|
|
220
|
+
end
|
|
164
221
|
|
|
165
222
|
let(:max) do
|
|
166
223
|
context.max(:likes)
|
|
167
224
|
end
|
|
168
225
|
|
|
169
|
-
it "returns
|
|
170
|
-
expect(max).to
|
|
226
|
+
it "returns nil" do
|
|
227
|
+
expect(max).to be_nil
|
|
171
228
|
end
|
|
229
|
+
end
|
|
172
230
|
|
|
173
|
-
|
|
231
|
+
context "when there are a mix of types" do
|
|
174
232
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
|
178
238
|
|
|
179
|
-
|
|
180
|
-
|
|
239
|
+
let(:criteria) do
|
|
240
|
+
Band.all.tap do |criteria|
|
|
241
|
+
criteria.documents = bands
|
|
181
242
|
end
|
|
243
|
+
end
|
|
182
244
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
245
|
+
let(:max) do
|
|
246
|
+
context.max(:mojo)
|
|
247
|
+
end
|
|
186
248
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
249
|
+
it "coerces types to calculate max" do
|
|
250
|
+
expect(max).to eq 10
|
|
251
|
+
expect(max).to be_a Integer
|
|
190
252
|
end
|
|
191
253
|
end
|
|
192
254
|
|
|
193
|
-
context "when
|
|
255
|
+
context "when there no numeric values" do
|
|
194
256
|
|
|
195
|
-
let(:
|
|
196
|
-
|
|
197
|
-
|
|
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
|
|
198
264
|
end
|
|
199
265
|
end
|
|
200
266
|
|
|
201
|
-
|
|
202
|
-
|
|
267
|
+
let(:max) do
|
|
268
|
+
context.avg(:mojo)
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
it "returns max as nil" do
|
|
272
|
+
expect(max).to be_nil
|
|
203
273
|
end
|
|
204
274
|
end
|
|
205
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)
|
|
287
|
+
end
|
|
288
|
+
end
|
|
206
289
|
end
|
|
207
290
|
|
|
208
291
|
describe "#min" do
|
|
209
292
|
|
|
210
|
-
|
|
293
|
+
let!(:depeche) do
|
|
294
|
+
Band.create!(name: "Depeche Mode", likes: 1000)
|
|
295
|
+
end
|
|
211
296
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
297
|
+
let!(:tool) do
|
|
298
|
+
Band.create!(name: "Tool", likes: 500)
|
|
299
|
+
end
|
|
215
300
|
|
|
216
|
-
|
|
217
|
-
|
|
301
|
+
let(:criteria) do
|
|
302
|
+
Band.all.tap do |crit|
|
|
303
|
+
crit.documents = [ depeche, tool ]
|
|
218
304
|
end
|
|
305
|
+
end
|
|
219
306
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
307
|
+
context "when provided a Symbol" do
|
|
308
|
+
|
|
309
|
+
let(:min) do
|
|
310
|
+
context.min(:likes)
|
|
224
311
|
end
|
|
225
312
|
|
|
226
|
-
|
|
227
|
-
|
|
313
|
+
it "returns the min of the provided field" do
|
|
314
|
+
expect(min).to eq(500)
|
|
228
315
|
end
|
|
229
316
|
|
|
230
|
-
context "when
|
|
317
|
+
context "when no documents match" do
|
|
318
|
+
|
|
319
|
+
let(:criteria) do
|
|
320
|
+
Band.where(name: "New Order")
|
|
321
|
+
end
|
|
231
322
|
|
|
232
323
|
let(:min) do
|
|
233
324
|
context.min(:likes)
|
|
234
325
|
end
|
|
235
326
|
|
|
236
|
-
it "returns
|
|
237
|
-
expect(min).to
|
|
327
|
+
it "returns nil" do
|
|
328
|
+
expect(min).to be_nil
|
|
238
329
|
end
|
|
330
|
+
end
|
|
239
331
|
|
|
240
|
-
|
|
332
|
+
context "when there are a mix of types" do
|
|
241
333
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
|
245
339
|
|
|
246
|
-
|
|
247
|
-
|
|
340
|
+
let(:criteria) do
|
|
341
|
+
Band.all.tap do |criteria|
|
|
342
|
+
criteria.documents = bands
|
|
248
343
|
end
|
|
344
|
+
end
|
|
249
345
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
346
|
+
let(:min) do
|
|
347
|
+
context.min(:mojo)
|
|
348
|
+
end
|
|
253
349
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
350
|
+
it "coerces types to calculate min" do
|
|
351
|
+
expect(min).to eq 7.7
|
|
352
|
+
expect(min).to be_a Float
|
|
257
353
|
end
|
|
258
354
|
end
|
|
259
355
|
|
|
260
|
-
context "when
|
|
356
|
+
context "when there no numeric values" do
|
|
261
357
|
|
|
262
|
-
let(:
|
|
263
|
-
|
|
264
|
-
|
|
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
|
|
265
365
|
end
|
|
266
366
|
end
|
|
267
367
|
|
|
268
|
-
|
|
269
|
-
|
|
368
|
+
let(:min) do
|
|
369
|
+
context.min(:mojo)
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
it "returns min as nil" do
|
|
373
|
+
expect(min).to be_nil
|
|
270
374
|
end
|
|
271
375
|
end
|
|
272
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
|
|
383
|
+
end
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
it "returns the document with the min value for the field" do
|
|
387
|
+
expect(min).to eq(tool)
|
|
388
|
+
end
|
|
389
|
+
end
|
|
273
390
|
end
|
|
274
391
|
|
|
275
392
|
describe "#sum" do
|
|
276
393
|
|
|
277
|
-
|
|
394
|
+
let!(:depeche) do
|
|
395
|
+
Band.create!(name: "Depeche Mode", likes: 1000)
|
|
396
|
+
end
|
|
278
397
|
|
|
279
|
-
|
|
280
|
-
|
|
398
|
+
let!(:tool) do
|
|
399
|
+
Band.create!(name: "Tool", likes: 500)
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
let(:criteria) do
|
|
403
|
+
Band.all.tap do |crit|
|
|
404
|
+
crit.documents = [ depeche, tool ]
|
|
281
405
|
end
|
|
406
|
+
end
|
|
282
407
|
|
|
283
|
-
|
|
284
|
-
|
|
408
|
+
context 'when values are integers' do
|
|
409
|
+
|
|
410
|
+
let(:sum) do
|
|
411
|
+
context.sum(:likes)
|
|
285
412
|
end
|
|
286
413
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
414
|
+
shared_examples 'sums and returns an integer' do
|
|
415
|
+
it 'sums' do
|
|
416
|
+
sum.should == 1500
|
|
290
417
|
end
|
|
291
|
-
end
|
|
292
418
|
|
|
293
|
-
|
|
294
|
-
|
|
419
|
+
it 'returns integer' do
|
|
420
|
+
sum.should be_a(Integer)
|
|
421
|
+
end
|
|
295
422
|
end
|
|
296
423
|
|
|
297
|
-
|
|
424
|
+
include_examples 'sums and returns an integer'
|
|
298
425
|
|
|
299
|
-
|
|
300
|
-
context.sum(:likes)
|
|
301
|
-
end
|
|
426
|
+
context 'when values are numeric strings' do
|
|
302
427
|
|
|
303
|
-
|
|
304
|
-
|
|
428
|
+
let!(:depeche) do
|
|
429
|
+
Band.create!(name: "Depeche Mode", likes: '1000')
|
|
305
430
|
end
|
|
306
431
|
|
|
307
|
-
|
|
432
|
+
include_examples 'sums and returns an integer'
|
|
433
|
+
end
|
|
308
434
|
|
|
309
|
-
|
|
310
|
-
Band.where(name: "New Order")
|
|
311
|
-
end
|
|
435
|
+
context 'when values are negative integers' do
|
|
312
436
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
437
|
+
let!(:depeche) do
|
|
438
|
+
Band.create!(name: "Depeche Mode", likes: -1000)
|
|
439
|
+
end
|
|
316
440
|
|
|
317
|
-
|
|
318
|
-
|
|
441
|
+
shared_examples 'sums and returns an integer' do
|
|
442
|
+
it 'sums' do
|
|
443
|
+
sum.should == -500
|
|
319
444
|
end
|
|
320
445
|
|
|
321
|
-
it
|
|
322
|
-
|
|
446
|
+
it 'returns integer' do
|
|
447
|
+
sum.should be_a(Integer)
|
|
323
448
|
end
|
|
324
449
|
end
|
|
325
|
-
end
|
|
326
450
|
|
|
327
|
-
|
|
451
|
+
include_examples 'sums and returns an integer'
|
|
328
452
|
|
|
329
|
-
|
|
330
|
-
context.sum(&:likes)
|
|
331
|
-
end
|
|
453
|
+
context 'when values are negative numeric strings' do
|
|
332
454
|
|
|
333
|
-
|
|
334
|
-
|
|
455
|
+
let!(:depeche) do
|
|
456
|
+
Band.create!(name: "Depeche Mode", likes: '-1000')
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
include_examples 'sums and returns an integer'
|
|
335
460
|
end
|
|
336
461
|
end
|
|
337
462
|
end
|
|
338
|
-
end
|
|
339
463
|
|
|
340
|
-
|
|
464
|
+
context 'when values are floats' do
|
|
341
465
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
466
|
+
let!(:depeche) do
|
|
467
|
+
Band.create!(name: "Depeche Mode", likes: 1000.0)
|
|
468
|
+
end
|
|
345
469
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
crit.documents = [ depeche ]
|
|
470
|
+
let(:sum) do
|
|
471
|
+
context.sum(:likes)
|
|
349
472
|
end
|
|
350
|
-
end
|
|
351
473
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
end
|
|
474
|
+
it 'sums' do
|
|
475
|
+
sum.should == 1500
|
|
476
|
+
end
|
|
356
477
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
478
|
+
it 'returns integer' do
|
|
479
|
+
sum.should be_a(Integer)
|
|
480
|
+
end
|
|
360
481
|
end
|
|
361
482
|
|
|
362
|
-
|
|
363
|
-
expect(depeche).not_to receive(:delete)
|
|
364
|
-
expect(context.max(:delete)).to be_nil
|
|
365
|
-
end
|
|
483
|
+
context "when provided a Symbol" do
|
|
366
484
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
end
|
|
485
|
+
let(:sum) do
|
|
486
|
+
context.sum(:likes)
|
|
487
|
+
end
|
|
371
488
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
.to eq("count" => 0, "avg" => 0.0, "max" => nil, "min" => nil, "sum" => 0)
|
|
376
|
-
end
|
|
489
|
+
it "returns the sum of the provided field" do
|
|
490
|
+
expect(sum).to eq(1500)
|
|
491
|
+
end
|
|
377
492
|
|
|
378
|
-
|
|
379
|
-
expect(depeche).not_to receive(:exit)
|
|
380
|
-
expect(context.avg(:exit)).to eq(0.0)
|
|
381
|
-
end
|
|
382
|
-
end
|
|
493
|
+
context "when no documents match" do
|
|
383
494
|
|
|
384
|
-
|
|
495
|
+
let(:criteria) do
|
|
496
|
+
Band.where(name: "New Order")
|
|
497
|
+
end
|
|
385
498
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
499
|
+
let(:sum) do
|
|
500
|
+
context.sum(:likes)
|
|
501
|
+
end
|
|
389
502
|
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
503
|
+
it "returns zero" do
|
|
504
|
+
expect(sum).to eq(0)
|
|
505
|
+
end
|
|
393
506
|
end
|
|
394
|
-
end
|
|
395
507
|
|
|
396
|
-
|
|
397
|
-
expect(context.sum(:not_a_field)).to eq(0)
|
|
398
|
-
end
|
|
508
|
+
context "when there are a mix of types" do
|
|
399
509
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
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
|
|
403
515
|
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
516
|
+
let(:criteria) do
|
|
517
|
+
Band.all.tap do |criteria|
|
|
518
|
+
criteria.documents = bands
|
|
519
|
+
end
|
|
520
|
+
end
|
|
407
521
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
end
|
|
522
|
+
let(:sum) do
|
|
523
|
+
context.sum(:mojo)
|
|
524
|
+
end
|
|
412
525
|
|
|
413
|
-
|
|
526
|
+
it "coerces types to calculate sum" do
|
|
527
|
+
expect(sum).to eq 17.7
|
|
528
|
+
expect(sum).to be_a Float
|
|
529
|
+
end
|
|
414
530
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
531
|
+
it "database only sums Float and Integer types" do
|
|
532
|
+
expect(Band.all.sum(:mojo)).to be_within(Float::EPSILON).of(17.7)
|
|
533
|
+
end
|
|
534
|
+
end
|
|
418
535
|
|
|
419
|
-
|
|
420
|
-
Person.new(preferences: [ preference ])
|
|
421
|
-
end
|
|
536
|
+
context "when there no numeric values" do
|
|
422
537
|
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
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
|
|
547
|
+
|
|
548
|
+
let(:sum) do
|
|
549
|
+
context.sum(:mojo)
|
|
550
|
+
end
|
|
551
|
+
|
|
552
|
+
it "returns sum as zero" do
|
|
553
|
+
expect(sum).to eq 0
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
it "database returns sum as zero" do
|
|
557
|
+
expect(Band.all.sum(:mojo)).to eq(0)
|
|
558
|
+
end
|
|
426
559
|
end
|
|
427
560
|
end
|
|
428
561
|
|
|
429
|
-
|
|
430
|
-
|
|
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)
|
|
570
|
+
end
|
|
431
571
|
end
|
|
432
572
|
end
|
|
433
573
|
end
|