diff --git a/app/models/ahoy/data_source.rb b/app/models/ahoy/data_source.rb new file mode 100644 index 000000000..2d52063bb --- /dev/null +++ b/app/models/ahoy/data_source.rb @@ -0,0 +1,49 @@ +# This class combines multiple collections with shared keys into a +# hash of collections compatible with C3.js charts +#---------------------------------------------------------------------- + +module Ahoy + class DataSource + + # Adds a collection with the datasource + # Name is the name of the collection and will be showed in the + # chart + def add(name, collection) + collections.push data: collection, name: name + collection.each{ |k,v| add_key k } + end + + def build + data = { x: [] } + keys.each do |k| + # Add the key with a valid date format + data[:x].push k.strftime("%Y-%m-%d") + + # Add the value for each column, or 0 if not present + collections.each do |col| + data[col[:name]] ||= [] + count = col[:data][k] || 0 + data[col[:name]].push count + end + end + + return data + end + + private + + def collections + @collections ||= [] + end + + def keys + @keys ||= [] + end + + def add_key(key) + keys.push(key) unless keys.include? key + end + + end + +end diff --git a/spec/models/ahoy/data_source_spec.rb b/spec/models/ahoy/data_source_spec.rb new file mode 100644 index 000000000..deb1fd056 --- /dev/null +++ b/spec/models/ahoy/data_source_spec.rb @@ -0,0 +1,36 @@ +require 'rails_helper' + +describe Ahoy::DataSource do + describe '#build' do + before :each do + time_1 = DateTime.parse("2015-01-01") + time_2 = DateTime.parse("2015-01-02") + time_3 = DateTime.parse("2015-01-03") + + create :ahoy_event, name: 'foo', time: time_1 + create :ahoy_event, name: 'foo', time: time_1 + create :ahoy_event, name: 'foo', time: time_2 + create :ahoy_event, name: 'bar', time: time_1 + create :ahoy_event, name: 'bar', time: time_3 + create :ahoy_event, name: 'bar', time: time_3 + end + + it 'should work without data sources' do + ds = Ahoy::DataSource.new + expect(ds.build).to eq x: [] + end + + it 'should work with single data sources' do + ds = Ahoy::DataSource.new + ds.add 'foo', Ahoy::Event.where(name: 'foo').group_by_day(:time).count + expect(ds.build).to eq :x=>["2015-01-01", "2015-01-02"], "foo"=>[2, 1] + end + + it 'should combine data sources' do + ds = Ahoy::DataSource.new + ds.add 'foo', Ahoy::Event.where(name: 'foo').group_by_day(:time).count + ds.add 'bar', Ahoy::Event.where(name: 'bar').group_by_day(:time).count + expect(ds.build).to eq :x=>["2015-01-01", "2015-01-02", "2015-01-03"], "foo"=>[2, 1, 0], "bar"=>[1, 0, 2] + end + end +end