-
Notifications
You must be signed in to change notification settings - Fork 1
interesting trace from search
Steven Myers edited this page Mar 1, 2016
·
2 revisions
@persons = Set.new
@concrete_institutions = Set.new
@mentors = Person.select('people.name, people.id, people.institution_id')
.joins('LEFT OUTER JOIN mentorships ON mentorships.mentor_id = people.id')
.where('mentorships.person_id' => person_id).where('approved' => true)
@persons.add(@mentors)
@mentored = Person.select('people.name, people.id, people.institution_id')
.joins(:mentorships)
.where('mentorships.mentor_id' => person_id).where('approved' => true)
@persons.add(@mentored)
@supervisors = Person.select('people.name, people.id, people.institution_id')
.joins('LEFT OUTER JOIN supervisions ON supervisions.supervisor_id = people.id')
.where('supervisions.person_id' => person_id).where('approved' => true)
@persons.add(@supervisors)
@supervised = Person.select('people.name, people.id, people.institution_id')
.joins(:supervisions)
.where('supervisions.supervisor_id' => person_id).where('approved' => true)
@persons.add(@supervised)
# this code is not executed "proceduraly"!
@persons.each do |p|
p.each do |person|
puts 'next line ran here'
unless person.institution_id == nil
@concrete_institutions.add(person.institution_id)
end
end
end
One would expect to see the four queries ran and then see four next line ran here
prints, but as one can see from the execution in the rails console
the person.instituion_id
is added to @concrete_institutions.add(person.institution_id)
directly after each query is ran... when the data is presumably in memory. A runtime optimization?
2.3.0 :105 > Search.relations_by_id(1)
Person Load (0.2ms) SELECT people.name, people.id, people.institution_id FROM "people" LEFT OUTER JOIN mentorships ON mentorships.mentor_id = people.id WHERE "mentorships"."person_id" = 1 AND "people"."approved" = ? [["approved", "t"]]
next line ran here
next line ran here
Person Load (0.2ms) SELECT people.name, people.id, people.institution_id FROM "people" INNER JOIN "mentorships" ON "mentorships"."person_id" = "people"."id" WHERE "mentorships"."mentor_id" = 1 AND "people"."approved" = ? [["approved", "t"]]
Person Load (0.2ms) SELECT people.name, people.id, people.institution_id FROM "people" LEFT OUTER JOIN supervisions ON supervisions.supervisor_id = people.id WHERE "supervisions"."person_id" = 1 AND "people"."approved" = ? [["approved", "t"]]
next line ran here
Person Load (0.2ms) SELECT people.name, people.id, people.institution_id FROM "people" INNER JOIN "supervisions" ON "supervisions"."person_id" = "people"."id" WHERE "supervisions"."supervisor_id" = 1 AND "people"."approved" = ? [["approved", "t"]]
next line ran here
Institution Load (0.1ms) SELECT id, name FROM "institutions" WHERE "institutions"."id" IN (1, 3)
It's probably nothing too special...