Commit message (Collapse) | Author | Age | Files | Lines | |
---|---|---|---|---|---|
* | add factory methods for empty alias trackers | Aaron Patterson | 2014-02-14 | 1 | -1/+1 |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If we know the alias tracker is empty, we can create one that doesn't use a hash with default block for counting. ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:') ActiveRecord::Schema.define do create_table :posts, force: true do |t| t.integer :comments_count end create_table :comments, force: true do |t| t.integer :post_id end end class Post < ActiveRecord::Base; has_many :comments; end class Comment < ActiveRecord::Base; belongs_to :post, counter_cache: true; end 10.times { Comment.create!(post: Post.create!) } record = Post.first association_name = :comments Benchmark.ips do |x| reflection = record.class.reflect_on_association(association_name) association = reflection.association_class.new(record, reflection) x.report('assoc') do reflection.association_class.new(record, reflection) end x.report('reader') do association.reader;nil end x.report('combined') do reflection.association_class.new(record, reflection).reader;nil end end [aaron@higgins rails (tracker)]$ TEST=ips bundle exec ruby ../1bb5456b5e035343df9d/gistfile1.rb -- create_table(:posts, {:force=>true}) -> 0.0062s -- create_table(:comments, {:force=>true}) -> 0.0003s Calculating ------------------------------------- assoc 833 i/100ms reader 28703 i/100ms combined 839 i/100ms ------------------------------------------------- assoc 9010.3 (±3.8%) i/s - 44982 in 5.000022s reader 3214523.4 (±5.5%) i/s - 16016274 in 5.001136s combined 8841.0 (±5.8%) i/s - 44467 in 5.049269s [aaron@higgins rails (tracker)]$ TEST=ips bundle exec ruby ../1bb5456b5e035343df9d/gistfile1.rb -- create_table(:posts, {:force=>true}) -> 0.0060s -- create_table(:comments, {:force=>true}) -> 0.0003s Calculating ------------------------------------- assoc 888 i/100ms reader 29217 i/100ms combined 900 i/100ms ------------------------------------------------- assoc 9674.3 (±3.3%) i/s - 48840 in 5.054022s reader 2988474.8 (±6.9%) i/s - 14842236 in 4.998230s combined 9674.0 (±3.1%) i/s - 48600 in 5.028694s | ||||
* | make most parameters to the AliasTracker required | Aaron Patterson | 2014-02-14 | 1 | -1/+1 |
| | | | | | This helps with our sanity. The class is internal, we can refactor to a "nice" API later. | ||||
* | Avoid using deprecated arel constants | Rafael Mendonça França | 2014-02-10 | 1 | -2/+2 |
| | |||||
* | Make outer joins on proper parent | Washington Luiz | 2013-12-31 | 1 | -1/+1 |
| | | | | | Outer joins were being built on the root relation klass rather than the one specified in the join dependency root | ||||
* | tyop | Akira Matsuda | 2013-11-26 | 1 | -1/+1 |
| | |||||
* | Change syntax format for example returned values | Prem Sichanugrist | 2013-11-11 | 1 | -6/+6 |
| | | | | | | | | | According to our guideline, we leave 1 space between `#` and `=>`, so we want `# =>` instead of `#=>`. Thanks to @fxn for the suggestion. [ci skip] | ||||
* | move helper class to the top | Aaron Patterson | 2013-10-21 | 1 | -42/+42 |
| | |||||
* | build the association graph functionally | Aaron Patterson | 2013-10-21 | 1 | -16/+9 |
| | | | | This lets us avoid the constant calls to Array#<< | ||||
* | @base_klass is not used | Aaron Patterson | 2013-10-21 | 1 | -1/+0 |
| | |||||
* | join_type isn't used on the node anymore | Aaron Patterson | 2013-10-21 | 1 | -6/+6 |
| | |||||
* | make joins generation method look similar | Aaron Patterson | 2013-10-21 | 1 | -6/+9 |
| | |||||
* | remove node duping code | Aaron Patterson | 2013-10-21 | 1 | -57/+19 |
| | |||||
* | refactor outer join generation | Aaron Patterson | 2013-10-21 | 1 | -11/+6 |
| | |||||
* | add outer joins for matching nodes | Aaron Patterson | 2013-10-21 | 1 | -2/+14 |
| | |||||
* | construct joins by walking the outer join tree | Aaron Patterson | 2013-10-21 | 1 | -5/+34 |
| | |||||
* | pass the outer joins to join_constraints | Aaron Patterson | 2013-10-20 | 1 | -1/+2 |
| | |||||
* | disconnect join_constraints from the instance | Aaron Patterson | 2013-10-20 | 1 | -1/+1 |
| | |||||
* | pass in scope chain so reflection is not needed | Aaron Patterson | 2013-10-20 | 1 | -1/+1 |
| | |||||
* | pass the foreign table and class to the join_constraints method | Aaron Patterson | 2013-10-20 | 1 | -1/+3 |
| | |||||
* | pass the join type to the join_constraints method | Aaron Patterson | 2013-10-20 | 1 | -1/+2 |
| | |||||
* | use the node as cache so we can avoid accessing the table | Aaron Patterson | 2013-10-15 | 1 | -13/+13 |
| | |||||
* | apply tables to the whole tree from the outside | Aaron Patterson | 2013-10-15 | 1 | -14/+8 |
| | |||||
* | apply table aliases after the AST has been built | Aaron Patterson | 2013-10-15 | 1 | -1/+13 |
| | |||||
* | stop reversing tables until we absolutely must | Aaron Patterson | 2013-10-15 | 1 | -1/+1 |
| | |||||
* | pass the chain the join_constraints | Aaron Patterson | 2013-10-15 | 1 | -1/+2 |
| | |||||
* | move column_names_with_alias on to the alias cache object | Aaron Patterson | 2013-10-14 | 1 | -8/+18 |
| | |||||
* | keep a cache on the alias object | Aaron Patterson | 2013-10-14 | 1 | -11/+21 |
| | |||||
* | move alias building to the table node | Aaron Patterson | 2013-10-14 | 1 | -4/+8 |
| | |||||
* | let the Table class build the ARel alias nodes | Aaron Patterson | 2013-10-14 | 1 | -4/+9 |
| | |||||
* | store aliases in a better structure | Aaron Patterson | 2013-10-14 | 1 | -4/+17 |
| | |||||
* | unhook `join_constraints` from the @tables ivar | Aaron Patterson | 2013-10-13 | 1 | -1/+1 |
| | |||||
* | push the node->AR cache up one level | Aaron Patterson | 2013-10-13 | 1 | -10/+11 |
| | |||||
* | remove dead code | Aaron Patterson | 2013-10-11 | 1 | -5/+0 |
| | |||||
* | remove useless code | Aaron Patterson | 2013-10-11 | 1 | -24/+20 |
| | | | | | turns out that the activerecord object will always have the same id as the row from which it was constructed | ||||
* | the parent hash keeps the records unique already | Aaron Patterson | 2013-10-11 | 1 | -4/+3 |
| | |||||
* | keep track of AR objects we've made as we walk the tree | Aaron Patterson | 2013-10-11 | 1 | -35/+22 |
| | | | | | Remove duplicate removal code because we avoid adding duplicates as we walk the tree the first time | ||||
* | push up the loaded target checking | Aaron Patterson | 2013-10-11 | 1 | -9/+13 |
| | |||||
* | we always have a model now | Aaron Patterson | 2013-10-11 | 1 | -1/+1 |
| | |||||
* | extract conditional to the caller | Aaron Patterson | 2013-10-11 | 1 | -11/+13 |
| | |||||
* | we always have a reflection and it is on the node | Aaron Patterson | 2013-10-11 | 1 | -2/+2 |
| | |||||
* | fix variable name. we're constructing a model, not an association | Aaron Patterson | 2013-10-11 | 1 | -12/+12 |
| | |||||
* | reflections know if they are collections, so ask | Aaron Patterson | 2013-10-11 | 1 | -6/+5 |
| | | | | | We don't need to poke at the macro to figure out if we should look for a cached record or not | ||||
* | belongs_to can be treated the same way as has_one | Aaron Patterson | 2013-10-11 | 1 | -12/+5 |
| | |||||
* | cache the primary key / typcast lookup on the stack | Aaron Patterson | 2013-10-11 | 1 | -9/+9 |
| | |||||
* | remove dead code / make duplicate code more obvious | Aaron Patterson | 2013-10-11 | 1 | -4/+4 |
| | |||||
* | pull parent and alias tacker from the nodes. | Aaron Patterson | 2013-10-11 | 1 | -1/+18 |
| | | | | For now, we'll set the tables on the nodes manually. | ||||
* | decouple the `join_constraints` method from the parent pointer | Aaron Patterson | 2013-10-11 | 1 | -1/+7 |
| | |||||
* | refactor a little so we can remove some methods | Aaron Patterson | 2013-10-10 | 1 | -1/+1 |
| | |||||
* | the parent node is on the stack, so use it | Aaron Patterson | 2013-10-10 | 1 | -4/+4 |
| | | | | | we don't need to walk back up the node's parents when we have the parent on the stack | ||||
* | pass the parent node to the construct method | Aaron Patterson | 2013-10-10 | 1 | -7/+6 |
| |