Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Always return decimal average of integer fields #160

Closed
wants to merge 1 commit into from

Conversation

rsim
Copy link
Contributor

@rsim rsim commented Jan 10, 2011

In previous version if database adapter (e.g. SQLite and Oracle) returned non-String calculated values then type_cast_using_column converted decimal average value of intefer field to integer value. Now operation parameter is always checked to decide which conversion of calculated value should be done.

This is fix for Lighthouse issue #6103
https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/6103-average-returns-integer-values-instead-of-decimals
and is fixing bug that was introduced by commit 0a8eaff

This should be applied to master branch as well.

In previous version if database adapter (e.g. SQLite and Oracle) returned non-String calculated values then type_cast_using_column converted decimal average value of intefer field to integer value. Now operation parameter is always checked to decide which conversion of calculated value should be done.
@tenderlove
Copy link
Member

This breaks the mysql2 tests:

  1) Error:
test_average_with_from_option(CalculationsTest):
NoMethodError: undefined method `to_d' for #<BigDecimal:104c80690,'0.53E2',9(18)>
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:279:in `type_cast_calculated_value'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:207:in `execute_simple_calculation'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:182:in `perform_calculation'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:152:in `calculate'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:66:in `average'
    /Users/apatterson/git/rails/activerecord/lib/active_record/base.rb:442:in `average'
    test/cases/calculations_test.rb:339:in `test_average_with_from_option'
    /Users/apatterson/.local/lib/ruby/gems/1.9.1/gems/mocha-0.9.10/lib/mocha/integration/mini_test/version_142_and_above.rb:27:in `run'
    /Users/apatterson/git/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:35:in `block in run'
    /Users/apatterson/git/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
    /Users/apatterson/git/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:34:in `run'

  2) Error:
test_should_average_field(CalculationsTest):
NoMethodError: undefined method `to_d' for #<BigDecimal:106020448,'0.53E2',9(18)>
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:279:in `type_cast_calculated_value'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:207:in `execute_simple_calculation'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:182:in `perform_calculation'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:152:in `calculate'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:66:in `average'
    /Users/apatterson/git/rails/activerecord/lib/active_record/base.rb:442:in `average'
    test/cases/calculations_test.rb:22:in `test_should_average_field'
    /Users/apatterson/.local/lib/ruby/gems/1.9.1/gems/mocha-0.9.10/lib/mocha/integration/mini_test/version_142_and_above.rb:27:in `run'
    /Users/apatterson/git/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:35:in `block in run'
    /Users/apatterson/git/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
    /Users/apatterson/git/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:34:in `run'

  3) Error:
test_should_return_decimal_average_of_integer_field(CalculationsTest):
NoMethodError: undefined method `to_d' for #<BigDecimal:10499c578,'0.35E1',18(18)>
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:279:in `type_cast_calculated_value'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:207:in `execute_simple_calculation'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:182:in `perform_calculation'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:152:in `calculate'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:66:in `average'
    /Users/apatterson/git/rails/activerecord/lib/active_record/base.rb:442:in `average'
    test/cases/calculations_test.rb:27:in `test_should_return_decimal_average_of_integer_field'
    /Users/apatterson/.local/lib/ruby/gems/1.9.1/gems/mocha-0.9.10/lib/mocha/integration/mini_test/version_142_and_above.rb:27:in `run'
    /Users/apatterson/git/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:35:in `block in run'
    /Users/apatterson/git/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
    /Users/apatterson/git/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:34:in `run'

  4) Error:
test_delegates_finds_and_calculations_to_the_base_class(NamedScopeTest):
NoMethodError: undefined method `to_d' for #<BigDecimal:104903a58,'0.5E0',9(18)>
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:279:in `type_cast_calculated_value'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:207:in `execute_simple_calculation'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:182:in `perform_calculation'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:152:in `calculate'
    /Users/apatterson/git/rails/activerecord/lib/active_record/relation/calculations.rb:66:in `average'
    /Users/apatterson/git/rails/activerecord/lib/active_record/base.rb:442:in `average'
    test/cases/named_scope_test.rb:47:in `test_delegates_finds_and_calculations_to_the_base_class'
    /Users/apatterson/.local/lib/ruby/gems/1.9.1/gems/mocha-0.9.10/lib/mocha/integration/mini_test/version_142_and_above.rb:27:in `run'
    /Users/apatterson/git/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:35:in `block in run'
    /Users/apatterson/git/rails/activesupport/lib/active_support/callbacks.rb:418:in `_run_setup_callbacks'
    /Users/apatterson/git/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:34:in `run'

2433 tests, 7757 assertions, 0 failures, 4 errors, 0 skips

@tenderlove
Copy link
Member

Closing this since it's in master

matthewd pushed a commit that referenced this pull request Apr 24, 2018
Small change to oracle paging code to trigger stopkey optimization
@p8 p8 mentioned this pull request May 21, 2021
This pull request was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants