16. Cube and member
queries
cube = olap.cube('Sales')
cube.dimension_names # => ['Measures', 'Customers', 'Products',
# 'Time']
cube.dimensions # => array of dimension objects
cube.dimension('Customers') # => customers dimension object
cube.dimension('Time').hierarchy_names # => ['Time', 'Time.Weekly']
cube.dimension('Time').hierarchies # => array of hierarchy objects
cube.dimension('Customers').hierarchy # => default customers dimension hierarchy
cube.dimension('Customers').hierarchy.level_names
# => ['(All)', 'Country', 'State Province',
# 'City', 'Name']
cube.dimension('Customers').hierarchy.levels
# => array of hierarchy level objects
cube.dimension('Customers').hierarchy.level('Country').members
# => array of all level members
cube.member('[Customers].[USA].[CA]') # => lookup member by full name
cube.member('[Customers].[USA].[CA]').children
# => get all children of member in deeper
# hierarchy level
cube.member('[Customers].[USA]').descendants_at_level('City')
# => get all descendants of member in specified
# hierarchy level
17. User defined
MDX functions
schema = Mondrian::OLAP::Schema.define do
# ... cube definitions ...
user_defined_function 'Factorial' do
ruby do
parameters :numeric
returns :numeric
def call(n)
n <= 1 ? 1 : n * call(n - 1)
end
end
end
user_defined_function 'UpperName' do
ruby do
parameters :member
returns :string
syntax :property
def call(member)
member.getName.upcase
end
end
end
end
18. UDF in JavaScript
schema = Mondrian::OLAP::Schema.define do
# ... cube definitions ...
user_defined_function 'Factorial' do
javascript <<-JS
function getParameterTypes() {
return new Array(
new mondrian.olap.type.NumericType());
}
function getReturnType(parameterTypes) {
return new mondrian.olap.type.NumericType();
}
function execute(evaluator, arguments) {
var n = arguments[0].evaluateScalar(evaluator);
return factorial(n);
}
function factorial(n) {
return n <= 1 ? 1 : n * factorial(n - 1);
}
JS
end
end
21. Sample CoffeeScript
# Assignment:
number = 42
opposite = true
# Conditions:
number = -42 if opposite
# Functions:
square = (x) -> x * x
# Arrays:
list = [1, 2, 3, 4, 5]
# Objects:
math =
root: Math.sqrt
square: square
cube: (x) -> x * square x
# Splats:
race = (winner, runners...) ->
print winner, runners
# Existence:
alert "I knew it!" if elvis?
# Array comprehensions:
cubes = (math.cube num for num in list)
22. UDF in CoffeeScript
schema = Mondrian::OLAP::Schema.define do
# ... cube definitions ...
user_defined_function 'Factorial' do
coffeescript <<-JS
parameters: ["Numeric"]
returns: "Numeric"
execute: (n) ->
if n <= 1 then 1 else n * @execute(n - 1)
JS
end
end
23. Cell, property, member
formatters in
Ruby and CoffeeScript
cell_formatter { ruby {|value| "%020d" % value} }
property_formatter do
ruby do |member, property_name, property_value|
property_value.upcase
end
end
member_formatter { ruby {|member| member.getName().upcase } }
!
cell_formatter do
coffeescript <<-JS
s = value.toString()
s = "0" + s while s.length < 20
s
JS
end
member_formatter { coffeescript "member.getName().toUpperCase()" }
property_formatter { coffeescript "propertyValue.toUpperCase()" }