Commit dc4023c9d2c6d14bd248538740a3f4be4a80044b

Authored by Robert Lail
1 parent 5fb5c16f
Exists in master and in 1 other branch production

don't instantiate problems before rendering them for the API

app/controllers/api/v1/problems_controller.rb
@@ -2,18 +2,21 @@ class Api::V1::ProblemsController < ApplicationController @@ -2,18 +2,21 @@ class Api::V1::ProblemsController < ApplicationController
2 respond_to :json, :xml 2 respond_to :json, :xml
3 3
4 def index 4 def index
  5 + query = {}
  6 + fields = %w{app_id app_name environment message where first_notice_at last_notice_at resolved resolved_at notices_count}
  7 +
5 if params.key?(:start_date) && params.key?(:end_date) 8 if params.key?(:start_date) && params.key?(:end_date)
6 - start_date = Date.parse(params[:start_date])  
7 - end_date = Date.parse(params[:end_date])  
8 - @problems = Problem.in_date_range(start_date..end_date)  
9 - else  
10 - @problems = Problem.all 9 + start_date = Time.parse(params[:start_date]).utc
  10 + end_date = Time.parse(params[:end_date]).utc
  11 + query = {:first_notice_at=>{"$lte"=>end_date}, "$or"=>[{:resolved_at=>nil}, {:resolved_at=>{"$gte"=>start_date}}]}
11 end 12 end
12 13
  14 + results = benchmark("[api/v1/problems_controller] query time") { Mongoid.master["problems"].find(query, fields: fields).to_a }
  15 +
13 respond_to do |format| 16 respond_to do |format|
14 - format.html { render json: ProblemPresenter.new(@problems) } # render JSON if no extension specified on path  
15 - format.json { render json: ProblemPresenter.new(@problems) }  
16 - format.xml { render xml: ProblemPresenter.new(@problems) } 17 + format.html { render json: Yajl.dump(results) } # render JSON if no extension specified on path
  18 + format.json { render json: Yajl.dump(results) }
  19 + format.xml { render xml: results }
17 end 20 end
18 end 21 end
19 22
app/presenters/problem_presenter.rb
@@ -1,42 +0,0 @@ @@ -1,42 +0,0 @@
1 -class ProblemPresenter  
2 -  
3 - def initialize(model_or_collection)  
4 - @model_or_collection = model_or_collection  
5 - end  
6 -  
7 - def to_xml(options={})  
8 - as_json(options).to_xml(options)  
9 - end  
10 -  
11 - def to_json(options={})  
12 - Yajl.dump(as_json(options))  
13 - end  
14 -  
15 - def as_json(options={})  
16 - if collection?  
17 - @model_or_collection.map { |model| model_as_json(model, options) }  
18 - else  
19 - model_as_json(@model_or_collection, options)  
20 - end  
21 - end  
22 -  
23 - def collection?  
24 - @model_or_collection.respond_to?(:each)  
25 - end  
26 -  
27 - def model_as_json(problem, options={})  
28 - {  
29 - app_id: problem.app_id,  
30 - app_name: problem.app_name,  
31 - environment: problem.environment,  
32 - message: problem.message,  
33 - where: problem.where,  
34 - first_notice_at: problem.first_notice_at,  
35 - last_notice_at: problem.last_notice_at,  
36 - resolved: problem.resolved,  
37 - resolved_at: problem.resolved_at,  
38 - notices_count: problem.notices_count  
39 - }  
40 - end  
41 -  
42 -end