cell_set 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,11 +1,14 @@
1
1
  require 'cell_set/cell_set_axis'
2
2
  require 'cell_set/cell'
3
+ require 'cell_set/series_list'
4
+ require 'active_support/core_ext/hash/deep_merge'
3
5
 
4
6
  module CellSet
5
7
  class CellSet
6
8
  ATTRIBUTES = [:axes]
7
9
 
8
10
  include Attributes
11
+ include SeriesList
9
12
  include ActiveModel::Serializers::JSON
10
13
  include ActiveModel::Serializers::Xml
11
14
  self.include_root_in_json = false
@@ -0,0 +1,96 @@
1
+ module CellSet
2
+ module SeriesList
3
+ def to_series_list(options={})
4
+ defaults = {
5
+ :labels => {
6
+ :axis_ordinal => 0,
7
+ :depth => @axes[0].positions[0].members.length - 1
8
+ },
9
+ :data => {
10
+ :axis_ordinal => 1
11
+ },
12
+ :name => {
13
+ :depth => @axes[1].positions[0].members.length - 1
14
+ }
15
+ }
16
+
17
+ if options.has_key?(:labels) && options[:labels].has_key?(:axis_ordinal)
18
+ unless options[:labels][:axis_ordinal] == 0 || options[:labels].has_key?(:depth)
19
+ options[:labels][:depth] = @axes[options[:labels][:axis_ordinal]].positions[0].members.length - 1
20
+ end
21
+ end
22
+
23
+ if options.has_key?(:data) && options[:data].has_key?(:axis_ordinal)
24
+ unless options[:data][:axis_ordinal] == 1 || (options.has_key?(:name) && options[:name].has_key?(:depth))
25
+ options[:name] = {} unless options.has_key?(:name)
26
+ options[:name][:depth] = @axes[options[:data][:axis_ordinal]].positions[0].members.length - 1
27
+ end
28
+ end
29
+
30
+ series_options = defaults.deep_merge(options)
31
+
32
+ series_list(series_options)
33
+ end
34
+
35
+ private
36
+ NIL_HASH = {
37
+ "formatted_value" => nil,
38
+ "value" => nil
39
+ }
40
+ def series_formatted_values(series_ordinal, options)
41
+ label_series_axis = @axes[options[:labels][:axis_ordinal]]
42
+ data_series_axis = @axes[options[:data][:axis_ordinal]]
43
+ label_series_axis.positionCount.times.map do |position_ordinal|
44
+ coordinates = if label_series_axis.axis_ordinal < data_series_axis.axis_ordinal
45
+ [position_ordinal, series_ordinal]
46
+ else
47
+ [series_ordinal, position_ordinal]
48
+ end
49
+
50
+ @cellHash[coordinatesToOrdinal(coordinates).to_s]["formatted_value"]
51
+ end
52
+ end
53
+
54
+ def series_labels(series_ordinal, options)
55
+ labels_axis = @axes[options[:labels][:axis_ordinal]]
56
+ member_depth = options[:labels][:depth]
57
+ labels_axis.positions.map do |position|
58
+ raise "Invalid depth specified" if position.members.length < member_depth + 1
59
+ position.members[member_depth].name
60
+ end
61
+ end
62
+
63
+ def series_list(options={})
64
+ series_axis = @axes[options[:data][:axis_ordinal]]
65
+ series_axis.positionCount.times.map do |series_ordinal|
66
+ {
67
+ :name => series_name(series_ordinal, options),
68
+ :labels => series_labels(series_ordinal, options),
69
+ :values => series_values(series_ordinal, options),
70
+ :formatted_values => series_formatted_values(series_ordinal, options)
71
+ }
72
+ end
73
+ end
74
+
75
+ def series_name(series_ordinal, options)
76
+ series_axis = @axes[options[:data][:axis_ordinal]]
77
+ member_depth = options[:name][:depth]
78
+ raise "Invalid depth specified" if series_axis.positions[series_ordinal].members.length < member_depth + 1
79
+ series_axis.positions[series_ordinal].members[member_depth].name
80
+ end
81
+
82
+ def series_values(series_ordinal, options)
83
+ label_series_axis = @axes[options[:labels][:axis_ordinal]]
84
+ data_series_axis = @axes[options[:data][:axis_ordinal]]
85
+ label_series_axis.positionCount.times.map do |position_ordinal|
86
+ coordinates = if label_series_axis.axis_ordinal < data_series_axis.axis_ordinal
87
+ [position_ordinal, series_ordinal]
88
+ else
89
+ [series_ordinal, position_ordinal]
90
+ end
91
+
92
+ @cellHash[coordinatesToOrdinal(coordinates).to_s]["value"]
93
+ end
94
+ end
95
+ end
96
+ end
@@ -1,3 +1,3 @@
1
1
  module Version
2
- VERSION = "0.1.4"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -195,6 +195,162 @@ describe CellSet::CellSet do
195
195
  end
196
196
  end
197
197
 
198
+ context "to_series_list" do
199
+ let(:column_members) do
200
+ begin
201
+ 3.times.map do |i|
202
+ Factory.build(:member, :ordinal => i)
203
+ end
204
+ end
205
+ end
206
+
207
+ let(:row_members) do
208
+ begin
209
+ 2.times.map do |i|
210
+ Factory.build(:member, :ordinal => i)
211
+ end
212
+ end
213
+ end
214
+
215
+ let(:column_positions) do
216
+ 5.times.map do |i|
217
+ # Un-memoize to make column_members unique for every position
218
+ __memoized.delete(:column_members)
219
+ Factory.build(:position, :ordinal => i, :members => column_members)
220
+ end
221
+ end
222
+
223
+ let(:row_positions) do
224
+ 2.times.map do |i|
225
+ # Un-memoize to make row_members unique for every position
226
+ __memoized.delete(:row_members)
227
+ Factory.build(:position, :ordinal => i, :members => row_members)
228
+ end
229
+ end
230
+
231
+ let(:column_axis) do
232
+ Factory.build(:cell_set_axis, :axis_ordinal => 0, :positions => column_positions)
233
+ end
234
+
235
+ let(:row_axis) do
236
+ Factory.build(:cell_set_axis, :axis_ordinal => 1, :positions => row_positions)
237
+ end
238
+
239
+ let(:cells) do
240
+ cellHash = {}
241
+ (column_positions.length * row_positions.length).times do |ordinal|
242
+ value = Random.new.rand(0.0..1000.0).round(2)
243
+ cellHash[ordinal.to_s] = {
244
+ "value" => value,
245
+ "formatted_value" => value.to_s
246
+ }
247
+ end
248
+ cellHash
249
+ end
250
+
251
+ let(:cell_set) do
252
+ Factory.build(:cell_set, :axes => [column_axis, row_axis], :cells => cells)
253
+ end
254
+
255
+ it "should have the same number of series as row positions" do
256
+ cell_set.to_series_list.length.should == row_positions.length
257
+ end
258
+
259
+ it "should have the same number of series as column positions" do
260
+ series_list = cell_set.to_series_list(:labels => {:axis_ordinal => 1}, :data => {:axis_ordinal => 0})
261
+ series_list.length.should == column_positions.length
262
+ end
263
+
264
+ params_list = {
265
+ "row" => {:labels => {:axis_ordinal => 0}, :data => {:axis_ordinal => 1}},
266
+ "column" => {:labels => {:axis_ordinal => 1}, :data => {:axis_ordinal => 0}}
267
+ }
268
+
269
+ context "series name" do
270
+ params_list.each do |order, params|
271
+ it "should have series name in #{order} series order" do
272
+ series_list = cell_set.to_series_list(params)
273
+ series_list.each_index do |index|
274
+ axis_ordinal = params[:data][:axis_ordinal]
275
+ axis = cell_set.axes[axis_ordinal]
276
+ depth = axis.positions[index].members.length - 1
277
+ series_list[index][:name].should == axis.positions[index].members[depth].name
278
+ end
279
+ end
280
+ end
281
+ end
282
+
283
+ context "series labels" do
284
+ params_list.each do |order, params|
285
+ it "should have series labels in #{order} series order" do
286
+ series_list = cell_set.to_series_list(params)
287
+ series_list.each_index do |index|
288
+ axis_ordinal = params[:labels][:axis_ordinal]
289
+ axis = cell_set.axes[axis_ordinal]
290
+ depth = axis.positions.first.members.length - 1
291
+ series_list[index][:labels].should == axis.positions.map{|position| position.members[depth].name}
292
+ end
293
+ end
294
+ end
295
+ end
296
+
297
+ context "series values" do
298
+ it "should have series values in row series order" do
299
+ params = params_list["row"]
300
+ series_list = cell_set.to_series_list(params)
301
+ series_list.each_index do |index|
302
+ axis_ordinal = params[:labels][:axis_ordinal]
303
+ axis = cell_set.axes[axis_ordinal]
304
+ values = axis.positionCount.times.map do |i|
305
+ cell_set.cell([i, index]).value
306
+ end
307
+ series_list[index][:values].should == values
308
+ end
309
+ end
310
+
311
+ it "should have series values in column series order" do
312
+ params = params_list["column"]
313
+ series_list = cell_set.to_series_list(params)
314
+ series_list.each_index do |index|
315
+ axis_ordinal = params[:labels][:axis_ordinal]
316
+ axis = cell_set.axes[axis_ordinal]
317
+ values = axis.positionCount.times.map do |i|
318
+ cell_set.cell([index, i]).value
319
+ end
320
+ series_list[index][:values].should == values
321
+ end
322
+ end
323
+ end
324
+
325
+ context "series formatted values" do
326
+ it "should have series formatted values in row series order" do
327
+ params = params_list["row"]
328
+ series_list = cell_set.to_series_list(params)
329
+ series_list.each_index do |index|
330
+ axis_ordinal = params[:labels][:axis_ordinal]
331
+ axis = cell_set.axes[axis_ordinal]
332
+ values = axis.positionCount.times.map do |i|
333
+ cell_set.cell([i, index]).formatted_value
334
+ end
335
+ series_list[index][:formatted_values].should == values
336
+ end
337
+ end
338
+
339
+ it "should have series formatted values in column series order" do
340
+ params = params_list["column"]
341
+ series_list = cell_set.to_series_list(params)
342
+ series_list.each_index do |index|
343
+ axis_ordinal = params[:labels][:axis_ordinal]
344
+ axis = cell_set.axes[axis_ordinal]
345
+ values = axis.positionCount.times.map do |i|
346
+ cell_set.cell([index, i]).formatted_value
347
+ end
348
+ series_list[index][:formatted_values].should == values
349
+ end
350
+ end
351
+ end
352
+ end
353
+
198
354
  if RUBY_PLATFORM == "java"
199
355
  #context "Mondrian::OLAP::Result" do
200
356
  # it "should respond to to_cell_set" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cell_set
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-30 00:00:00.000000000Z
12
+ date: 2012-04-06 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -102,6 +102,7 @@ files:
102
102
  - lib/cell_set/attributes.rb
103
103
  - lib/cell_set/model.rb
104
104
  - lib/cell_set/cell_set.rb
105
+ - lib/cell_set/series_list.rb
105
106
  - lib/mondrian/olap/cell_set/ruby.rb
106
107
  - lib/cell_set.rb
107
108
  - spec/factories/cell_set_axis_factory.rb