From d43a4e9fc1316fc9eb8ff087c52c7ca7a475c041 Mon Sep 17 00:00:00 2001 From: Nick Kallen Date: Sun, 6 Jan 2008 00:32:17 -0800 Subject: integration spec is persuasive, hopefully --- lib/sql_algebra.rb | 2 + lib/sql_algebra/extensions/base.rb | 54 +- lib/sql_algebra/extensions/hash.rb | 7 + lib/sql_algebra/relations/relation.rb | 15 +- .../sql_builder/equals_condition_builder.rb | 2 +- lib/sql_algebra/sql_builder/order_builder.rb | 2 +- spec/integration/debug.log | 1581 -------------------- spec/integration/scratch_spec.rb | 246 ++- spec/spec_helper.rb | 2 + spec/sql_builder/conditions_spec.rb | 2 +- spec/sql_builder/select_builder_spec.rb | 2 +- 11 files changed, 287 insertions(+), 1628 deletions(-) create mode 100644 lib/sql_algebra/extensions/hash.rb diff --git a/lib/sql_algebra.rb b/lib/sql_algebra.rb index 475bb23138..fbd053541c 100644 --- a/lib/sql_algebra.rb +++ b/lib/sql_algebra.rb @@ -34,6 +34,8 @@ require 'sql_algebra/predicates/match_predicate' require 'sql_algebra/extensions/range' require 'sql_algebra/extensions/object' require 'sql_algebra/extensions/array' +require 'sql_algebra/extensions/base' +require 'sql_algebra/extensions/hash' require 'sql_algebra/sql_builder/sql_builder' require 'sql_algebra/sql_builder/select_builder' diff --git a/lib/sql_algebra/extensions/base.rb b/lib/sql_algebra/extensions/base.rb index 0143caf23d..0dbdef703f 100644 --- a/lib/sql_algebra/extensions/base.rb +++ b/lib/sql_algebra/extensions/base.rb @@ -1,15 +1,47 @@ class ActiveRecord::Base - def self.bring_forth(record, includes = []) - object = cache.get(record % klass.primary_key) { Klass.instantiate(record % Klass.attributes) } - includes.each do |include| - case include - when Symbol - object.send(association = include).bring_forth(record) - when Hash - include.each do |association, nested_associations| - object.send(association).bring_forth(record, nested_associations) - end - end + class << self + def cache + @identity_map ||= IdentityMap.new end + + def relation + @relation ||= TableRelation.new(table_name) + end + end + + class IdentityMap + def initialize + @map = {} + end + + def get(record, &block) + @map[record] ||= yield + end + end +end + +class ActiveRecord::Associations::BelongsToAssociation + def instantiate(record, joins = []) + @target = proxy_reflection.klass.instantiate(record, joins) + loaded + end + + # this basically disables belongs_to from loading themselves + def reload + @target = 'hack' + end +end + +class ActiveRecord::Associations::AssociationCollection + def instantiate(record, joins = []) + @target << proxy_reflection.klass.instantiate(record, joins) + loaded # technically, this isn't true. doesn't matter though + end +end + +class ActiveRecord::Associations::HasManyThroughAssociation + def instantiate(record, joins = []) + @target << proxy_reflection.klass.instantiate(record, joins) + loaded # again, not really true. end end \ No newline at end of file diff --git a/lib/sql_algebra/extensions/hash.rb b/lib/sql_algebra/extensions/hash.rb new file mode 100644 index 0000000000..c83ee0d04f --- /dev/null +++ b/lib/sql_algebra/extensions/hash.rb @@ -0,0 +1,7 @@ +class Hash + def alias(&block) + inject({}) do |aliased, (key, value)| + aliased.merge(yield(key) => value) + end + end +end \ No newline at end of file diff --git a/lib/sql_algebra/relations/relation.rb b/lib/sql_algebra/relations/relation.rb index 13742cb570..8efe0c7d9f 100644 --- a/lib/sql_algebra/relations/relation.rb +++ b/lib/sql_algebra/relations/relation.rb @@ -1,4 +1,17 @@ class Relation + module Iteration + include Enumerable + + def each(&block) + connection.select_all(to_s).each(&block) + end + + def first + connection.select_one(to_s) + end + end + include Iteration + module Operations def <=>(other) InnerJoinOperation.new(self, other) @@ -60,7 +73,7 @@ class Relation end end delegate :to_s, :to => :to_sql - + protected def attributes; [] end def joins; [] end diff --git a/lib/sql_algebra/sql_builder/equals_condition_builder.rb b/lib/sql_algebra/sql_builder/equals_condition_builder.rb index 70067c20ca..cfa919c34c 100644 --- a/lib/sql_algebra/sql_builder/equals_condition_builder.rb +++ b/lib/sql_algebra/sql_builder/equals_condition_builder.rb @@ -5,7 +5,7 @@ class EqualsConditionBuilder < SqlBuilder end def column(table, column, aliaz = nil) - @operands << (aliaz ? quote(aliaz) : "#{quote_table_name(table)}.#{quote_column_name(column)}") + @operands << "#{quote_table_name(table)}.#{quote_column_name(column)}" end def value(value) diff --git a/lib/sql_algebra/sql_builder/order_builder.rb b/lib/sql_algebra/sql_builder/order_builder.rb index 43f705faf0..66a8cfdba9 100644 --- a/lib/sql_algebra/sql_builder/order_builder.rb +++ b/lib/sql_algebra/sql_builder/order_builder.rb @@ -5,7 +5,7 @@ class OrderBuilder < SqlBuilder end def column(table, column, aliaz = nil) - @orders << (aliaz ? quote(aliaz) : "#{quote_table_name(table)}.#{quote_column_name(column)}") + @orders << "#{quote_table_name(table)}.#{quote_column_name(column)}" end def to_s diff --git a/spec/integration/debug.log b/spec/integration/debug.log index 9b5b08cc20..e69de29bb2 100644 --- a/spec/integration/debug.log +++ b/spec/integration/debug.log @@ -1,1581 +0,0 @@ -# Logfile created on Tue Jan 01 18:37:24 -0800 2008 by logger.rb/1.5.2.9 - SQL (0.000147) SET SQL_AUTO_IS_NULL=0 - SQL (0.010719) SHOW FIELDS FROM `users` - SQL (0.002219) SHOW FIELDS FROM `photos` - SQL (0.001538) SHOW FIELDS FROM `users` - SQL (0.002551) SHOW FIELDS FROM `photos` - SQL (0.001835) SHOW FIELDS FROM `cameras` - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010748) SHOW FIELDS FROM `users` - SQL (0.002223) SHOW FIELDS FROM `photos` - SQL (0.002938) SHOW FIELDS FROM `users` - SQL (0.002466) SHOW FIELDS FROM `photos` - SQL (0.001493) SHOW FIELDS FROM `cameras` - SQL (0.000116) SET SQL_AUTO_IS_NULL=0 - SQL (0.010722) SHOW FIELDS FROM `users` - SQL (0.002196) SHOW FIELDS FROM `photos` - SQL (0.001528) SHOW FIELDS FROM `users` - SQL (0.001373) SHOW FIELDS FROM `photos` - SQL (0.001372) SHOW FIELDS FROM `cameras` - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.001599) SHOW FIELDS FROM `users` - SQL (0.012868) SHOW FIELDS FROM `photos` - SQL (0.001681) SHOW FIELDS FROM `users` - SQL (0.002253) SHOW FIELDS FROM `photos` - SQL (0.002186) SHOW FIELDS FROM `cameras` - SQL (0.000147) SET SQL_AUTO_IS_NULL=0 - SQL (0.010737) SHOW FIELDS FROM `users` - SQL (0.002277) SHOW FIELDS FROM `photos` - SQL (0.001517) SHOW FIELDS FROM `users` - SQL (0.001368) SHOW FIELDS FROM `photos` - SQL (0.001481) SHOW FIELDS FROM `cameras` - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010719) SHOW FIELDS FROM `users` - SQL (0.002651) SHOW FIELDS FROM `photos` - SQL (0.001464) SHOW FIELDS FROM `users` - SQL (0.001504) SHOW FIELDS FROM `photos` - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010820) SHOW FIELDS FROM `users` - SQL (0.002194) SHOW FIELDS FROM `photos` - SQL (0.001565) SHOW FIELDS FROM `users` - SQL (0.001282) SHOW FIELDS FROM `photos` - SQL (0.000147) SET SQL_AUTO_IS_NULL=0 - SQL (0.010719) SHOW FIELDS FROM `users` - SQL (0.002103) SHOW FIELDS FROM `photos` - SQL (0.001468) SHOW FIELDS FROM `users` - SQL (0.001526) SHOW FIELDS FROM `photos` - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010648) SHOW FIELDS FROM `users` - SQL (0.002458) SHOW FIELDS FROM `photos` - SQL (0.001525) SHOW FIELDS FROM `users` - SQL (0.001571) SHOW FIELDS FROM `photos` - SQL (0.001274) SHOW FIELDS FROM `users` - SQL (0.001527) SHOW FIELDS FROM `photos` - SQL (0.000130) SET SQL_AUTO_IS_NULL=0 - SQL (0.010705) SHOW FIELDS FROM `users` - SQL (0.002444) SHOW FIELDS FROM `photos` - SQL (0.001608) SHOW FIELDS FROM `users` - SQL (0.001488) SHOW FIELDS FROM `photos` - SQL (0.001462) SHOW FIELDS FROM `users` - SQL (0.001492) SHOW FIELDS FROM `photos` - SQL (0.015956) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.001676) SHOW TABLES - User Columns (0.001593) SHOW FIELDS FROM `users` - SQL (0.000144) SET SQL_AUTO_IS_NULL=0 - SQL (0.010771) SHOW FIELDS FROM `users` - SQL (0.002480) SHOW FIELDS FROM `photos` - SQL (0.001474) SHOW FIELDS FROM `users` - SQL (0.001357) SHOW FIELDS FROM `photos` - SQL (0.011769) SHOW FIELDS FROM `users` - SQL (0.001586) SHOW FIELDS FROM `photos` - SQL (0.000232) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000120) SET SQL_AUTO_IS_NULL=0 - SQL (0.010804) SHOW FIELDS FROM `users` - SQL (0.002188) SHOW FIELDS FROM `photos` - SQL (0.001478) SHOW FIELDS FROM `users` - SQL (0.001550) SHOW FIELDS FROM `photos` - SQL (0.001413) SHOW FIELDS FROM `users` - SQL (0.001515) SHOW FIELDS FROM `photos` - SQL (0.000251) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000147) SET SQL_AUTO_IS_NULL=0 - SQL (0.010826) SHOW FIELDS FROM `users` - SQL (0.002353) SHOW FIELDS FROM `photos` - SQL (0.001500) SHOW FIELDS FROM `users` - SQL (0.001522) SHOW FIELDS FROM `photos` - SQL (0.001438) SHOW FIELDS FROM `users` - SQL (0.001436) SHOW FIELDS FROM `photos` - SQL (0.000266) SELECT * -FROM users -WHERE users.id = 1 - User Columns (0.001396) SHOW FIELDS FROM `users` - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010772) SHOW FIELDS FROM `users` - SQL (0.002268) SHOW FIELDS FROM `photos` - SQL (0.001566) SHOW FIELDS FROM `users` - SQL (0.001390) SHOW FIELDS FROM `photos` - SQL (0.001466) SHOW FIELDS FROM `users` - SQL (0.001600) SHOW FIELDS FROM `photos` - SQL (0.000247) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010742) SHOW FIELDS FROM `users` - SQL (0.002382) SHOW FIELDS FROM `photos` - SQL (0.001490) SHOW FIELDS FROM `users` - SQL (0.001505) SHOW FIELDS FROM `photos` - SQL (0.001846) SHOW FIELDS FROM `users` - SQL (0.001491) SHOW FIELDS FROM `photos` - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010798) SHOW FIELDS FROM `users` - SQL (0.002447) SHOW FIELDS FROM `photos` - SQL (0.001557) SHOW FIELDS FROM `users` - SQL (0.001387) SHOW FIELDS FROM `photos` - SQL (0.001469) SHOW FIELDS FROM `users` - SQL (0.001394) SHOW FIELDS FROM `photos` - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010727) SHOW FIELDS FROM `users` - SQL (0.002213) SHOW FIELDS FROM `photos` - SQL (0.001491) SHOW FIELDS FROM `users` - SQL (0.001407) SHOW FIELDS FROM `photos` - SQL (0.001457) SHOW FIELDS FROM `users` - SQL (0.001529) SHOW FIELDS FROM `photos` - SQL (0.000247) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000320) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000135) SET SQL_AUTO_IS_NULL=0 - SQL (0.010663) SHOW FIELDS FROM `users` - SQL (0.002319) SHOW FIELDS FROM `photos` - SQL (0.001467) SHOW FIELDS FROM `users` - SQL (0.001319) SHOW FIELDS FROM `photos` - SQL (0.010583) SHOW FIELDS FROM `users` - SQL (0.001805) SHOW FIELDS FROM `photos` - SQL (0.000290) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000271) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010733) SHOW FIELDS FROM `users` - SQL (0.002277) SHOW FIELDS FROM `photos` - SQL (0.001500) SHOW FIELDS FROM `users` - SQL (0.001387) SHOW FIELDS FROM `photos` - SQL (0.001421) SHOW FIELDS FROM `users` - SQL (0.001726) SHOW FIELDS FROM `photos` - SQL (0.000261) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000261) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - Photo Columns (0.001432) SHOW FIELDS FROM `photos` - SQL (0.000134) SET SQL_AUTO_IS_NULL=0 - SQL (0.010759) SHOW FIELDS FROM `users` - SQL (0.002287) SHOW FIELDS FROM `photos` - SQL (0.001424) SHOW FIELDS FROM `users` - SQL (0.001550) SHOW FIELDS FROM `photos` - SQL (0.001342) SHOW FIELDS FROM `cameras` - SQL (0.001545) SHOW FIELDS FROM `users` - SQL (0.001488) SHOW FIELDS FROM `photos` - SQL (0.000249) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000290) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000139) SET SQL_AUTO_IS_NULL=0 - SQL (0.010766) SHOW FIELDS FROM `users` - SQL (0.002183) SHOW FIELDS FROM `photos` - SQL (0.001465) SHOW FIELDS FROM `users` - SQL (0.001492) SHOW FIELDS FROM `photos` - SQL (0.012690) SHOW FIELDS FROM `cameras` - SQL (0.001591) SHOW FIELDS FROM `users` - SQL (0.001740) SHOW FIELDS FROM `photos` - SQL (0.000261) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000262) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000110) SET SQL_AUTO_IS_NULL=0 - SQL (0.010751) SHOW FIELDS FROM `users` - SQL (0.002343) SHOW FIELDS FROM `photos` - SQL (0.001476) SHOW FIELDS FROM `users` - SQL (0.001513) SHOW FIELDS FROM `photos` - SQL (0.001495) SHOW FIELDS FROM `cameras` - SQL (0.001569) SHOW FIELDS FROM `users` - SQL (0.001497) SHOW FIELDS FROM `photos` - SQL (0.000249) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.028671) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010774) SHOW FIELDS FROM `users` - SQL (0.002229) SHOW FIELDS FROM `photos` - SQL (0.001532) SHOW FIELDS FROM `users` - SQL (0.001526) SHOW FIELDS FROM `photos` - SQL (0.001463) SHOW FIELDS FROM `cameras` - SQL (0.001558) SHOW FIELDS FROM `users` - SQL (0.001479) SHOW FIELDS FROM `photos` - SQL (0.000253) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000248) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000141) SET SQL_AUTO_IS_NULL=0 - SQL (0.010731) SHOW FIELDS FROM `users` - SQL (0.002167) SHOW FIELDS FROM `photos` - SQL (0.001370) SHOW FIELDS FROM `users` - SQL (0.001523) SHOW FIELDS FROM `photos` - SQL (0.001275) SHOW FIELDS FROM `cameras` - SQL (0.001480) SHOW FIELDS FROM `users` - SQL (0.001193) SHOW FIELDS FROM `photos` - SQL (0.000228) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000228) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.011242) SHOW FIELDS FROM `users` - SQL (0.001695) SHOW FIELDS FROM `photos` - SQL (0.001744) SHOW FIELDS FROM `users` - SQL (0.001452) SHOW FIELDS FROM `photos` - SQL (0.001419) SHOW FIELDS FROM `cameras` - SQL (0.001378) SHOW FIELDS FROM `users` - SQL (0.002561) SHOW FIELDS FROM `photos` - SQL (0.000923) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000275) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000157) SET SQL_AUTO_IS_NULL=0 - SQL (0.010515) SHOW FIELDS FROM `users` - SQL (0.002311) SHOW FIELDS FROM `photos` - SQL (0.002045) SHOW FIELDS FROM `users` - SQL (0.001878) SHOW FIELDS FROM `photos` - SQL (0.001586) SHOW FIELDS FROM `cameras` - SQL (0.001397) SHOW FIELDS FROM `users` - SQL (0.001944) SHOW FIELDS FROM `photos` - SQL (0.000453) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000283) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010759) SHOW FIELDS FROM `users` - SQL (0.002066) SHOW FIELDS FROM `photos` - SQL (0.001582) SHOW FIELDS FROM `users` - SQL (0.001459) SHOW FIELDS FROM `photos` - SQL (0.001418) SHOW FIELDS FROM `cameras` - SQL (0.001367) SHOW FIELDS FROM `users` - SQL (0.001849) SHOW FIELDS FROM `photos` - SQL (0.001231) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000357) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010706) SHOW FIELDS FROM `users` - SQL (0.002375) SHOW FIELDS FROM `photos` - SQL (0.001616) SHOW FIELDS FROM `users` - SQL (0.001826) SHOW FIELDS FROM `photos` - SQL (0.001508) SHOW FIELDS FROM `cameras` - SQL (0.001638) SHOW FIELDS FROM `users` - SQL (0.001719) SHOW FIELDS FROM `photos` - SQL (0.001674) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000337) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000114) SET SQL_AUTO_IS_NULL=0 - SQL (0.010717) SHOW FIELDS FROM `users` - SQL (0.002698) SHOW FIELDS FROM `photos` - SQL (0.001432) SHOW FIELDS FROM `users` - SQL (0.001686) SHOW FIELDS FROM `photos` - SQL (0.001403) SHOW FIELDS FROM `cameras` - SQL (0.001809) SHOW FIELDS FROM `users` - SQL (0.001590) SHOW FIELDS FROM `photos` - SQL (0.000540) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000341) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010746) SHOW FIELDS FROM `users` - SQL (0.002455) SHOW FIELDS FROM `photos` - SQL (0.001483) SHOW FIELDS FROM `users` - SQL (0.001588) SHOW FIELDS FROM `photos` - SQL (0.001513) SHOW FIELDS FROM `cameras` - SQL (0.001247) SHOW FIELDS FROM `users` - SQL (0.001527) SHOW FIELDS FROM `photos` - SQL (0.000227) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000252) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000142) SET SQL_AUTO_IS_NULL=0 - SQL (0.010735) SHOW FIELDS FROM `users` - SQL (0.002400) SHOW FIELDS FROM `photos` - SQL (0.001299) SHOW FIELDS FROM `users` - SQL (0.001451) SHOW FIELDS FROM `photos` - SQL (0.001173) SHOW FIELDS FROM `cameras` - SQL (0.001530) SHOW FIELDS FROM `users` - SQL (0.001793) SHOW FIELDS FROM `photos` - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010758) SHOW FIELDS FROM `users` - SQL (0.002271) SHOW FIELDS FROM `photos` - SQL (0.001485) SHOW FIELDS FROM `users` - SQL (0.001578) SHOW FIELDS FROM `photos` - SQL (0.001492) SHOW FIELDS FROM `cameras` - SQL (0.001389) SHOW FIELDS FROM `users` - SQL (0.001391) SHOW FIELDS FROM `photos` - SQL (0.000249) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000170) SET SQL_AUTO_IS_NULL=0 - SQL (0.010733) SHOW FIELDS FROM `users` - SQL (0.002313) SHOW FIELDS FROM `photos` - SQL (0.001469) SHOW FIELDS FROM `users` - SQL (0.001593) SHOW FIELDS FROM `photos` - SQL (0.001511) SHOW FIELDS FROM `cameras` - SQL (0.001484) SHOW FIELDS FROM `users` - SQL (0.001478) SHOW FIELDS FROM `photos` - SQL (0.000232) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000148) SET SQL_AUTO_IS_NULL=0 - SQL (0.010796) SHOW FIELDS FROM `users` - SQL (0.001970) SHOW FIELDS FROM `photos` - SQL (0.001558) SHOW FIELDS FROM `users` - SQL (0.001440) SHOW FIELDS FROM `photos` - SQL (0.001354) SHOW FIELDS FROM `cameras` - SQL (0.001544) SHOW FIELDS FROM `users` - SQL (0.001405) SHOW FIELDS FROM `photos` - SQL (0.000239) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000111) SET SQL_AUTO_IS_NULL=0 - SQL (0.010751) SHOW FIELDS FROM `users` - SQL (0.002354) SHOW FIELDS FROM `photos` - SQL (0.001463) SHOW FIELDS FROM `users` - SQL (0.001588) SHOW FIELDS FROM `photos` - SQL (0.001505) SHOW FIELDS FROM `cameras` - SQL (0.001464) SHOW FIELDS FROM `users` - SQL (0.001509) SHOW FIELDS FROM `photos` - SQL (0.000235) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000133) SET SQL_AUTO_IS_NULL=0 - SQL (0.010651) SHOW FIELDS FROM `users` - SQL (0.002468) SHOW FIELDS FROM `photos` - SQL (0.001364) SHOW FIELDS FROM `users` - SQL (0.001503) SHOW FIELDS FROM `photos` - SQL (0.001543) SHOW FIELDS FROM `cameras` - SQL (0.001452) SHOW FIELDS FROM `users` - SQL (0.001445) SHOW FIELDS FROM `photos` - SQL (0.000228) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000147) SET SQL_AUTO_IS_NULL=0 - SQL (0.330787) SHOW FIELDS FROM `users` - SQL (0.002584) SHOW FIELDS FROM `photos` - SQL (0.001456) SHOW FIELDS FROM `users` - SQL (0.001621) SHOW FIELDS FROM `photos` - SQL (0.001475) SHOW FIELDS FROM `cameras` - SQL (0.001481) SHOW FIELDS FROM `users` - SQL (0.001552) SHOW FIELDS FROM `photos` - SQL (0.000226) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000144) SET SQL_AUTO_IS_NULL=0 - SQL (0.010706) SHOW FIELDS FROM `users` - SQL (0.002394) SHOW FIELDS FROM `photos` - SQL (0.001322) SHOW FIELDS FROM `users` - SQL (0.001656) SHOW FIELDS FROM `photos` - SQL (0.001495) SHOW FIELDS FROM `cameras` - SQL (0.001498) SHOW FIELDS FROM `users` - SQL (0.001510) SHOW FIELDS FROM `photos` - SQL (0.000222) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010785) SHOW FIELDS FROM `users` - SQL (0.002249) SHOW FIELDS FROM `photos` - SQL (0.001469) SHOW FIELDS FROM `users` - SQL (0.001410) SHOW FIELDS FROM `photos` - SQL (0.001666) SHOW FIELDS FROM `cameras` - SQL (0.001627) SHOW FIELDS FROM `users` - SQL (0.002215) SHOW FIELDS FROM `photos` - SQL (0.000942) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000149) SET SQL_AUTO_IS_NULL=0 - SQL (0.010774) SHOW FIELDS FROM `users` - SQL (0.001649) SHOW FIELDS FROM `photos` - SQL (0.001497) SHOW FIELDS FROM `users` - SQL (0.001457) SHOW FIELDS FROM `photos` - SQL (0.001345) SHOW FIELDS FROM `cameras` - SQL (0.001298) SHOW FIELDS FROM `users` - SQL (0.001849) SHOW FIELDS FROM `photos` - SQL (0.000967) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000143) SET SQL_AUTO_IS_NULL=0 - SQL (0.010724) SHOW FIELDS FROM `users` - SQL (0.002360) SHOW FIELDS FROM `photos` - SQL (0.001570) SHOW FIELDS FROM `users` - SQL (0.001733) SHOW FIELDS FROM `photos` - SQL (0.001487) SHOW FIELDS FROM `cameras` - SQL (0.001624) SHOW FIELDS FROM `users` - SQL (0.001840) SHOW FIELDS FROM `photos` - SQL (0.001080) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000148) SET SQL_AUTO_IS_NULL=0 - SQL (0.010885) SHOW FIELDS FROM `users` - SQL (0.002106) SHOW FIELDS FROM `photos` - SQL (0.001603) SHOW FIELDS FROM `users` - SQL (0.001575) SHOW FIELDS FROM `photos` - SQL (0.001529) SHOW FIELDS FROM `cameras` - SQL (0.001517) SHOW FIELDS FROM `users` - SQL (0.001556) SHOW FIELDS FROM `photos` - SQL (0.000260) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010689) SHOW FIELDS FROM `users` - SQL (0.002034) SHOW FIELDS FROM `photos` - SQL (0.001430) SHOW FIELDS FROM `users` - SQL (0.001590) SHOW FIELDS FROM `photos` - SQL (0.001434) SHOW FIELDS FROM `cameras` - SQL (0.001543) SHOW FIELDS FROM `users` - SQL (0.001597) SHOW FIELDS FROM `photos` - SQL (0.001103) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000143) SET SQL_AUTO_IS_NULL=0 - SQL (0.010735) SHOW FIELDS FROM `users` - SQL (0.002171) SHOW FIELDS FROM `photos` - SQL (0.001553) SHOW FIELDS FROM `users` - SQL (0.001586) SHOW FIELDS FROM `photos` - SQL (0.001520) SHOW FIELDS FROM `cameras` - SQL (0.001441) SHOW FIELDS FROM `users` - SQL (0.001560) SHOW FIELDS FROM `photos` - SQL (0.001796) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010772) SHOW FIELDS FROM `users` - SQL (0.002291) SHOW FIELDS FROM `photos` - SQL (0.001505) SHOW FIELDS FROM `users` - SQL (0.001466) SHOW FIELDS FROM `photos` - SQL (0.002032) SHOW FIELDS FROM `cameras` - SQL (0.001543) SHOW FIELDS FROM `users` - SQL (0.001434) SHOW FIELDS FROM `photos` - SQL (0.000147) SET SQL_AUTO_IS_NULL=0 - SQL (0.010845) SHOW FIELDS FROM `users` - SQL (0.002185) SHOW FIELDS FROM `photos` - SQL (0.001479) SHOW FIELDS FROM `users` - SQL (0.001551) SHOW FIELDS FROM `photos` - SQL (0.001459) SHOW FIELDS FROM `cameras` - SQL (0.001521) SHOW FIELDS FROM `users` - SQL (0.001392) SHOW FIELDS FROM `photos` - SQL (0.000222) SELECT photos.user_id, photos.camera_id, photos.id -FROM photos  - SQL (0.000246) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000136) SET SQL_AUTO_IS_NULL=0 - SQL (0.010662) SHOW FIELDS FROM `users` - SQL (0.002267) SHOW FIELDS FROM `photos` - SQL (0.001467) SHOW FIELDS FROM `users` - SQL (0.001437) SHOW FIELDS FROM `photos` - SQL (0.001355) SHOW FIELDS FROM `cameras` - SQL (0.001506) SHOW FIELDS FROM `users` - SQL (0.012944) SHOW FIELDS FROM `photos` - SQL (0.000256) SELECT * -FROM photos  - SQL (0.000271) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010682) SHOW FIELDS FROM `users` - SQL (0.002485) SHOW FIELDS FROM `photos` - SQL (0.001454) SHOW FIELDS FROM `users` - SQL (0.001588) SHOW FIELDS FROM `photos` - SQL (0.001480) SHOW FIELDS FROM `cameras` - SQL (0.001539) SHOW FIELDS FROM `users` - SQL (0.001735) SHOW FIELDS FROM `photos` - SQL (0.000111) SET SQL_AUTO_IS_NULL=0 - SQL (0.010744) SHOW FIELDS FROM `users` - SQL (0.002250) SHOW FIELDS FROM `photos` - SQL (0.001491) SHOW FIELDS FROM `users` - SQL (0.001534) SHOW FIELDS FROM `photos` - SQL (0.001499) SHOW FIELDS FROM `cameras` - SQL (0.001482) SHOW FIELDS FROM `users` - SQL (0.001496) SHOW FIELDS FROM `photos` - SQL (0.000165) SET SQL_AUTO_IS_NULL=0 - SQL (0.010840) SHOW FIELDS FROM `users` - SQL (0.002301) SHOW FIELDS FROM `photos` - SQL (0.001598) SHOW FIELDS FROM `users` - SQL (0.001456) SHOW FIELDS FROM `photos` - SQL (0.001241) SHOW FIELDS FROM `cameras` - SQL (0.001479) SHOW FIELDS FROM `users` - SQL (0.000887) SHOW FIELDS FROM `photos` - SQL (0.000137) SET SQL_AUTO_IS_NULL=0 - SQL (0.010721) SHOW FIELDS FROM `users` - SQL (0.002243) SHOW FIELDS FROM `photos` - SQL (0.001485) SHOW FIELDS FROM `users` - SQL (0.001592) SHOW FIELDS FROM `photos` - SQL (0.001519) SHOW FIELDS FROM `cameras` - SQL (0.001480) SHOW FIELDS FROM `users` - SQL (0.001534) SHOW FIELDS FROM `photos` - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010748) SHOW FIELDS FROM `users` - SQL (0.002303) SHOW FIELDS FROM `photos` - SQL (0.001459) SHOW FIELDS FROM `users` - SQL (0.001580) SHOW FIELDS FROM `photos` - SQL (0.001584) SHOW FIELDS FROM `cameras` - SQL (0.001507) SHOW FIELDS FROM `users` - SQL (0.001526) SHOW FIELDS FROM `photos` - SQL (0.000139) SET SQL_AUTO_IS_NULL=0 - SQL (0.001564) SHOW FIELDS FROM `users` - SQL (0.001517) SHOW FIELDS FROM `photos` - SQL (0.001405) SHOW FIELDS FROM `users` - SQL (0.001516) SHOW FIELDS FROM `photos` - SQL (0.001704) SHOW FIELDS FROM `cameras` - SQL (0.001583) SHOW FIELDS FROM `users` - SQL (0.001579) SHOW FIELDS FROM `photos` - SQL (0.000135) SET SQL_AUTO_IS_NULL=0 - SQL (0.010720) SHOW FIELDS FROM `users` - SQL (0.002156) SHOW FIELDS FROM `photos` - SQL (0.001639) SHOW FIELDS FROM `users` - SQL (0.001434) SHOW FIELDS FROM `photos` - SQL (0.001357) SHOW FIELDS FROM `cameras` - SQL (0.001513) SHOW FIELDS FROM `users` - SQL (0.001474) SHOW FIELDS FROM `photos` - SQL (0.000147) SET SQL_AUTO_IS_NULL=0 - SQL (0.010719) SHOW FIELDS FROM `users` - SQL (0.002256) SHOW FIELDS FROM `photos` - SQL (0.001531) SHOW FIELDS FROM `users` - SQL (0.001453) SHOW FIELDS FROM `photos` - SQL (0.001388) SHOW FIELDS FROM `cameras` - SQL (0.001494) SHOW FIELDS FROM `users` - SQL (0.001101) SHOW FIELDS FROM `photos` - SQL (0.000219) SELECT users.id -FROM users -WHERE users.id = 1 - SQL (0.000157) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.011477) SHOW FIELDS FROM `users` - SQL (0.002257) SHOW FIELDS FROM `photos` - SQL (0.001520) SHOW FIELDS FROM `users` - SQL (0.001410) SHOW FIELDS FROM `photos` - SQL (0.001383) SHOW FIELDS FROM `cameras` - SQL (0.001505) SHOW FIELDS FROM `users` - SQL (0.001462) SHOW FIELDS FROM `photos` - SQL (0.000222) SELECT users.id -FROM users -WHERE users.id = 1 - SQL (0.000197) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000148) SET SQL_AUTO_IS_NULL=0 - SQL (0.010701) SHOW FIELDS FROM `users` - SQL (0.002382) SHOW FIELDS FROM `photos` - SQL (0.001523) SHOW FIELDS FROM `users` - SQL (0.001558) SHOW FIELDS FROM `photos` - SQL (0.001494) SHOW FIELDS FROM `cameras` - SQL (0.001467) SHOW FIELDS FROM `users` - SQL (0.001516) SHOW FIELDS FROM `photos` - SQL (0.000129) SET SQL_AUTO_IS_NULL=0 - SQL (0.010711) SHOW FIELDS FROM `users` - SQL (0.002382) SHOW FIELDS FROM `photos` - SQL (0.001495) SHOW FIELDS FROM `users` - SQL (0.001445) SHOW FIELDS FROM `photos` - SQL (0.001363) SHOW FIELDS FROM `cameras` - SQL (0.001557) SHOW FIELDS FROM `users` - SQL (0.001433) SHOW FIELDS FROM `photos` - SQL (0.000000) Mysql::Error: Unknown column 'photos.id' in 'field list': SELECT photos.id -FROM users -WHERE users.id = 1 - SQL (0.000132) SET SQL_AUTO_IS_NULL=0 - SQL (0.010902) SHOW FIELDS FROM `users` - SQL (0.002079) SHOW FIELDS FROM `photos` - SQL (0.001455) SHOW FIELDS FROM `users` - SQL (0.001626) SHOW FIELDS FROM `photos` - SQL (0.012539) SHOW FIELDS FROM `cameras` - SQL (0.001557) SHOW FIELDS FROM `users` - SQL (0.001437) SHOW FIELDS FROM `photos` - SQL (0.000255) SELECT users.id -FROM users -WHERE users.id = 1 - SQL (0.000225) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000148) SET SQL_AUTO_IS_NULL=0 - SQL (0.010766) SHOW FIELDS FROM `users` - SQL (0.002370) SHOW FIELDS FROM `photos` - SQL (0.001453) SHOW FIELDS FROM `users` - SQL (0.001556) SHOW FIELDS FROM `photos` - SQL (0.001492) SHOW FIELDS FROM `cameras` - SQL (0.001243) SHOW FIELDS FROM `users` - SQL (0.001527) SHOW FIELDS FROM `photos` - SQL (0.000151) SET SQL_AUTO_IS_NULL=0 - SQL (0.010730) SHOW FIELDS FROM `users` - SQL (0.002308) SHOW FIELDS FROM `photos` - SQL (0.001489) SHOW FIELDS FROM `users` - SQL (0.001571) SHOW FIELDS FROM `photos` - SQL (0.001345) SHOW FIELDS FROM `cameras` - SQL (0.001456) SHOW FIELDS FROM `users` - SQL (0.001161) SHOW FIELDS FROM `photos` - SQL (0.000215) SELECT users.id -FROM users -WHERE users.id = 1 - SQL (0.000261) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000139) SET SQL_AUTO_IS_NULL=0 - SQL (0.010683) SHOW FIELDS FROM `users` - SQL (0.002298) SHOW FIELDS FROM `photos` - SQL (0.001478) SHOW FIELDS FROM `users` - SQL (0.001413) SHOW FIELDS FROM `photos` - SQL (0.001521) SHOW FIELDS FROM `cameras` - SQL (0.001462) SHOW FIELDS FROM `users` - SQL (0.001509) SHOW FIELDS FROM `photos` - SQL (0.001637) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000136) SET SQL_AUTO_IS_NULL=0 - SQL (0.010714) SHOW FIELDS FROM `users` - SQL (0.002255) SHOW FIELDS FROM `photos` - SQL (0.001471) SHOW FIELDS FROM `users` - SQL (0.001491) SHOW FIELDS FROM `photos` - SQL (0.001494) SHOW FIELDS FROM `cameras` - SQL (0.001537) SHOW FIELDS FROM `users` - SQL (0.001500) SHOW FIELDS FROM `photos` - SQL (0.000144) SET SQL_AUTO_IS_NULL=0 - SQL (0.010658) SHOW FIELDS FROM `users` - SQL (0.002047) SHOW FIELDS FROM `photos` - SQL (0.001307) SHOW FIELDS FROM `users` - SQL (0.001529) SHOW FIELDS FROM `photos` - SQL (0.001380) SHOW FIELDS FROM `cameras` - SQL (0.001558) SHOW FIELDS FROM `users` - SQL (0.000851) SHOW FIELDS FROM `photos` - SQL (0.000135) SET SQL_AUTO_IS_NULL=0 - SQL (0.010643) SHOW FIELDS FROM `users` - SQL (0.002531) SHOW FIELDS FROM `photos` - SQL (0.001449) SHOW FIELDS FROM `users` - SQL (0.001423) SHOW FIELDS FROM `photos` - SQL (0.001522) SHOW FIELDS FROM `cameras` - SQL (0.001515) SHOW FIELDS FROM `users` - SQL (0.001581) SHOW FIELDS FROM `photos` - SQL (0.000147) SET SQL_AUTO_IS_NULL=0 - SQL (0.010786) SHOW FIELDS FROM `users` - SQL (0.002348) SHOW FIELDS FROM `photos` - SQL (0.001476) SHOW FIELDS FROM `users` - SQL (0.001604) SHOW FIELDS FROM `photos` - SQL (0.001380) SHOW FIELDS FROM `cameras` - SQL (0.001484) SHOW FIELDS FROM `users` - SQL (0.001383) SHOW FIELDS FROM `photos` - SQL (0.000117) SET SQL_AUTO_IS_NULL=0 - SQL (0.010702) SHOW FIELDS FROM `users` - SQL (0.002339) SHOW FIELDS FROM `photos` - SQL (0.001304) SHOW FIELDS FROM `users` - SQL (0.001578) SHOW FIELDS FROM `photos` - SQL (0.001470) SHOW FIELDS FROM `cameras` - SQL (0.001524) SHOW FIELDS FROM `users` - SQL (0.001554) SHOW FIELDS FROM `photos` - SQL (0.000144) SET SQL_AUTO_IS_NULL=0 - SQL (0.010746) SHOW FIELDS FROM `users` - SQL (0.002433) SHOW FIELDS FROM `photos` - SQL (0.001489) SHOW FIELDS FROM `users` - SQL (0.001530) SHOW FIELDS FROM `photos` - SQL (0.001540) SHOW FIELDS FROM `cameras` - SQL (0.001528) SHOW FIELDS FROM `users` - SQL (0.001524) SHOW FIELDS FROM `photos` - SQL (0.000393) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000149) SET SQL_AUTO_IS_NULL=0 - SQL (0.010676) SHOW FIELDS FROM `users` - SQL (0.002224) SHOW FIELDS FROM `photos` - SQL (0.001456) SHOW FIELDS FROM `users` - SQL (0.001773) SHOW FIELDS FROM `photos` - SQL (0.001509) SHOW FIELDS FROM `cameras` - SQL (0.001473) SHOW FIELDS FROM `users` - SQL (0.001511) SHOW FIELDS FROM `photos` - SQL (0.000274) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010825) SHOW FIELDS FROM `users` - SQL (0.002358) SHOW FIELDS FROM `photos` - SQL (0.001492) SHOW FIELDS FROM `users` - SQL (0.001578) SHOW FIELDS FROM `photos` - SQL (0.001702) SHOW FIELDS FROM `cameras` - SQL (0.001495) SHOW FIELDS FROM `users` - SQL (0.001778) SHOW FIELDS FROM `photos` - SQL (0.000348) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000113) SET SQL_AUTO_IS_NULL=0 - SQL (0.010701) SHOW FIELDS FROM `users` - SQL (0.002380) SHOW FIELDS FROM `photos` - SQL (0.001329) SHOW FIELDS FROM `users` - SQL (0.001403) SHOW FIELDS FROM `photos` - SQL (0.001409) SHOW FIELDS FROM `cameras` - SQL (0.001458) SHOW FIELDS FROM `users` - SQL (0.001486) SHOW FIELDS FROM `photos` - SQL (0.000562) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000134) SET SQL_AUTO_IS_NULL=0 - SQL (0.010761) SHOW FIELDS FROM `users` - SQL (0.002300) SHOW FIELDS FROM `photos` - SQL (0.001565) SHOW FIELDS FROM `users` - SQL (0.001514) SHOW FIELDS FROM `photos` - SQL (0.001377) SHOW FIELDS FROM `cameras` - SQL (0.001553) SHOW FIELDS FROM `users` - SQL (0.001454) SHOW FIELDS FROM `photos` - SQL (0.000319) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000156) SET SQL_AUTO_IS_NULL=0 - SQL (0.010664) SHOW FIELDS FROM `users` - SQL (0.002495) SHOW FIELDS FROM `photos` - SQL (0.001454) SHOW FIELDS FROM `users` - SQL (0.001569) SHOW FIELDS FROM `photos` - SQL (0.001277) SHOW FIELDS FROM `cameras` - SQL (0.001250) SHOW FIELDS FROM `users` - SQL (0.001543) SHOW FIELDS FROM `photos` - SQL (0.000263) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000143) SET SQL_AUTO_IS_NULL=0 - SQL (0.010756) SHOW FIELDS FROM `users` - SQL (0.002397) SHOW FIELDS FROM `photos` - SQL (0.001731) SHOW FIELDS FROM `users` - SQL (0.001443) SHOW FIELDS FROM `photos` - SQL (0.001366) SHOW FIELDS FROM `cameras` - SQL (0.001472) SHOW FIELDS FROM `users` - SQL (0.001420) SHOW FIELDS FROM `photos` - SQL (0.000148) SET SQL_AUTO_IS_NULL=0 - SQL (0.010705) SHOW FIELDS FROM `users` - SQL (0.002368) SHOW FIELDS FROM `photos` - SQL (0.001556) SHOW FIELDS FROM `users` - SQL (0.001472) SHOW FIELDS FROM `photos` - SQL (0.001455) SHOW FIELDS FROM `cameras` - SQL (0.001475) SHOW FIELDS FROM `users` - SQL (0.002127) SHOW FIELDS FROM `photos` - SQL (0.001414) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010742) SHOW FIELDS FROM `users` - SQL (0.002380) SHOW FIELDS FROM `photos` - SQL (0.001634) SHOW FIELDS FROM `users` - SQL (0.001587) SHOW FIELDS FROM `photos` - SQL (0.001452) SHOW FIELDS FROM `cameras` - SQL (0.001454) SHOW FIELDS FROM `users` - SQL (0.001514) SHOW FIELDS FROM `photos` - SQL (0.000135) SET SQL_AUTO_IS_NULL=0 - SQL (0.010668) SHOW FIELDS FROM `users` - SQL (0.002191) SHOW FIELDS FROM `photos` - SQL (0.001521) SHOW FIELDS FROM `users` - SQL (0.001418) SHOW FIELDS FROM `photos` - SQL (0.001330) SHOW FIELDS FROM `cameras` - SQL (0.001474) SHOW FIELDS FROM `users` - SQL (0.001406) SHOW FIELDS FROM `photos` - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010693) SHOW FIELDS FROM `users` - SQL (0.002296) SHOW FIELDS FROM `photos` - SQL (0.001485) SHOW FIELDS FROM `users` - SQL (0.001604) SHOW FIELDS FROM `photos` - SQL (0.001479) SHOW FIELDS FROM `cameras` - SQL (0.001660) SHOW FIELDS FROM `users` - SQL (0.001632) SHOW FIELDS FROM `photos` - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010678) SHOW FIELDS FROM `users` - SQL (0.002302) SHOW FIELDS FROM `photos` - SQL (0.001501) SHOW FIELDS FROM `users` - SQL (0.001360) SHOW FIELDS FROM `photos` - SQL (0.001353) SHOW FIELDS FROM `cameras` - SQL (0.001562) SHOW FIELDS FROM `users` - SQL (0.001542) SHOW FIELDS FROM `photos` - SQL (0.000147) SET SQL_AUTO_IS_NULL=0 - SQL (0.010704) SHOW FIELDS FROM `users` - SQL (0.002335) SHOW FIELDS FROM `photos` - SQL (0.001425) SHOW FIELDS FROM `users` - SQL (0.001468) SHOW FIELDS FROM `photos` - SQL (0.001469) SHOW FIELDS FROM `cameras` - SQL (0.001573) SHOW FIELDS FROM `users` - SQL (0.001489) SHOW FIELDS FROM `photos` - SQL (0.000148) SET SQL_AUTO_IS_NULL=0 - SQL (0.010787) SHOW FIELDS FROM `users` - SQL (0.002303) SHOW FIELDS FROM `photos` - SQL (0.001529) SHOW FIELDS FROM `users` - SQL (0.001689) SHOW FIELDS FROM `photos` - SQL (0.001503) SHOW FIELDS FROM `cameras` - SQL (0.001463) SHOW FIELDS FROM `users` - SQL (0.001487) SHOW FIELDS FROM `photos` - SQL (0.000149) SET SQL_AUTO_IS_NULL=0 - SQL (0.010737) SHOW FIELDS FROM `users` - SQL (0.002412) SHOW FIELDS FROM `photos` - SQL (0.001487) SHOW FIELDS FROM `users` - SQL (0.001547) SHOW FIELDS FROM `photos` - SQL (0.001571) SHOW FIELDS FROM `cameras` - SQL (0.001482) SHOW FIELDS FROM `users` - SQL (0.001395) SHOW FIELDS FROM `photos` - SQL (0.000481) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010918) SHOW FIELDS FROM `users` - SQL (0.001957) SHOW FIELDS FROM `photos` - SQL (0.001485) SHOW FIELDS FROM `users` - SQL (0.001498) SHOW FIELDS FROM `photos` - SQL (0.001374) SHOW FIELDS FROM `cameras` - SQL (0.001461) SHOW FIELDS FROM `users` - SQL (0.001923) SHOW FIELDS FROM `photos` - SQL (0.000233) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000232) SELECT photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.011208) SHOW FIELDS FROM `users` - SQL (0.002172) SHOW FIELDS FROM `photos` - SQL (0.001453) SHOW FIELDS FROM `users` - SQL (0.001526) SHOW FIELDS FROM `photos` - SQL (0.001666) SHOW FIELDS FROM `cameras` - SQL (0.001273) SHOW FIELDS FROM `users` - SQL (0.001845) SHOW FIELDS FROM `photos` - SQL (0.000270) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000133) SET SQL_AUTO_IS_NULL=0 - SQL (0.010785) SHOW FIELDS FROM `users` - SQL (0.002207) SHOW FIELDS FROM `photos` - SQL (0.001480) SHOW FIELDS FROM `users` - SQL (0.001563) SHOW FIELDS FROM `photos` - SQL (0.001459) SHOW FIELDS FROM `cameras` - SQL (0.001206) SHOW FIELDS FROM `users` - SQL (0.001250) SHOW FIELDS FROM `photos` - SQL (0.000224) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000227) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000192) SET SQL_AUTO_IS_NULL=0 - SQL (0.010546) SHOW FIELDS FROM `users` - SQL (0.002397) SHOW FIELDS FROM `photos` - SQL (0.002065) SHOW FIELDS FROM `users` - SQL (0.001381) SHOW FIELDS FROM `photos` - SQL (0.000979) SHOW FIELDS FROM `cameras` - SQL (0.001410) SHOW FIELDS FROM `users` - SQL (0.001516) SHOW FIELDS FROM `photos` - SQL (0.000216) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000240) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010781) SHOW FIELDS FROM `users` - SQL (0.002045) SHOW FIELDS FROM `photos` - SQL (0.001462) SHOW FIELDS FROM `users` - SQL (0.001712) SHOW FIELDS FROM `photos` - SQL (0.001383) SHOW FIELDS FROM `cameras` - SQL (0.001934) SHOW FIELDS FROM `users` - SQL (0.001974) SHOW FIELDS FROM `photos` - SQL (0.000277) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000266) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010789) SHOW FIELDS FROM `users` - SQL (0.002174) SHOW FIELDS FROM `photos` - SQL (0.001549) SHOW FIELDS FROM `users` - SQL (0.001406) SHOW FIELDS FROM `photos` - SQL (0.001380) SHOW FIELDS FROM `cameras` - SQL (0.001590) SHOW FIELDS FROM `users` - SQL (0.001465) SHOW FIELDS FROM `photos` - SQL (0.000236) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000260) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000148) SET SQL_AUTO_IS_NULL=0 - SQL (0.010729) SHOW FIELDS FROM `users` - SQL (0.002288) SHOW FIELDS FROM `photos` - SQL (0.001373) SHOW FIELDS FROM `users` - SQL (0.001594) SHOW FIELDS FROM `photos` - SQL (0.001516) SHOW FIELDS FROM `cameras` - SQL (0.001470) SHOW FIELDS FROM `users` - SQL (0.001653) SHOW FIELDS FROM `photos` - SQL (0.000249) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000324) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010695) SHOW FIELDS FROM `users` - SQL (0.002188) SHOW FIELDS FROM `photos` - SQL (0.001450) SHOW FIELDS FROM `users` - SQL (0.001569) SHOW FIELDS FROM `photos` - SQL (0.001437) SHOW FIELDS FROM `cameras` - SQL (0.001780) SHOW FIELDS FROM `users` - SQL (0.002270) SHOW FIELDS FROM `photos` - SQL (0.001585) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000325) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000151) SET SQL_AUTO_IS_NULL=0 - SQL (0.010721) SHOW FIELDS FROM `users` - SQL (0.002947) SHOW FIELDS FROM `photos` - SQL (0.001515) SHOW FIELDS FROM `users` - SQL (0.001270) SHOW FIELDS FROM `photos` - SQL (0.001479) SHOW FIELDS FROM `cameras` - SQL (0.001428) SHOW FIELDS FROM `users` - SQL (0.001953) SHOW FIELDS FROM `photos` - SQL (0.000253) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000279) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010670) SHOW FIELDS FROM `users` - SQL (0.002111) SHOW FIELDS FROM `photos` - SQL (0.001460) SHOW FIELDS FROM `users` - SQL (0.001578) SHOW FIELDS FROM `photos` - SQL (0.001576) SHOW FIELDS FROM `cameras` - SQL (0.001497) SHOW FIELDS FROM `users` - SQL (0.001326) SHOW FIELDS FROM `photos` - SQL (0.000235) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000250) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.001613) SHOW FIELDS FROM `users` - SQL (0.001535) SHOW FIELDS FROM `photos` - SQL (0.001418) SHOW FIELDS FROM `users` - SQL (0.001545) SHOW FIELDS FROM `photos` - SQL (0.001536) SHOW FIELDS FROM `cameras` - SQL (0.001527) SHOW FIELDS FROM `users` - SQL (0.001497) SHOW FIELDS FROM `photos` - SQL (0.000230) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000227) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000134) SET SQL_AUTO_IS_NULL=0 - SQL (0.011304) SHOW FIELDS FROM `users` - SQL (0.002381) SHOW FIELDS FROM `photos` - SQL (0.001508) SHOW FIELDS FROM `users` - SQL (0.001665) SHOW FIELDS FROM `photos` - SQL (0.001498) SHOW FIELDS FROM `cameras` - SQL (0.001503) SHOW FIELDS FROM `users` - SQL (0.001514) SHOW FIELDS FROM `photos` - SQL (0.000225) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000231) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000134) SET SQL_AUTO_IS_NULL=0 - SQL (0.010747) SHOW FIELDS FROM `users` - SQL (0.002111) SHOW FIELDS FROM `photos` - SQL (0.001510) SHOW FIELDS FROM `users` - SQL (0.001581) SHOW FIELDS FROM `photos` - SQL (0.001428) SHOW FIELDS FROM `cameras` - SQL (0.001507) SHOW FIELDS FROM `users` - SQL (0.001808) SHOW FIELDS FROM `photos` - SQL (0.000247) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000237) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010702) SHOW FIELDS FROM `users` - SQL (0.002320) SHOW FIELDS FROM `photos` - SQL (0.001504) SHOW FIELDS FROM `users` - SQL (0.001589) SHOW FIELDS FROM `photos` - SQL (0.001555) SHOW FIELDS FROM `cameras` - SQL (0.002636) SHOW FIELDS FROM `users` - SQL (0.001766) SHOW FIELDS FROM `photos` - SQL (0.000239) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000281) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000115) SET SQL_AUTO_IS_NULL=0 - SQL (0.011377) SHOW FIELDS FROM `users` - SQL (0.002266) SHOW FIELDS FROM `photos` - SQL (0.001512) SHOW FIELDS FROM `users` - SQL (0.001553) SHOW FIELDS FROM `photos` - SQL (0.001686) SHOW FIELDS FROM `cameras` - SQL (0.001487) SHOW FIELDS FROM `users` - SQL (0.001520) SHOW FIELDS FROM `photos` - SQL (0.000223) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000233) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000133) SET SQL_AUTO_IS_NULL=0 - SQL (0.011494) SHOW FIELDS FROM `users` - SQL (0.002092) SHOW FIELDS FROM `photos` - SQL (0.001556) SHOW FIELDS FROM `cameras` - SQL (0.001490) SHOW FIELDS FROM `users` - SQL (0.001594) SHOW FIELDS FROM `photos` - SQL (0.001273) SHOW FIELDS FROM `cameras` - SQL (0.001512) SHOW FIELDS FROM `users` - SQL (0.001362) SHOW FIELDS FROM `photos` - SQL (0.001476) SHOW FIELDS FROM `cameras` - SQL (0.000227) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000335) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.001514) SHOW FIELDS FROM `users` - SQL (0.001589) SHOW FIELDS FROM `photos` - SQL (0.001412) SHOW FIELDS FROM `cameras` - SQL (0.000110) SET SQL_AUTO_IS_NULL=0 - SQL (0.010696) SHOW FIELDS FROM `users` - SQL (0.002449) SHOW FIELDS FROM `photos` - SQL (0.001558) SHOW FIELDS FROM `cameras` - SQL (0.001720) SHOW FIELDS FROM `users` - SQL (0.001577) SHOW FIELDS FROM `photos` - SQL (0.001420) SHOW FIELDS FROM `cameras` - SQL (0.009109) SHOW FIELDS FROM `users` - SQL (0.001770) SHOW FIELDS FROM `photos` - SQL (0.001409) SHOW FIELDS FROM `cameras` - SQL (0.000247) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000305) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - User Columns (0.001429) SHOW FIELDS FROM `users` - SQL (0.001503) SHOW FIELDS FROM `users` - SQL (0.001595) SHOW FIELDS FROM `photos` - SQL (0.001775) SHOW FIELDS FROM `cameras` - SQL (0.000137) SET SQL_AUTO_IS_NULL=0 - SQL (0.010741) SHOW FIELDS FROM `users` - SQL (0.002217) SHOW FIELDS FROM `photos` - SQL (0.001614) SHOW FIELDS FROM `cameras` - SQL (0.001277) SHOW FIELDS FROM `users` - SQL (0.001394) SHOW FIELDS FROM `photos` - SQL (0.001412) SHOW FIELDS FROM `cameras` - SQL (0.001534) SHOW FIELDS FROM `users` - SQL (0.001595) SHOW FIELDS FROM `photos` - SQL (0.001771) SHOW FIELDS FROM `cameras` - SQL (0.000246) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000287) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.001537) SHOW FIELDS FROM `users` - SQL (0.001578) SHOW FIELDS FROM `photos` - SQL (0.001351) SHOW FIELDS FROM `cameras` - SQL (0.000124) SET SQL_AUTO_IS_NULL=0 - SQL (0.010755) SHOW FIELDS FROM `users` - SQL (0.002276) SHOW FIELDS FROM `photos` - SQL (0.001312) SHOW FIELDS FROM `cameras` - SQL (0.002071) SHOW FIELDS FROM `users` - SQL (0.001613) SHOW FIELDS FROM `photos` - SQL (0.001271) SHOW FIELDS FROM `cameras` - SQL (0.001665) SHOW FIELDS FROM `users` - SQL (0.001605) SHOW FIELDS FROM `photos` - SQL (0.001360) SHOW FIELDS FROM `cameras` - SQL (0.000247) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000303) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - User Columns (0.001449) SHOW FIELDS FROM `users` - SQL (0.001510) SHOW FIELDS FROM `users` - SQL (0.001413) SHOW FIELDS FROM `photos` - SQL (0.001546) SHOW FIELDS FROM `cameras` - SQL (0.000115) SET SQL_AUTO_IS_NULL=0 - SQL (0.001542) SHOW FIELDS FROM `users` - SQL (0.001224) SHOW FIELDS FROM `photos` - SQL (0.001201) SHOW FIELDS FROM `cameras` - SQL (0.001325) SHOW FIELDS FROM `users` - SQL (0.001269) SHOW FIELDS FROM `photos` - SQL (0.001364) SHOW FIELDS FROM `cameras` - SQL (0.001517) SHOW FIELDS FROM `users` - SQL (0.001422) SHOW FIELDS FROM `photos` - SQL (0.001674) SHOW FIELDS FROM `cameras` - SQL (0.000270) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000269) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - User Columns (0.008183) SHOW FIELDS FROM `users` - Photo Columns (0.001576) SHOW FIELDS FROM `photos` - SQL (0.001595) SHOW FIELDS FROM `users` - SQL (0.001461) SHOW FIELDS FROM `photos` - SQL (0.001327) SHOW FIELDS FROM `cameras` - SQL (0.000129) SET SQL_AUTO_IS_NULL=0 - SQL (0.001503) SHOW FIELDS FROM `users` - SQL (0.001544) SHOW FIELDS FROM `photos` - SQL (0.001444) SHOW FIELDS FROM `cameras` - SQL (0.001509) SHOW FIELDS FROM `users` - SQL (0.001593) SHOW FIELDS FROM `photos` - SQL (0.001422) SHOW FIELDS FROM `cameras` - SQL (0.001487) SHOW FIELDS FROM `users` - SQL (0.001996) SHOW FIELDS FROM `photos` - SQL (0.001380) SHOW FIELDS FROM `cameras` - SQL (0.000275) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000279) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - User Columns (0.001516) SHOW FIELDS FROM `users` - SQL (0.001449) SHOW FIELDS FROM `users` - SQL (0.001558) SHOW FIELDS FROM `photos` - SQL (0.001347) SHOW FIELDS FROM `cameras` - SQL (0.000133) SET SQL_AUTO_IS_NULL=0 - SQL (0.010735) SHOW FIELDS FROM `users` - SQL (0.002173) SHOW FIELDS FROM `photos` - SQL (0.001449) SHOW FIELDS FROM `cameras` - SQL (0.001510) SHOW FIELDS FROM `users` - SQL (0.001410) SHOW FIELDS FROM `photos` - SQL (0.001592) SHOW FIELDS FROM `cameras` - SQL (0.001570) SHOW FIELDS FROM `users` - SQL (0.001423) SHOW FIELDS FROM `photos` - SQL (0.001301) SHOW FIELDS FROM `cameras` - SQL (0.000287) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000301) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - User Columns (0.001475) SHOW FIELDS FROM `users` - Photo Columns (0.001465) SHOW FIELDS FROM `photos` - SQL (0.001633) SHOW FIELDS FROM `users` - SQL (0.001467) SHOW FIELDS FROM `photos` - SQL (0.001332) SHOW FIELDS FROM `cameras` - SQL (0.000132) SET SQL_AUTO_IS_NULL=0 - SQL (0.010888) SHOW FIELDS FROM `users` - SQL (0.002202) SHOW FIELDS FROM `photos` - SQL (0.001500) SHOW FIELDS FROM `cameras` - SQL (0.001457) SHOW FIELDS FROM `users` - SQL (0.001593) SHOW FIELDS FROM `photos` - SQL (0.001424) SHOW FIELDS FROM `cameras` - SQL (0.001492) SHOW FIELDS FROM `users` - SQL (0.001520) SHOW FIELDS FROM `photos` - SQL (0.001480) SHOW FIELDS FROM `cameras` - SQL (0.000290) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000263) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - SQL (0.000320) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - User Columns (0.001896) SHOW FIELDS FROM `users` - SQL (0.001262) SHOW FIELDS FROM `users` - SQL (0.001675) SHOW FIELDS FROM `photos` - SQL (0.001409) SHOW FIELDS FROM `cameras` - SQL (0.000130) SET SQL_AUTO_IS_NULL=0 - SQL (0.010691) SHOW FIELDS FROM `users` - SQL (0.002363) SHOW FIELDS FROM `photos` - SQL (0.001590) SHOW FIELDS FROM `cameras` - SQL (0.001560) SHOW FIELDS FROM `users` - SQL (0.013103) SHOW FIELDS FROM `photos` - SQL (0.001597) SHOW FIELDS FROM `cameras` - SQL (0.001491) SHOW FIELDS FROM `users` - SQL (0.001553) SHOW FIELDS FROM `photos` - SQL (0.001368) SHOW FIELDS FROM `cameras` - SQL (0.000300) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.001508) SHOW FIELDS FROM `users` - SQL (0.001583) SHOW FIELDS FROM `photos` - SQL (0.001442) SHOW FIELDS FROM `cameras` - SQL (0.000132) SET SQL_AUTO_IS_NULL=0 - SQL (0.010756) SHOW FIELDS FROM `users` - SQL (0.002320) SHOW FIELDS FROM `photos` - SQL (0.001416) SHOW FIELDS FROM `cameras` - SQL (0.001507) SHOW FIELDS FROM `users` - SQL (0.012716) SHOW FIELDS FROM `photos` - SQL (0.001406) SHOW FIELDS FROM `cameras` - SQL (0.001353) SHOW FIELDS FROM `users` - SQL (0.001440) SHOW FIELDS FROM `photos` - SQL (0.001263) SHOW FIELDS FROM `cameras` - SQL (0.000233) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000259) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - User Columns (0.001394) SHOW FIELDS FROM `users` - SQL (0.001487) SHOW FIELDS FROM `users` - SQL (0.001837) SHOW FIELDS FROM `photos` - SQL (0.001501) SHOW FIELDS FROM `cameras` - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.001575) SHOW FIELDS FROM `users` - SQL (0.001415) SHOW FIELDS FROM `photos` - SQL (0.001483) SHOW FIELDS FROM `cameras` - SQL (0.000820) SHOW FIELDS FROM `users` - SQL (0.001526) SHOW FIELDS FROM `photos` - SQL (0.001093) SHOW FIELDS FROM `cameras` - SQL (0.001526) SHOW FIELDS FROM `users` - SQL (0.001631) SHOW FIELDS FROM `photos` - SQL (0.001346) SHOW FIELDS FROM `cameras` - SQL (0.000282) SELECT * -FROM users -WHERE users.id = 1 - SQL (0.000281) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - User Columns (0.001235) SHOW FIELDS FROM `users` - Photo Columns (0.001422) SHOW FIELDS FROM `photos` - SQL (0.001607) SHOW FIELDS FROM `users` - SQL (0.001685) SHOW FIELDS FROM `photos` - SQL (0.001318) SHOW FIELDS FROM `cameras` - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010894) SHOW FIELDS FROM `users` - SQL (0.002240) SHOW FIELDS FROM `photos` - SQL (0.001487) SHOW FIELDS FROM `cameras` - SQL (0.001578) SHOW FIELDS FROM `users` - SQL (0.001582) SHOW FIELDS FROM `photos` - SQL (0.001418) SHOW FIELDS FROM `cameras` - SQL (0.001528) SHOW FIELDS FROM `users` - SQL (0.001577) SHOW FIELDS FROM `photos` - SQL (0.001215) SHOW FIELDS FROM `cameras` - SQL (0.000251) SELECT * -FROM users -WHERE users.id = 1 - User Columns (0.001387) SHOW FIELDS FROM `users` - SQL (0.000296) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - Photo Columns (0.001457) SHOW FIELDS FROM `photos` - SQL (0.001421) SHOW FIELDS FROM `users` - SQL (0.001431) SHOW FIELDS FROM `photos` - SQL (0.001485) SHOW FIELDS FROM `cameras` - SQL (0.000145) SET SQL_AUTO_IS_NULL=0 - SQL (0.010759) SHOW FIELDS FROM `users` - SQL (0.002325) SHOW FIELDS FROM `photos` - SQL (0.001391) SHOW FIELDS FROM `cameras` - SQL (0.001545) SHOW FIELDS FROM `users` - SQL (0.001442) SHOW FIELDS FROM `photos` - SQL (0.001285) SHOW FIELDS FROM `cameras` - SQL (0.001287) SHOW FIELDS FROM `users` - SQL (0.001565) SHOW FIELDS FROM `photos` - SQL (0.001098) SHOW FIELDS FROM `cameras` - SQL (0.000215) SELECT * -FROM users -WHERE users.id = 1 - User Columns (0.001362) SHOW FIELDS FROM `users` - SQL (0.000283) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - Photo Columns (0.001459) SHOW FIELDS FROM `photos` - SQL (0.001404) SHOW FIELDS FROM `users` - SQL (0.001554) SHOW FIELDS FROM `photos` - SQL (0.001531) SHOW FIELDS FROM `cameras` - SQL (0.000146) SET SQL_AUTO_IS_NULL=0 - SQL (0.010611) SHOW FIELDS FROM `users` - SQL (0.002560) SHOW FIELDS FROM `photos` - SQL (0.001457) SHOW FIELDS FROM `cameras` - SQL (0.001439) SHOW FIELDS FROM `users` - SQL (0.001575) SHOW FIELDS FROM `photos` - SQL (0.001422) SHOW FIELDS FROM `cameras` - SQL (0.001475) SHOW FIELDS FROM `users` - SQL (0.001563) SHOW FIELDS FROM `photos` - SQL (0.001389) SHOW FIELDS FROM `cameras` - SQL (0.000213) SELECT * -FROM users -WHERE users.id = 1 - User Columns (0.001375) SHOW FIELDS FROM `users` - SQL (0.000251) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - Photo Columns (0.001417) SHOW FIELDS FROM `photos` - SQL (0.001395) SHOW FIELDS FROM `users` - SQL (0.001539) SHOW FIELDS FROM `photos` - SQL (0.001552) SHOW FIELDS FROM `cameras` - SQL (0.000113) SET SQL_AUTO_IS_NULL=0 - SQL (0.010659) SHOW FIELDS FROM `users` - SQL (0.002496) SHOW FIELDS FROM `photos` - SQL (0.001466) SHOW FIELDS FROM `cameras` - SQL (0.001519) SHOW FIELDS FROM `users` - SQL (0.001591) SHOW FIELDS FROM `photos` - SQL (0.001455) SHOW FIELDS FROM `cameras` - SQL (0.001502) SHOW FIELDS FROM `users` - SQL (0.001543) SHOW FIELDS FROM `photos` - SQL (0.001432) SHOW FIELDS FROM `cameras` - SQL (0.000225) SELECT * -FROM users -WHERE users.id = 1 - User Columns (0.001376) SHOW FIELDS FROM `users` - SQL (0.000266) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - Photo Columns (0.001440) SHOW FIELDS FROM `photos` - SQL (0.001105) SHOW FIELDS FROM `users` - SQL (0.001152) SHOW FIELDS FROM `photos` - SQL (0.001384) SHOW FIELDS FROM `cameras` - SQL (0.000127) SET SQL_AUTO_IS_NULL=0 - SQL (0.010753) SHOW FIELDS FROM `users` - SQL (0.002275) SHOW FIELDS FROM `photos` - SQL (0.001708) SHOW FIELDS FROM `cameras` - SQL (0.001413) SHOW FIELDS FROM `users` - SQL (0.001552) SHOW FIELDS FROM `photos` - SQL (0.001604) SHOW FIELDS FROM `cameras` - SQL (0.001482) SHOW FIELDS FROM `users` - SQL (0.001500) SHOW FIELDS FROM `photos` - SQL (0.001349) SHOW FIELDS FROM `cameras` - SQL (0.000227) SELECT * -FROM users -WHERE users.id = 1 - User Columns (0.001386) SHOW FIELDS FROM `users` - SQL (0.000269) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - Photo Columns (0.001425) SHOW FIELDS FROM `photos` - SQL (0.001065) SHOW FIELDS FROM `users` - SQL (0.001438) SHOW FIELDS FROM `photos` - SQL (0.001376) SHOW FIELDS FROM `cameras` - SQL (0.000107) SET SQL_AUTO_IS_NULL=0 - SQL (0.010766) SHOW FIELDS FROM `users` - SQL (0.002300) SHOW FIELDS FROM `photos` - SQL (0.001306) SHOW FIELDS FROM `cameras` - SQL (0.001562) SHOW FIELDS FROM `users` - SQL (0.001725) SHOW FIELDS FROM `photos` - SQL (0.001356) SHOW FIELDS FROM `cameras` - SQL (0.001539) SHOW FIELDS FROM `users` - SQL (0.001465) SHOW FIELDS FROM `photos` - SQL (0.001345) SHOW FIELDS FROM `cameras` - SQL (0.000303) SELECT * -FROM users -WHERE users.id = 1 - User Columns (0.001553) SHOW FIELDS FROM `users` - SQL (0.000299) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - Photo Columns (0.001329) SHOW FIELDS FROM `photos` - SQL (0.001422) SHOW FIELDS FROM `users` - SQL (0.001414) SHOW FIELDS FROM `photos` - SQL (0.001429) SHOW FIELDS FROM `cameras` - SQL (0.000349) SELECT * -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id LEFT OUTER JOIN cameras ON photos.camera_id = cameras.id -WHERE users.id = 1 - SQL (0.000109) SET SQL_AUTO_IS_NULL=0 - SQL (0.010688) SHOW FIELDS FROM `users` - SQL (0.002247) SHOW FIELDS FROM `photos` - SQL (0.001542) SHOW FIELDS FROM `cameras` - SQL (0.001432) SHOW FIELDS FROM `users` - SQL (0.001390) SHOW FIELDS FROM `photos` - SQL (0.001428) SHOW FIELDS FROM `cameras` - SQL (0.001641) SHOW FIELDS FROM `users` - SQL (0.001602) SHOW FIELDS FROM `photos` - SQL (0.001426) SHOW FIELDS FROM `cameras` - SQL (0.000253) SELECT * -FROM users -WHERE users.id = 1 - User Columns (0.001398) SHOW FIELDS FROM `users` - SQL (0.000304) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - Photo Columns (0.001457) SHOW FIELDS FROM `photos` - SQL (0.001298) SHOW FIELDS FROM `users` - SQL (0.001539) SHOW FIELDS FROM `photos` - SQL (0.001487) SHOW FIELDS FROM `cameras` - SQL (0.000139) SET SQL_AUTO_IS_NULL=0 - SQL (0.001575) SHOW FIELDS FROM `users` - SQL (0.001596) SHOW FIELDS FROM `photos` - SQL (0.001406) SHOW FIELDS FROM `cameras` - SQL (0.001432) SHOW FIELDS FROM `users` - SQL (0.001640) SHOW FIELDS FROM `photos` - SQL (0.001465) SHOW FIELDS FROM `cameras` - SQL (0.001463) SHOW FIELDS FROM `users` - SQL (0.001577) SHOW FIELDS FROM `photos` - SQL (0.001434) SHOW FIELDS FROM `cameras` - SQL (0.000258) SELECT * -FROM users -WHERE users.id = 1 - User Columns (0.001417) SHOW FIELDS FROM `users` - SQL (0.000338) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - Photo Columns (0.001542) SHOW FIELDS FROM `photos` - SQL (0.001474) SHOW FIELDS FROM `users` - SQL (0.001582) SHOW FIELDS FROM `photos` - SQL (0.001524) SHOW FIELDS FROM `cameras` - SQL (0.000112) SET SQL_AUTO_IS_NULL=0 - SQL (0.016053) SHOW FIELDS FROM `users` - SQL (0.001843) SHOW FIELDS FROM `photos` - SQL (0.001493) SHOW FIELDS FROM `cameras` - SQL (0.001376) SHOW FIELDS FROM `users` - SQL (0.001547) SHOW FIELDS FROM `photos` - SQL (0.001670) SHOW FIELDS FROM `cameras` - SQL (0.001504) SHOW FIELDS FROM `users` - SQL (0.001756) SHOW FIELDS FROM `photos` - SQL (0.001567) SHOW FIELDS FROM `cameras` - SQL (0.001476) SHOW FIELDS FROM `users` - SQL (0.001574) SHOW FIELDS FROM `photos` - SQL (0.001402) SHOW FIELDS FROM `cameras` - SQL (0.001565) SHOW FIELDS FROM `users` - SQL (0.001346) SHOW FIELDS FROM `photos` - SQL (0.001424) SHOW FIELDS FROM `cameras` - SQL (0.001447) SHOW FIELDS FROM `users` - SQL (0.001570) SHOW FIELDS FROM `photos` - SQL (0.001502) SHOW FIELDS FROM `cameras` - SQL (0.000244) SELECT * -FROM users -WHERE users.id = 1 - User Columns (0.001413) SHOW FIELDS FROM `users` - SQL (0.000304) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - Photo Columns (0.001471) SHOW FIELDS FROM `photos` - SQL (0.034694) SHOW FIELDS FROM `users` - SQL (0.001709) SHOW FIELDS FROM `photos` - SQL (0.001407) SHOW FIELDS FROM `cameras` - SQL (0.000109) SET SQL_AUTO_IS_NULL=0 - SQL (0.010677) SHOW FIELDS FROM `users` - SQL (0.002292) SHOW FIELDS FROM `photos` - SQL (0.001455) SHOW FIELDS FROM `cameras` - SQL (0.001467) SHOW FIELDS FROM `users` - SQL (0.001537) SHOW FIELDS FROM `photos` - SQL (0.001429) SHOW FIELDS FROM `cameras` - SQL (0.001476) SHOW FIELDS FROM `users` - SQL (0.001679) SHOW FIELDS FROM `photos` - SQL (0.001440) SHOW FIELDS FROM `cameras` - SQL (0.001147) SHOW FIELDS FROM `users` - SQL (0.001687) SHOW FIELDS FROM `photos` - SQL (0.001424) SHOW FIELDS FROM `cameras` - SQL (0.001509) SHOW FIELDS FROM `users` - SQL (0.001622) SHOW FIELDS FROM `photos` - SQL (0.001417) SHOW FIELDS FROM `cameras` - SQL (0.001430) SHOW FIELDS FROM `users` - SQL (0.001540) SHOW FIELDS FROM `photos` - SQL (0.001420) SHOW FIELDS FROM `cameras` - SQL (0.000244) SELECT * -FROM users -WHERE users.id = 1 - User Columns (0.001374) SHOW FIELDS FROM `users` - SQL (0.000288) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - Photo Columns (0.001449) SHOW FIELDS FROM `photos` - SQL (0.034463) SHOW FIELDS FROM `users` - SQL (0.001751) SHOW FIELDS FROM `photos` - SQL (0.002051) SHOW FIELDS FROM `cameras` - SQL (0.000108) SET SQL_AUTO_IS_NULL=0 - SQL (0.010738) SHOW FIELDS FROM `users` - SQL (0.002251) SHOW FIELDS FROM `photos` - SQL (0.001306) SHOW FIELDS FROM `cameras` - SQL (0.001717) SHOW FIELDS FROM `users` - SQL (0.001554) SHOW FIELDS FROM `photos` - SQL (0.001364) SHOW FIELDS FROM `cameras` - SQL (0.001622) SHOW FIELDS FROM `users` - SQL (0.001490) SHOW FIELDS FROM `photos` - SQL (0.001310) SHOW FIELDS FROM `cameras` - SQL (0.001666) SHOW FIELDS FROM `users` - SQL (0.002175) SHOW FIELDS FROM `photos` - SQL (0.001601) SHOW FIELDS FROM `cameras` - SQL (0.001647) SHOW FIELDS FROM `users` - SQL (0.002284) SHOW FIELDS FROM `photos` - SQL (0.001156) SHOW FIELDS FROM `cameras` - SQL (0.001447) SHOW FIELDS FROM `users` - SQL (0.001549) SHOW FIELDS FROM `photos` - SQL (0.001431) SHOW FIELDS FROM `cameras` - SQL (0.000391) SELECT * -FROM users -WHERE users.id = 1 - User Columns (0.001439) SHOW FIELDS FROM `users` - SQL (0.000284) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - Photo Columns (0.001431) SHOW FIELDS FROM `photos` - SQL (0.036129) SHOW FIELDS FROM `users` - SQL (0.001678) SHOW FIELDS FROM `photos` - SQL (0.001446) SHOW FIELDS FROM `cameras` - SQL (0.000111) SET SQL_AUTO_IS_NULL=0 - SQL (0.010686) SHOW FIELDS FROM `users` - SQL (0.002498) SHOW FIELDS FROM `photos` - SQL (0.001549) SHOW FIELDS FROM `cameras` - SQL (0.001496) SHOW FIELDS FROM `users` - SQL (0.001586) SHOW FIELDS FROM `photos` - SQL (0.001451) SHOW FIELDS FROM `cameras` - SQL (0.001455) SHOW FIELDS FROM `users` - SQL (0.001648) SHOW FIELDS FROM `photos` - SQL (0.001364) SHOW FIELDS FROM `cameras` - SQL (0.001406) SHOW FIELDS FROM `users` - SQL (0.001501) SHOW FIELDS FROM `photos` - SQL (0.001399) SHOW FIELDS FROM `cameras` - SQL (0.001388) SHOW FIELDS FROM `users` - SQL (0.001888) SHOW FIELDS FROM `photos` - SQL (0.001454) SHOW FIELDS FROM `cameras` - SQL (0.001570) SHOW FIELDS FROM `users` - SQL (0.002665) SHOW FIELDS FROM `photos` - SQL (0.001922) SHOW FIELDS FROM `cameras` - SQL (0.001160) SELECT * -FROM users -WHERE users.id = 1 - User Columns (0.001117) SHOW FIELDS FROM `users` - SQL (0.001219) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - Photo Columns (0.001255) SHOW FIELDS FROM `photos` - SQL (0.034678) SHOW FIELDS FROM `users` - SQL (0.001684) SHOW FIELDS FROM `photos` - SQL (0.001242) SHOW FIELDS FROM `cameras` - SQL (0.000110) SET SQL_AUTO_IS_NULL=0 - SQL (0.010673) SHOW FIELDS FROM `users` - SQL (0.002380) SHOW FIELDS FROM `photos` - SQL (0.001444) SHOW FIELDS FROM `cameras` - SQL (0.001580) SHOW FIELDS FROM `users` - SQL (0.001158) SHOW FIELDS FROM `photos` - SQL (0.001358) SHOW FIELDS FROM `cameras` - SQL (0.002625) SHOW FIELDS FROM `users` - SQL (0.002378) SHOW FIELDS FROM `photos` - SQL (0.001774) SHOW FIELDS FROM `cameras` - SQL (0.002249) SHOW FIELDS FROM `users` - SQL (0.001218) SHOW FIELDS FROM `photos` - SQL (0.002117) SHOW FIELDS FROM `cameras` - SQL (0.001795) SHOW FIELDS FROM `users` - SQL (0.002656) SHOW FIELDS FROM `photos` - SQL (0.001412) SHOW FIELDS FROM `cameras` - SQL (0.001415) SHOW FIELDS FROM `users` - SQL (0.001519) SHOW FIELDS FROM `photos` - SQL (0.001043) SHOW FIELDS FROM `cameras` - SQL (0.000346) SELECT * -FROM users -WHERE users.id = 1 - User Columns (0.001560) SHOW FIELDS FROM `users` - SQL (0.000297) SELECT photos.user_id, photos.camera_id, photos.id -FROM users LEFT OUTER JOIN photos ON users.id = photos.user_id -WHERE users.id = 1 - Photo Columns (0.001471) SHOW FIELDS FROM `photos` - SQL (0.001420) SHOW FIELDS FROM `users` - SQL (0.001463) SHOW FIELDS FROM `photos` - SQL (0.001395) SHOW FIELDS FROM `cameras` diff --git a/spec/integration/scratch_spec.rb b/spec/integration/scratch_spec.rb index 32ee98d361..b5d27f1dc2 100644 --- a/spec/integration/scratch_spec.rb +++ b/spec/integration/scratch_spec.rb @@ -1,42 +1,226 @@ require File.join(File.dirname(__FILE__), '..', 'spec_helper') -describe 'Relational Algebra' do +describe 'ActiveRelation', 'Proposed refactoring to ActiveRecord, introducing both a SQL + builder and a Relational Algebra to mediate connections + between ActiveRecord and the database. The goal of the + refactoring is to remove code duplication concerning AR + associations; remove complexity surrounding eager loading; + comprehensively solve quoting issues; remove the with_scope + merging logic; minimize the need for with_scope in general; + simplify the implementation of plugins like HasFinder and + ActsAsParanoid; introduce an identity map; and allow for + query optimization. All this while effectively not changing + the public interface of ActiveRecord. + The Relational Algebra makes these ambitious goals + possible. There\'s no need to be scared by the math, it\'s + actually quite simple. Relational Algebras have some nice + advantages over flexible SQL builders like Sequel and and + SqlAlchemy (a beautiful Python library). Principally, a + relation is writable as well as readable. This obviates the + :create with_scope, and perhaps also + #set_belongs_to_association_for. + With so much complexity removed from ActiveRecord, I + propose a mild reconsideration of the architecture of Base, + AssocationProxy, AssociationCollection, and so forth. These + should all be understood as \'Repositories\': a factory that + given a relation can manufacture objects, and given an object + can manipulate a relation. This may sound trivial, but I + think it has the potential to make the code much smaller and + more consistent.' do before do - @users = TableRelation.new(:users) - @photos = TableRelation.new(:photos) - @cameras = TableRelation.new(:cameras) - @user = @users.select(@users[:id] == 1) - @user_photos = (@user << @photos).on(@user[:id] == @photos[:user_id]) - @user_cameras = (@user_photos << @cameras).on(@user_photos[:camera_id] == @cameras[:id]) + class User < ActiveRecord::Base; has_many :photos end + class Photo < ActiveRecord::Base; belongs_to :camera end + class Camera < ActiveRecord::Base; end end - it 'simulates User.has_many :photos' do - @user_photos.project(*@photos.attributes).to_s.should be_like(""" - SELECT `photos`.`id`, `photos`.`user_id`, `photos`.`camera_id` - FROM `users` - LEFT OUTER JOIN `photos` - ON `users`.`id` = `photos`.`user_id` - WHERE - `users`.`id` = 1 - """) + before do + # Rather than being associated with a table, an ActiveRecord is now associated with + # a relation. + @users = User.relation + @photos = Photo.relation + @cameras = Camera.relation + # A first taste of a Relational Algebra: User.find(1) + # == is overridden on attributes to return a predicate, not true or false + @user = @users.select(@users[:id] == 1) + end + + # In a Relational Algebra, the various ActiveRecord associations become a simple + # mapping from one relation to another. The Reflection object parameterizes the + # mapping. + def user_has_many_photos(user_relation) + primary_key = User.reflections[:photos].klass.primary_key.to_sym + foreign_key = User.reflections[:photos].primary_key_name.to_sym + + # << is the left outer join operator + (user_relation << @photos).on(user_relation[primary_key] == @photos[foreign_key]) + end + + def photo_belongs_to_camera(photo_relation) + primary_key = Photo.reflections[:camera].klass.primary_key.to_sym + foreign_key = Photo.reflections[:camera].primary_key_name.to_sym + + (photo_relation << @cameras).on(photo_relation[foreign_key] == @cameras[primary_key]) end + + describe 'Relational Algebra', 'a relational algebra allows the implementation of + associations like has_many to be specified once, + regardless of eager-joins, has_many :through, and so + forth' do + it 'generates the query for User.has_many :photos' do + user_photos = user_has_many_photos(@user) + # the 'project' operator limits the columns that come back from the query. + # Note how all the operators are compositional: 'project' is applied to a query + # that previously had been joined and selected. + user_photos.project(*@photos.attributes).to_s.should be_like(""" + SELECT `photos`.`id`, `photos`.`user_id`, `photos`.`camera_id` + FROM `users` + LEFT OUTER JOIN `photos` + ON `users`.`id` = `photos`.`user_id` + WHERE + `users`.`id` = 1 + """) + # Also note the correctly quoted columns and tables. In this instance the + # MysqlAdapter from ActiveRecord is used to do the escaping. + end - it 'simulates a User.has_many :cameras :through => :photos' do - @user_cameras.project(*@cameras.attributes).to_s.should be_like(""" - SELECT `cameras`.`id` - FROM `users` - LEFT OUTER JOIN `photos` - ON `users`.`id` = `photos`.`user_id` - LEFT OUTER JOIN `cameras` - ON `photos`.`camera_id` = `cameras`.`id` - WHERE - `users`.`id` = 1 - """) + it 'generates the query for User.has_many :cameras :through => :photos' do + # note, again, the compositionality of the operators: + user_cameras = photo_belongs_to_camera(user_has_many_photos(@user)) + user_cameras.project(*@cameras.attributes).to_s.should be_like(""" + SELECT `cameras`.`id` + FROM `users` + LEFT OUTER JOIN `photos` + ON `users`.`id` = `photos`.`user_id` + LEFT OUTER JOIN `cameras` + ON `photos`.`camera_id` = `cameras`.`id` + WHERE + `users`.`id` = 1 + """) + end + + it 'generates the query for an eager join for a collection using the same logic as + for an association on an individual row' do + users_cameras = photo_belongs_to_camera(user_has_many_photos(@users)) + users_cameras.to_s.should be_like(""" + SELECT `users`.`name`, `users`.`id`, `photos`.`id`, `photos`.`user_id`, `photos`.`camera_id`, `cameras`.`id` + FROM `users` + LEFT OUTER JOIN `photos` + ON `users`.`id` = `photos`.`user_id` + LEFT OUTER JOIN `cameras` + ON `photos`.`camera_id` = `cameras`.`id` + """) + end + + it 'is trivial to disambiguate columns' do + users_cameras = photo_belongs_to_camera(user_has_many_photos(@users)).qualify + users_cameras.to_s.should be_like(""" + SELECT `users`.`name` AS 'users.name', `users`.`id` AS 'users.id', `photos`.`id` AS 'photos.id', `photos`.`user_id` AS 'photos.user_id', `photos`.`camera_id` AS 'photos.camera_id', `cameras`.`id` AS 'cameras.id' + FROM `users` + LEFT OUTER JOIN `photos` + ON `users`.`id` = `photos`.`user_id` + LEFT OUTER JOIN `cameras` + ON `photos`.`camera_id` = `cameras`.`id` + """) + end + + it 'obviates the need for with_scope merging logic since, e.g., + `with_scope :conditions => ...` is just a #select operation on the relation' do + end + + it 'may eliminate the need for with_scope altogether since the associations no longer + need it: the relation underlying the association fully encapsulates the scope' do + end end + + describe 'Repository', 'ActiveRecord::Base, HasManyAssociation, and so forth are + all repositories: given a relation, they manufacture objects' do + before do + class << ActiveRecord::Base; public :instantiate end + end - it '' do - # p @user_cameras.qualify.to_s - # - # @users.rename() + it 'manufactures objects' do + User.instantiate(@users.first).attributes.should == {"name" => "hai", "id" => 1} + end + + it 'frees ActiveRecords from being tied to tables' do + pending # pending, but trivial to implement: + + class User < ActiveRecord::Base + # acts_as_paranoid without alias_method_chain: + set_relation @users.select(@users[:deleted_at] != nil) + end + + class Person < ActiveRecord::Base + set_relation @accounts.join(@profiles).on(@accounts[:id] == @profiles[:account_id]) + end + # I know this sounds crazy, but even writes are possible in the last example. + # calling #save on a person can write to two tables! + end + + describe 'the n+1 problem' do + describe 'the eager join algorithm is vastly simpler' do + it 'three active records are loaded with only one query' do + # using 'rr' mocking framework: the real #select_all is called, but we assert + # that it only happens once: + mock.proxy(ActiveRecord::Base.connection).select_all.with_any_args.once + users_cameras = photo_belongs_to_camera(user_has_many_photos(@users)).qualify + user = User.instantiate(users_cameras.first, [:photos => [:camera]]) + user.photos.first.camera.attributes.should == {"id" => 1} + end + + before do + class << ActiveRecord::Base + # An identity map makes this algorithm efficient. + def instantiate_with_cache(record) + cache.get(record) { instantiate_without_cache(record) } + end + alias_method_chain :instantiate, :cache + + # for each row in the result set, which may contain data from n tables, + # - instantiate that slice of the data corresponding to the current class + # - recusively walk the dependency chain and repeat. + def instantiate_with_joins(data, joins = []) + record = unqualify(data) + returning instantiate_without_joins(record) do |object| + joins.each do |join| + case join + when Symbol + object.send(association = join).instantiate(data) + when Hash + join.each do |association, nested_associations| + object.send(association).instantiate(data, nested_associations) + end + end + end + end + end + alias_method_chain :instantiate, :joins + + private + # Sometimes, attributes are qualified to remove ambiguity. Here, bring back + # ambiguity by translating 'users.id' to 'id' so we can call #attributes=. + # This code should work correctly if the attributes are qualified or not. + def unqualify(qualified_attributes) + qualified_attributes_for_this_class = qualified_attributes. \ + slice(*relation.attributes.collect(&:qualified_name)) + qualified_attributes_for_this_class.alias do |qualified_name| + qualified_name.split('.')[1] || qualified_name # the latter means it must not really be qualified + end + end + end + end + + it "is possible to be smarter about eager loading. DataMapper is smart enough + to notice when you do users.each { |u| u.photos } and make this two queries + rather than n+1: the first invocation of #photos is lazy but it preloads + photos for all subsequent users. This is substantially easier with the + Algebra since we can do @user.join(@photos).on(...) and transform that to + @users.join(@photos).on(...), relying on the IdentityMap to eliminate + the n+1 problem. This is somewhat similar to ActiveRecordContext but it + works with every association type, not just belongs_to." do + pending + end + end + end end end \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index edace54f58..8d90e0dd51 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,5 +1,6 @@ require 'rubygems' require 'spec' +require 'rr' require File.join(File.dirname(__FILE__), '..', 'lib', 'sql_algebra') require File.join(File.dirname(__FILE__), 'spec_helpers', 'be_like') @@ -24,4 +25,5 @@ end Spec::Runner.configure do |config| config.include(BeLikeMatcher) + config.mock_with :rr end \ No newline at end of file diff --git a/spec/sql_builder/conditions_spec.rb b/spec/sql_builder/conditions_spec.rb index c1cae902c1..dc44cedc85 100644 --- a/spec/sql_builder/conditions_spec.rb +++ b/spec/sql_builder/conditions_spec.rb @@ -10,7 +10,7 @@ describe ConditionsBuilder do column(:c, :d, 'e') end end.to_s.should be_like(""" - `a`.`b` = 'e' + `a`.`b` = `c`.`d` """) end end diff --git a/spec/sql_builder/select_builder_spec.rb b/spec/sql_builder/select_builder_spec.rb index 060c642c1b..122539967e 100644 --- a/spec/sql_builder/select_builder_spec.rb +++ b/spec/sql_builder/select_builder_spec.rb @@ -87,7 +87,7 @@ describe SelectBuilder do end.to_s.should be_like(""" SELECT * FROM `users` - ORDER BY `users`.`id`, 'alias' + ORDER BY `users`.`id`, `users`.`created_at` """) end end -- cgit v1.2.3