Module: Mondrian::REST::Formatters
- Defined in:
- lib/mondrian_rest/api_formatters.rb
Defined Under Namespace
Modules: AggregationJSON, CSV, XLS
Class Method Summary collapse
- .pluck(a, m) ⇒ Object
-
.tidy(result, options) ⇒ Object
Generate ‘tidy data’ (vita.had.co.nz/papers/tidy-data.pdf) from a result set.
Class Method Details
.pluck(a, m) ⇒ Object
123 124 125 |
# File 'lib/mondrian_rest/api_formatters.rb', line 123 def self.pluck(a, m) a.map { |e| e[m] } end |
.tidy(result, options) ⇒ Object
Generate ‘tidy data’ (vita.had.co.nz/papers/tidy-data.pdf) from a result set.
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/mondrian_rest/api_formatters.rb', line 57 def self.tidy(result, ) cube = result.cube add_parents = [:add_parents] rs = result.to_h(add_parents, [:debug]) measures = rs[:axes].first[:members] dimensions = rs[:axis_dimensions][1..-1] columns = [] slices = [] level_has_all = [] Enumerator.new do |y| dimensions.each do |dd| if add_parents hier = cube.dimension(dd[:name]) .hierarchies .first level_has_all << hier.has_all? slices << dd[:level_depth] hier .levels[(hier.has_all? ? 1 : 0)...dd[:level_depth]] .each do |ancestor_level| columns += ["ID #{ancestor_level.caption}", ancestor_level.caption] end end columns += ["ID #{dd[:level]}", dd[:level]] end # append measure columns and yield table header y.yield columns + pluck(measures, :name) prod = rs[:axes][1..-1].map { |e| e[:members].map.with_index { |e_, i| [e_,i] } } values = rs[:values] prod.shift.product(*prod).each do |cell| cidxs = cell.map { |c,i| i }.reverse cm = cell.map(&:first) msrs = measures.map.with_index { |m, mi| (cidxs + [mi]).reduce(values) { |_, idx| _[idx] } } if add_parents vdim = cm.each.with_index.reduce([]) { |cnames, (member, j)| member[:ancestors][0...slices[j] - (level_has_all[j] ? 1 : 0)].each { |ancestor| cnames += [ancestor[:key], ancestor[:caption]] } cnames += [member[:key], member[:caption]] } y.yield vdim + msrs else y.yield pluck(cm, :key) .zip(pluck(cm, :caption)) .flatten \ + msrs end end end end |