1. 25 8月, 2018 1 次提交
  2. 03 7月, 2018 1 次提交
  3. 19 6月, 2018 1 次提交
    • R
      Ensure to calculate column aliases after all table aliases are constructed · 15e3e9cd
      Ryuta Kamizono 提交于
      Currently, column aliases which is used for eager loading are calculated
      before constructing all table aliases in FROM clause.
      
      `JoinDependency#join_constraints` constructs table aliases for `joins`
      first, and then always re-constructs table aliases for eager loading.
      
      If both `joins` and eager loading are given a same table association,
      the re-construction would cause the discrepancy between column aliases
      and table aliases.
      
      To avoid the discrepancy, the column aliases should be calculated after
      all table aliases are constructed.
      
      Fixes #30603.
      15e3e9cd
  4. 25 4月, 2018 1 次提交
  5. 19 4月, 2018 1 次提交
  6. 06 3月, 2018 1 次提交
  7. 15 1月, 2018 1 次提交
  8. 14 1月, 2018 1 次提交
  9. 04 1月, 2018 1 次提交
  10. 20 12月, 2017 1 次提交
  11. 18 12月, 2017 1 次提交
  12. 13 12月, 2017 1 次提交
    • Y
      Make `sanitize_sql_` methods public · 9d43a84f
      yuuji.yaginuma 提交于
      Currently, sanitize methods are private. So need `send` to use from
      outside class.
      However, sometimes want to use sanitize methods from outside Class when
      want to generate SQL including multiple tables like search.
      In order to avoid using `send` in such a case, changed methods to public.
      9d43a84f
  13. 12 12月, 2017 1 次提交
  14. 14 11月, 2017 1 次提交
  15. 12 11月, 2017 1 次提交
  16. 10 11月, 2017 2 次提交
  17. 09 11月, 2017 10 次提交
  18. 23 10月, 2017 1 次提交
  19. 21 10月, 2017 1 次提交
  20. 09 10月, 2017 1 次提交
  21. 08 10月, 2017 1 次提交
  22. 05 10月, 2017 1 次提交
  23. 06 9月, 2017 1 次提交
    • G
      PERF: Recover `ActiveRecord::pluck` performance. · 33812786
      Guo Xiang Tan 提交于
      ```ruby
      require 'active_record'
      require 'benchmark/ips'
      
      ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL'))
      ActiveRecord::Migration.verbose = false
      
      ActiveRecord::Schema.define do
        create_table :users, force: true do |t|
          t.string :name, :email
          t.timestamps null: false
        end
      end
      
      attributes = {
        name: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
        email: 'foobar@email.com'
      }
      
      class User < ActiveRecord::Base; end
      
      1000.times do
        User.create!(attributes)
      end
      
      Benchmark.ips do |x|
        x.config(time: 10, warmup: 2)
      
        x.report('pluck 1 column') do
          User.pluck(:id)
        end
      
        x.report('pluck 2 columns') do
          User.pluck(:id, :email)
        end
      
        x.report('pluck 1 column with scope') do
          User.where(id: 1000).pluck(:id)
        end
      
        x.report('pluck 2 columns with scope') do
          User.where(id: 1000).pluck(:id, :email)
        end
      end
      ```
      
      ```
      Calculating -------------------------------------
            pluck 1 column   122.000  i/100ms
           pluck 2 columns    74.000  i/100ms
      pluck 1 column with scope
                             615.000  i/100ms
      pluck 2 columns with scope
                             515.000  i/100ms
      -------------------------------------------------
            pluck 1 column      1.272k (± 3.9%) i/s -     12.810k
           pluck 2 columns    750.096  (± 3.3%) i/s -      7.548k
      pluck 1 column with scope
                                6.074k (± 4.1%) i/s -     60.885k
      pluck 2 columns with scope
                                5.158k (± 2.7%) i/s -     52.015k
      ```
      
      ```
      Calculating -------------------------------------
            pluck 1 column   126.000  i/100ms
           pluck 2 columns    78.000  i/100ms
      pluck 1 column with scope
                             457.000  i/100ms
      pluck 2 columns with scope
                             434.000  i/100ms
      -------------------------------------------------
            pluck 1 column      1.266k (± 2.1%) i/s -     12.726k
           pluck 2 columns    795.061  (± 3.0%) i/s -      7.956k
      pluck 1 column with scope
                                4.660k (± 2.1%) i/s -     46.614k
      pluck 2 columns with scope
                                4.355k (± 2.3%) i/s -     43.834k
      ```
      
      ```
      Calculating -------------------------------------
            pluck 1 column   126.000  i/100ms
           pluck 2 columns    78.000  i/100ms
      pluck 1 column with scope
                             539.000  i/100ms
      pluck 2 columns with scope
                             481.000  i/100ms
      -------------------------------------------------
            pluck 1 column      1.308k (± 3.4%) i/s -     13.104k
           pluck 2 columns    798.604  (± 2.8%) i/s -      8.034k
      pluck 1 column with scope
                                5.530k (± 3.4%) i/s -     55.517k
      pluck 2 columns with scope
                                4.914k (± 2.7%) i/s -     49.543k
      ```
      
      ```
      Calculating -------------------------------------
            pluck 1 column   139.000  i/100ms
           pluck 2 columns    79.000  i/100ms
      pluck 1 column with scope
                             580.000  i/100ms
      pluck 2 columns with scope
                             526.000  i/100ms
      -------------------------------------------------
            pluck 1 column      1.337k (± 3.0%) i/s -     13.483k
           pluck 2 columns    806.776  (± 2.7%) i/s -      8.137k
      pluck 1 column with scope
                                5.924k (± 4.1%) i/s -     59.160k
      pluck 2 columns with scope
                                5.276k (± 3.1%) i/s -     53.126k
      ```
      33812786
  24. 26 7月, 2017 1 次提交
  25. 25 7月, 2017 2 次提交
  26. 24 7月, 2017 1 次提交
    • S
      Refactor Active Record to let Arel manage bind params · 213796fb
      Sean Griffin 提交于
      A common source of bugs and code bloat within Active Record has been the
      need for us to maintain the list of bind values separately from the AST
      they're associated with. This makes any sort of AST manipulation
      incredibly difficult, as any time we want to potentially insert or
      remove an AST node, we need to traverse the entire tree to find where
      the associated bind parameters are.
      
      With this change, the bind parameters now live on the AST directly.
      Active Record does not need to know or care about them until the final
      AST traversal for SQL construction. Rather than returning just the SQL,
      the Arel collector will now return both the SQL and the bind parameters.
      At this point the connection adapter will have all the values that it
      had before.
      
      A bit of this code is janky and something I'd like to refactor later. In
      particular, I don't like how we're handling associations in the
      predicate builder, the special casing of `StatementCache::Substitute` in
      `QueryAttribute`, or generally how we're handling bind value replacement
      in the statement cache when prepared statements are disabled.
      
      This also mostly reverts #26378, as it moved all the code into a
      location that I wanted to delete.
      
      /cc @metaskills @yahonda, this change will affect the adapters
      
      Fixes #29766.
      Fixes #29804.
      Fixes #26541.
      Close #28539.
      Close #24769.
      Close #26468.
      Close #26202.
      
      There are probably other issues/PRs that can be closed because of this
      commit, but that's all I could find on the first few pages.
      213796fb
  27. 20 7月, 2017 1 次提交
  28. 18 7月, 2017 2 次提交
    • R
      Fix `JoinDependency` with using a custom table · ea09bf54
      Ryuta Kamizono 提交于
      Without this fix, `JoinDependency` doesn't use a custom table alias:
      
      ```
      % ARCONN=sqlite3 be ruby -w -Itest test/cases/relations_test.rb -n test_using_a_custom_table_with_joins_affects_the_wheres
      Using sqlite3
      Run options: -n test_using_a_custom_table_with_joins_affects_the_wheres --seed 14531
      
      E
      
      Error:RelationTest#test_using_a_custom_table_with_joins_affects_the_wheres:
      ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: posts.author_id: SELECT  "omg_posts".* FROM "posts" "omg_posts" INNER JOIN "authors" ON "authors"."id" = "posts"."author_id" WHERE "omg_posts"."title" = ? LIMIT ?
      ```
      ea09bf54
    • R
      Fix `where` with a custom table · 26ba655f
      Ryuta Kamizono 提交于
      Without this fix, SELECT clause doesn't use a custom table alias name:
      
      ```
      % ARCONN=sqlite3 be ruby -w -Itest test/cases/relations_test.rb -n test_using_a_custom_table_affects_the_wheres
      Using sqlite3
      Run options: -n test_using_a_custom_table_affects_the_wheres --seed 31818
      
      E
      
      Error:
      RelationTest#test_using_a_custom_table_affects_the_wheres:
      ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: posts: SELECT  "posts".* FROM "posts" "omg_posts" WHERE "omg_posts"."title" = ? LIMIT ?
      ```
      26ba655f