From 0f823a8a2e422bd876cdacb2cb2aebc9980cda1a Mon Sep 17 00:00:00 2001 From: lukemelia Date: Tue, 27 Nov 2007 05:51:38 +0000 Subject: [PATCH] Fix issue where completed items would redundantly show context on a context page and project on a project page. Eliminated some N+1 query generation issues on context and project detail pages related to looking up tags. Added rake task to turn on and off the mysql query_analyzer plugin, which I'm using to help in my optimization process. git-svn-id: http://www.rousette.org.uk/svn/tracks-repos/trunk@662 a4c988fc-2ded-0310-b66e-134b36920a42 --- tracks/app/controllers/contexts_controller.rb | 6 ++-- tracks/app/controllers/projects_controller.rb | 8 +++-- tracks/app/helpers/todos_helper.rb | 12 +++++--- tracks/app/views/contexts/show.rhtml | 2 +- tracks/app/views/projects/show.rhtml | 2 +- tracks/app/views/todos/_completed.rhtml | 9 ++++-- tracks/app/views/todos/_todo.rhtml | 4 ++- tracks/lib/tasks/query_trace_toggle.rake | 28 +++++++++++++++++- tracks/vendor/query_analyzer.tar.gz | Bin 0 -> 2346 bytes 9 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 tracks/vendor/query_analyzer.tar.gz diff --git a/tracks/app/controllers/contexts_controller.rb b/tracks/app/controllers/contexts_controller.rb index 08eab114..82883b79 100644 --- a/tracks/app/controllers/contexts_controller.rb +++ b/tracks/app/controllers/contexts_controller.rb @@ -155,12 +155,14 @@ class ContextsController < ApplicationController def init_todos set_context_from_params unless @context.nil? - @done = @context.done_todos + @context.todos.with_scope :find => { :include => [:project, :tags] } do + @done = @context.done_todos + end # @not_done_todos = @context.not_done_todos # TODO: Temporarily doing this search manually until I can work out a way # to do the same thing using not_done_todos acts_as_todo_container method # Hides actions in hidden projects from context. - @not_done_todos = @context.todos.find(:all, :conditions => ['todos.state = ?', 'active'], :order => "todos.due IS NULL, todos.due ASC, todos.created_at ASC", :include => :project) + @not_done_todos = @context.todos.find(:all, :conditions => ['todos.state = ?', 'active'], :order => "todos.due IS NULL, todos.due ASC, todos.created_at ASC", :include => [:project, :tags]) @count = @not_done_todos.size @default_project_context_name_map = build_default_project_context_name_map(@projects).to_json end diff --git a/tracks/app/controllers/projects_controller.rb b/tracks/app/controllers/projects_controller.rb index 441ff225..fd43c6cb 100644 --- a/tracks/app/controllers/projects_controller.rb +++ b/tracks/app/controllers/projects_controller.rb @@ -27,9 +27,11 @@ class ProjectsController < ApplicationController def show init_data_for_sidebar @page_title = "TRACKS::Project: #{@project.name}" - @not_done = @project.not_done_todos(:include_project_hidden_todos => true) - @deferred = @project.deferred_todos.sort_by { |todo| todo.show_from } - @done = @project.done_todos + @project.todos.with_scope :find => { :include => [:context, :tags] } do + @not_done = @project.not_done_todos(:include_project_hidden_todos => true) + @deferred = @project.deferred_todos.sort_by { |todo| todo.show_from } + @done = @project.done_todos + end @count = @not_done.size @next_project = current_user.projects.next_from(@project) @previous_project = current_user.projects.previous_from(@project) diff --git a/tracks/app/helpers/todos_helper.rb b/tracks/app/helpers/todos_helper.rb index 9b9ecca4..23139eb1 100644 --- a/tracks/app/helpers/todos_helper.rb +++ b/tracks/app/helpers/todos_helper.rb @@ -93,19 +93,23 @@ module TodosHelper end end - def project_and_context_links(parent_container_type) + def project_and_context_links(parent_container_type, opts = {}) + str = '' if @todo.completed? - "(#{@todo.context.name}#{", " + @todo.project.name unless @todo.project.nil?})" + str += @todo.context.name unless opts[:suppress_context] + should_suppress_project = opts[:suppress_project] || @todo.project.nil? + str += ", " unless str.blank? || should_suppress_project + str += @todo.project.name unless should_suppress_project + str = "(#{str})" unless str.blank? else - str = '' if (['project', 'tag'].include?(parent_container_type)) str << item_link_to_context( @todo ) end if (['context', 'tickler', 'tag'].include?(parent_container_type)) && @todo.project_id str << item_link_to_project( @todo ) end - str end + return str end # Uses the 'staleness_starts' value from settings.yml (in days) to colour the diff --git a/tracks/app/views/contexts/show.rhtml b/tracks/app/views/contexts/show.rhtml index e2c4caf9..a269d379 100644 --- a/tracks/app/views/contexts/show.rhtml +++ b/tracks/app/views/contexts/show.rhtml @@ -1,6 +1,6 @@
<%= render :partial => "contexts/context", :locals => { :context => @context, :collapsible => false } %> -<%= render :partial => "todos/completed", :locals => { :done => @done, :collapsible => false, :append_descriptor => "in this context (last #{prefs.show_number_completed})" } %> +<%= render :partial => "todos/completed", :locals => { :done => @done, :suppress_context => true, :collapsible => false, :append_descriptor => "in this context (last #{prefs.show_number_completed})" } %>
diff --git a/tracks/app/views/projects/show.rhtml b/tracks/app/views/projects/show.rhtml index c474f38a..cc9501cf 100644 --- a/tracks/app/views/projects/show.rhtml +++ b/tracks/app/views/projects/show.rhtml @@ -5,7 +5,7 @@ <%= render :partial => "projects/project", :locals => { :project => @project, :collapsible => false } %> <%= render :partial => "todos/deferred", :locals => { :deferred => @deferred, :collapsible => false, :append_descriptor => "in this project" } %> -<%= render :partial => "todos/completed", :locals => { :done => @done, :collapsible => false, :append_descriptor => "in this project" } %> +<%= render :partial => "todos/completed", :locals => { :done => @done, :collapsible => false, :suppress_project => true, :append_descriptor => "in this project" } %>
diff --git a/tracks/app/views/todos/_completed.rhtml b/tracks/app/views/todos/_completed.rhtml index 4a1c41b3..e2a1f962 100644 --- a/tracks/app/views/todos/_completed.rhtml +++ b/tracks/app/views/todos/_completed.rhtml @@ -1,10 +1,13 @@ -<% suffix = append_descriptor ? append_descriptor : '' -%> +<% suffix = append_descriptor ? append_descriptor : '' + suppress_context ||= false + suppress_project ||= false +-%>

<% if collapsible %> <%= image_tag("collapse.png") %> <% end %> - Completed actions <%= append_descriptor ? append_descriptor : '' %> + Completed actions <%= suffix %>

@@ -12,6 +15,6 @@

Currently there are no completed actions.

- <%= render :partial => "todos/todo", :collection => done, :locals => { :parent_container_type => "completed" } %> + <%= render :partial => "todos/todo", :collection => done, :locals => { :parent_container_type => "completed", :suppress_context => suppress_context, :suppress_project => suppress_project } %>
\ No newline at end of file diff --git a/tracks/app/views/todos/_todo.rhtml b/tracks/app/views/todos/_todo.rhtml index 7815a462..d49753f6 100644 --- a/tracks/app/views/todos/_todo.rhtml +++ b/tracks/app/views/todos/_todo.rhtml @@ -1,5 +1,7 @@ <% @todo = todo + suppress_context ||= false + suppress_project ||= false %>
@@ -12,7 +14,7 @@ <%= sanitize(todo.description) %> <%= tag_list %> <%= deferred_due_date %> - <%= project_and_context_links( parent_container_type ) %> + <%= project_and_context_links( parent_container_type, :suppress_context => suppress_context, :suppress_project => suppress_project ) %> <%= render(:partial => "todos/toggle_notes", :locals => { :item => todo }) if todo.notes? %>
diff --git a/tracks/lib/tasks/query_trace_toggle.rake b/tracks/lib/tasks/query_trace_toggle.rake index 23186e7c..a6321541 100644 --- a/tracks/lib/tasks/query_trace_toggle.rake +++ b/tracks/lib/tasks/query_trace_toggle.rake @@ -21,4 +21,30 @@ namespace :query_trace do FileUtils.rm_rf("#{RAILS_ROOT}/vendor/plugins/query_trace") puts "QueryTrace plugin disabled. Must restart server to take effect." end -end \ No newline at end of file +end + +namespace :query_analyzer do + desc "Enables the query_analyzer plugin. Must restart server to take effect." + task :on => :environment do + unless File.exist?("#{RAILS_ROOT}/vendor/query_analyzer.tar.gz") + Dir.chdir("#{RAILS_ROOT}/vendor") do + url = "http://svn.nfectio.us/plugins/query_analyzer" + puts "Loading query_analyzer from #{url}..." + system "svn co #{url} query_analyzer" + system "tar zcf query_analyzer.tar.gz --exclude=.svn query_analyzer" + FileUtils.rm_rf("query_analyzer") + end + end + Dir.chdir("#{RAILS_ROOT}/vendor/plugins") do + system "tar zxf ../query_analyzer.tar.gz query_analyzer" + end + puts "QueryAnalyzer plugin enabled. Must restart server to take effect." + end + + desc "Disables the query_analyzer plugin. Must restart server to take effect." + task :off => :environment do + FileUtils.rm_rf("#{RAILS_ROOT}/vendor/plugins/query_analyzer") + puts "QueryAnalyzer plugin disabled. Must restart server to take effect." + end +end + diff --git a/tracks/vendor/query_analyzer.tar.gz b/tracks/vendor/query_analyzer.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..6ace51992a3dad2dd2497ae717b197c287bfa6b6 GIT binary patch literal 2346 zcmV+_3Dx!=iwFQ>pG!vo1ML`TZyPr@pZP1^+E`dBq>w4Ax zQb`--!^fpT27bA}|FHe{*6qLF?d-jP_T#d#dHtW;KNr`9%mwVMI>OGM&DZmKnza`H zi5xzD4fy@}e}5OZp7Z|`tPS>G-Fk#-@P+)pd$7B|X8-QX_U?23e~L9qxG~Vnb3SJP zS+1=ZSrOwiKrF^^%?Bf$6seNGig=LgS#2yu5}O7X+NnE006c&r`0z2jdYDM?(R47A zb~=zM7Pk;-UTp!@6{_XSuT|w*S7xJZf<{am_NvmpUqYS#*x(nQ_>MCUQmpF z(NfiR;0|{DIh~Re#W0a0db%fp19SM1-A|wWt4PLP$0+5uYmx?;04yISVxeUJin_aRAt%sS=Egdb zE2gTh?KF4b8~++$Jr8Rt`Q$b7TjUmMDk;I|1ubu+t)CTcY}H{K-e!Cx4DdKcBUlYH zonHZ|7REYHxg8{WG7!q<xohFekDl4G=+K`QK2$8d-WLG;c8bYZLH*eFk` zYt;j}oJt@s|{y@$5GwzJ3=;hZ#uIN|6&(E7Kh-;!+Q z!bSzJ7>X@Hv&C=etbcY+|2=E1{$KWcZ%+Gz81&9^_DfL3tHWnvh6Hx=v9nTMXqBmoRs$~_jL3d4sok#-Jx40B!N zfC&P-f+2VRh^Af>|w6O9F- zz%Br5Chiar3P~tJc4&~q6+6roP9z^<%wf@)l_@4McZ~>2}Ms*{askPZ*t2LX=qLk`dr1MED)}vM~#wk~=gQ(pSsueP5G_`5sjG5|OFsXdL zChYjPD#elr5ioWH#|qDq#DOzrM!C#vE9gS{vyvTiqarnS6*wwP05WT%1mW!8@-#z* zyf=ceA4M)mN{)0<^NAcg*O`b?qk)*6a*GAkx2Enur_vZF#TZ;ihWbM$dFVNib#J*5 zH`Jn8m~kRQy+~+fN>`;031S(m9Sc)_BPw(?ta`~DQt_91#Llq(7=Jz#LcwUt)x^71 z=$RcdsgxdJ9fTU8N8<^iJ;wiU+u%zVwz6y+g~7tCvlL+?^hw4putf71YVD}q{`Td| z@34>^eGhN@C;iv&Ad9|%A1=>NA%o+yv;HOg{rvb0VmLp;BT21n9AyK1_{Wd^%Rbb? z+Y#(S@9YiKaKp|sYCm=^cIx#yT6a;UJ!L9mA)W>f_Kq|&z`Bo5ZUgY4e~X<{sC{>U zB<>*7Xb4p3z$x;M8eRJFN~U-0gB&!TyPDd3g2mn*pI)5wOGcq$xp#8nAAEGrrsRQl z&{>8mVY~a~<#-uO^{_@{zd9G!1Cn|pk&DaY)86I3D%ehiGII~XbQK_@pb6=AIYJpb z(VB7taJ#%;M$T%^Y`{!lEGX3b| zy9mleP8o$#EsSv&m`7rWSdIMV2vuIEI5C(<%y{l7dp{j%OgzNndc0bvF$!6&Fa)*2 zG)j}A;~dl1Xd2Q$g#lca5MG1^3=117h_RH1r`(0A5j@AzL3s;}>pYb$UnH0@N{m6< zK!M0(@r}|kCQwu?FEzs`q4Fe%?sQZWrXImLwaJn)304i%2Pp=rc>~eNVm7M6r6_z; zjJgrDqDy{(DN0%qyd(8s)mTbrfn%qT(s3vuQA%)?)Y-N4IFd%IWz2+BxZpktE*qq! z@eDl^adiTAKH-${aU18Plw-Li6%9{du0 z)mzs&(UK3vdR7{jsUjT;X9#CHRD%*CXw+F2S=jy_LZO-nC32JnPUR%`C9fC9$DXNo z`VFOFY6T9V-98u~*Mq?D04MU8g%2akH)wWTnm!K?E6l8#_r_6?xsjkk2#0Y4KENTF z2j@kXOFwP^aVM-A_$z$5NcD}MOa0@Q(B6achp;kEpOxW+25@DqiuK?l=-Wb06a{=R zurHa2ssRZZIv35nP*n>ZCG&qSrn?6Rr97no8|qvh`+s}aYmWi6XCSAXc3;Bafb?lmw2W7H^HqPZVe>~$`X zoH=w8o4Bf+v595Rj^zg4%1OGXR};d#0WUYT?qQ3_F8Lf z15p1s