add rounding option to all output feeds
This commit is contained in:
parent
f76edc6e53
commit
3d035734f5
@ -29,6 +29,9 @@ class FeedController < ApplicationController
|
||||
:limit => limit
|
||||
)
|
||||
|
||||
# keep track of whether data has been rounded already
|
||||
rounded = false
|
||||
|
||||
# if a feed has data
|
||||
if !feeds.empty?
|
||||
# convert to timescales if necessary
|
||||
@ -37,15 +40,23 @@ class FeedController < ApplicationController
|
||||
# convert to sums if necessary
|
||||
elsif timeparam_valid?(params[:sum])
|
||||
feeds = feeds_into_sums(feeds)
|
||||
rounded = true
|
||||
# convert to averages if necessary
|
||||
elsif timeparam_valid?(params[:average])
|
||||
feeds = feeds_into_averages(feeds)
|
||||
feeds = feeds_into_averages(feeds)
|
||||
rounded = true
|
||||
# convert to medians if necessary
|
||||
elsif timeparam_valid?(params[:median])
|
||||
feeds = feeds_into_medians(feeds)
|
||||
rounded = true
|
||||
end
|
||||
end
|
||||
|
||||
# if a feed needs to be rounded
|
||||
if params[:round] and !rounded
|
||||
feeds = object_round(feeds, params[:round].to_i)
|
||||
end
|
||||
|
||||
# set output correctly
|
||||
if params[:format] == 'xml'
|
||||
@channel_output = channel.to_xml(channel_options).sub('</channel>', '').strip
|
||||
@ -102,6 +113,11 @@ class FeedController < ApplicationController
|
||||
)
|
||||
@success = channel_permission?(@channel, @api_key)
|
||||
|
||||
# if a feed needs to be rounded
|
||||
if params[:round]
|
||||
@feed = item_round(@feed, params[:round].to_i)
|
||||
end
|
||||
|
||||
# check for access
|
||||
if @success
|
||||
# set output correctly
|
||||
@ -190,6 +206,39 @@ class FeedController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
# applies rounding to an enumerable object
|
||||
def object_round(object, round=nil, match='field')
|
||||
object.each_with_index do |o, index|
|
||||
object[index] = item_round(o, round, match)
|
||||
end
|
||||
|
||||
return object
|
||||
end
|
||||
|
||||
# applies rounding to a single item's attributes if necessary
|
||||
def item_round(item, round=nil, match='field')
|
||||
# for each attribute
|
||||
item.attribute_names.each do |attr|
|
||||
# only add non-null numeric fields
|
||||
if attr.index(match) and !item[attr].nil? and is_a_number?(item[attr])
|
||||
# keep track of whether the value contains commas
|
||||
comma_flag = (item[attr].to_s.index(',')) ? true : false
|
||||
|
||||
# replace commas with decimals if appropriate
|
||||
item[attr] = item[attr].to_s.gsub(/,/, '.') if comma_flag
|
||||
|
||||
# do the actual rounding
|
||||
item[attr] = sprintf "%.#{round}f", item[attr]
|
||||
|
||||
# replace decimals with commas if appropriate
|
||||
item[attr] = item[attr].to_s.gsub(/\./, ',') if comma_flag
|
||||
end
|
||||
end
|
||||
|
||||
# output new item
|
||||
return item
|
||||
end
|
||||
|
||||
# slice feed into timescales
|
||||
def feeds_into_timescales(feeds)
|
||||
# convert timescale (minutes) into seconds
|
||||
|
Loading…
Reference in New Issue
Block a user