cell_set 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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