Commit Graph

213 Commits

Author SHA1 Message Date
Xavier Noria
cfeac38e2b implements a much faster auto EXPLAIN, closes #3843 [José Valim & Xavier Noria]
This commit vastly reduces the impact of auto
explain logging when enabled, while keeping
a negligible cost when disabled.

The first implementation was based on the idea
of subscribing to "sql.active_record" when
needed, and unsubscribing once done. This is
the idea behind AR::Relation#explain. Subscribe,
collect, unsubscribe.

But with the current implementation of notifications
unsubscribing is costly, because it wipes an internal
cache and that puts a penalty on the next event.

So we are switching to an approach where a long-running
subscriber is listening. Instead of collecting the
queries with a closure in a dedicated subscriber, now
we setup a thread local.

If the feature is disabled by setting the threshold
to nil, the subscriber will call a method that does
nothing. That's totally cheap.
2011-12-04 11:52:12 -08:00
Arun Agrawal
9a59475d4a indentation fix warning 2011-12-02 22:55:15 +05:30
Xavier Noria
36cc1f78eb revises some details in the previous explain patch 2011-12-02 09:19:13 -08:00
Xavier Noria
0306f82e0c implements automatic EXPLAIN logging for slow queries 2011-12-02 04:35:43 -08:00
Xavier Noria
1be9830d4d add the query to AR::Relation#explain output
Rationale: this is more readable if serveral queries
are involved in one call. Also, it will be possible
to let AR log EXPLAINs automatically in production
mode, where queries are not even around.
2011-11-25 14:29:34 -08:00
Xavier Noria
e7b7b44123 implements AR::Relation#explain
This is a first implementation, EXPLAIN is highly
dependent on the database and I have made some
compromises.

On one hand, the method allows you to run the most
common EXPLAIN and that's it. If you want EXPLAIN
ANALYZE in PostgreSQL you need to do it by hand.

On the other hand, I've tried to construct a string
as close as possible to the ones built by the
respective shells. The rationale is that IMO the
user should feel at home with the output and
recognize it at first sight. Per database.

I don't know whether this implementation is going
to work well. Let's see whether people like it.
2011-11-05 18:30:19 -07:00
Jon Leighton
562583c766 Add ActiveRecord::Relation#uniq for toggling DISTINCT in the SQL query 2011-11-05 16:22:18 +00:00
Jon Leighton
64747654ca Revert "Raise error on unknown primary key."
This reverts commit ee2be435b1.
2011-10-05 20:21:21 +01:00
Jon Leighton
ee2be435b1 Raise error on unknown primary key.
If we don't have a primary key when we ask for it, it's better to fail
fast. Fixes GH #2307.
2011-10-05 01:11:40 +01:00
Jon Leighton
11870117c6 Rename first_or_new to first_or_initialize.
For consistency with find_or_initialize_by. Also remove first_or_build
alias.
2011-09-13 19:09:01 +01:00
Andrés Mejía
72317883ed Using more precise method signatures for AR::Relation#first_or_create family of methods. 2011-09-06 02:45:54 -05:00
Andrés Mejía
d03aff7f64 Adding first example with no arguments to AR::Relation#first_or_create and removing examples that create several users at the same time (this is confusing and not really helpful). 2011-09-06 02:02:28 -05:00
Andrés Mejía
84dad446c6 Adding first_or_create, first_or_create!, first_or_new and first_or_build to Active Record.
This let's you write things like:

    User.where(:first_name => "Scarlett").first_or_create!(:last_name => "Johansson", :hot => true)

Related to #2420.
2011-08-30 16:33:37 -05:00
Jon Leighton
fe0ec85541 Refactor building the update manager 2011-08-15 23:10:15 +01:00
Jon Leighton
128d006242 Support updates with joins. Fixes #522. 2011-08-15 23:10:15 +01:00
Jon Leighton
7db90aa7c7 Make it the responsibility of the connection to hold onto an ARel visitor for generating SQL. This improves the code architecture generally, and solves some problems with marshalling. Adapter authors please take note: you now need to define an Adapter.visitor_for method, but it degrades gracefully with a deprecation warning for now. 2011-08-08 23:28:23 +01:00
thedarkone
10863580aa Bring back the ability to provide :order for update_all. 2011-07-25 13:33:44 +02:00
Jon Leighton
111968d402 Foo.joins(:bar).includes(:bar) should result in a single query with :bar as a join. Related: #1873. 2011-07-09 11:39:04 +01:00
Akira Matsuda
49bf8597e6 Use Enumerable#with_index. We're on Ruby > 1.8.7 2011-07-08 21:38:02 +09:00
Dmitriy Kiriyenko
f1553731ed Add require ActiveSupport delegation to ActiveRecord::Relation class. 2011-07-07 17:32:18 +03:00
Aaron Patterson
997aed24be default create_with_value to a hash so we can eliminate conditionals, add test surrounding create_with(nil) behavior 2011-06-27 14:18:49 -07:00
Brian Mathiyakom
1e43bd9f35 Fix issue #1272
Set reverse_order_value when asked to reverse_order().
Do the actual reversal in build_arel.
2011-06-01 18:29:29 +01:00
Hemant Kumar
ed1a0672ab delegate connection and column_hash calls directly to model 2011-05-28 03:00:11 +05:30
Xavier Noria
00e1d0832e Merge branch 'master' of git://github.com/lifo/docrails
Conflicts:
	actionmailer/lib/action_mailer/base.rb
	activesupport/lib/active_support/core_ext/kernel/requires.rb
2011-05-25 22:48:47 +02:00
Jon Leighton
c69111ba5f Fix infinite recursion where a lazy default scope references a scope. Fixes #1264. 2011-05-25 00:08:14 +01:00
Jon Leighton
a000ff7a50 Ensure that the surrounding code in Relation#to_a respects the default_scope (as well as having Relation#arel respect the default scope). Fixes #1233. 2011-05-24 23:29:44 +01:00
Sebastian Martinez
0034b7822d Remove extra white spaces on ActiveRecord docs. 2011-05-23 20:58:25 -03:00
Aaron Patterson
1d7c0336ef using bind parameters for updates 2011-04-30 17:27:46 -07:00
Aaron Patterson
f1df6b2dce postgresql supports prepare statement deletes 2011-04-29 11:09:37 -07:00
Ken Collins
35d0b6029f Use existing #empty_insert_statement_value for an insert with no columns. 2011-04-24 12:52:28 -04:00
Ken Collins
bc50c1cb02 The #substitute_at gets an ActiveRecord::ConnectionAdapters::Column in #insert to match replacement in #exec_query. 2011-04-23 00:15:33 +08:00
Aaron Patterson
9951af0289 sort insert columns for better cache hits 2011-04-14 14:26:57 -07:00
Aaron Patterson
12ae92216b refactoring inserts to use the same method on the connection 2011-04-14 13:37:40 -07:00
Aaron Patterson
8571facea3 insert statements are prepared, but values are not escaped properly 2011-04-14 13:37:39 -07:00
Jon Leighton
788bd30859 ActiveRecord::Base.scopes hash is not needed 2011-04-12 19:46:04 -07:00
Jon Leighton
8572ae6671 Evaluate default scopes at the last possible moment in order to avoid problems with default scopes getting included into other scopes and then being unable to remove the default part via unscoped. 2011-04-12 19:46:04 -07:00
Jon Leighton
5740d4ec0c Deprecated support for passing hashes and relations to default_scope, in favour of defining a 'default_scope' class method in the model. See the CHANGELOG for more details. 2011-04-12 19:46:04 -07:00
Emilio Tagua
b35617235d Use IM when trying to load records using ID.
Signed-off-by: José Valim <jose.valim@gmail.com>
2011-04-04 10:48:12 +02:00
Andrew White
555d016389 Quote find_in_batches ORDER BY clause [#6620 state:resolved] 2011-03-29 17:24:55 +01:00
Aaron Patterson
15d3cc21f4 pushing id insertion and prefetch primary keys down to Relation#insert 2011-03-22 09:18:01 -07:00
Chris Oliver
015192560b Fixed a bug when empty? was called on a grouped Relation that wasn't loaded
[#5829 state:resolved]

Signed-off-by: Andrew White <andyw@pixeltrix.co.uk>
2011-03-12 22:31:21 +00:00
Jon Leighton
532f915037 Referencing a table via the ON condition in a join should force that table to be eager-loaded via a JOIN rather than via subsequent queries. 2011-03-07 08:51:17 -08:00
Jon Leighton
d90b4e2615 Rewrote AssociationPreload. 2011-02-28 22:12:34 +00:00
Aaron Patterson
8fc54a2e81 only take the limit if there is a limit to take 2011-02-25 14:24:05 -08:00
Aaron Patterson
4bd8d2607c Relation will delegate to AR::Base which already uses the Dynamic finders, so eliminate duplicate calls 2011-02-22 11:07:51 -08:00
Rodrigo Navarro
62fd334684 Adding new examples for update_all method 2011-02-20 22:22:52 -03:00
Rodrigo Navarro
4da0157aaf Adding examples 2011-02-20 22:03:29 -03:00
Emilio Tagua
8ee0b44148 Merge remote branch 'rails/master' into identity_map
Conflicts:
	activerecord/examples/performance.rb
	activerecord/lib/active_record/association_preload.rb
	activerecord/lib/active_record/associations.rb
	activerecord/lib/active_record/associations/association_proxy.rb
	activerecord/lib/active_record/autosave_association.rb
	activerecord/lib/active_record/base.rb
	activerecord/lib/active_record/nested_attributes.rb
	activerecord/test/cases/relations_test.rb
2011-02-15 12:01:04 -03:00
Aaron Patterson
1c6f4562d7 primary keys should not be cleared on cache clear, fixing oracle tests 2011-02-08 16:01:16 -08:00
Jon Leighton
2120da7f73 ActiveRecord::Relation#primary_key should return a string, just like ActiveRecord::Base.primary_key does. 2011-01-03 16:24:32 -08:00