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.
- data/lib/cell_set/cell_set.rb +3 -0
- data/lib/cell_set/series_list.rb +96 -0
- data/lib/cell_set/version.rb +1 -1
- data/spec/models/cell_set_spec.rb +156 -0
- metadata +3 -2
data/lib/cell_set/cell_set.rb
CHANGED
@@ -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
|
data/lib/cell_set/version.rb
CHANGED
@@ -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.
|
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-
|
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
|