Class: Mondrian::OLAP::Schema::UserDefinedFunction

Inherits:
Mondrian::OLAP::SchemaElement show all
Includes:
ScriptElements
Defined in:
lib/mondrian/olap/schema_udf.rb

Defined Under Namespace

Classes: RubyUdfBase

Instance Attribute Summary

Attributes inherited from Mondrian::OLAP::SchemaElement

#xml_fragments

Instance Method Summary collapse

Methods included from ScriptElements

#javascript

Methods inherited from Mondrian::OLAP::SchemaElement

attributes, content, data_dictionary_names, elements, #initialize, #to_xml, #xml

Constructor Details

This class inherits a constructor from Mondrian::OLAP::SchemaElement

Instance Method Details

#coffeescript(text) ⇒ Object



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
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/mondrian/olap/schema_udf.rb', line 83

def coffeescript(text)
  coffee_text = "__udf__ = {\n" << text << "}\n"
  javascript_text = CoffeeScript.compile(coffee_text, :bare => true)
  javascript_text << <<-JS

__udf__.parameters || (__udf__.parameters = []);
__udf__.returns || (__udf__.returns = "Scalar");
var __scalarTypes__ = {"Numeric":true,"String":true,"Boolean":true,"DateTime":true,"Decimal":true,"Scalar":true};
function __getType__(type) {
  if (__scalarTypes__[type]) {
    return new mondrian.olap.type[type+"Type"];
  } else if (type === "Member") {
    return mondrian.olap.type.MemberType.Unknown;
  } else {
    return null;
  }
}
function getParameterTypes() {
  var parameters = __udf__.parameters || [],
      types = [];
  for (var i = 0, len = parameters.length; i < len; i++) {
    types.push(__getType__(parameters[i]))
  }
  return types;
}
function getReturnType(parameterTypes) {
  var returns = __udf__.returns || "Scalar";
  return __getType__(returns);
}
if (__udf__.syntax) {
  function getSyntax() {
    return mondrian.olap.Syntax[__udf__.syntax];
  }
}
function execute(evaluator, args) {
  var parameters = __udf__.parameters || [],
      values = [],
      value;
  for (var i = 0, len = parameters.length; i < len; i++) {
    if (__scalarTypes__[parameters[i]]) {
      value = args[i].evaluateScalar(evaluator);
    } else {
      value = args[i].evaluate(evaluator);
    }
    values.push(value);
  }
  return __udf__.execute.apply(__udf__, values);
}
JS
  javascript javascript_text
end

#ruby(*options, &block) ⇒ Object



258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
# File 'lib/mondrian/olap/schema_udf.rb', line 258

def ruby(*options, &block)
  udf_class_name = if options.include?(:shared)
    "#{name.capitalize}Udf"
  end
  if udf_class_name && self.class.const_defined?(udf_class_name)
    udf_class = self.class.const_get(udf_class_name)
  else
    udf_class = Class.new(RubyUdfBase)
    self.class.const_set(udf_class_name, udf_class) if udf_class_name
  end
  udf_class.function_name = name
  udf_class.class_eval(&block)
  udf_java_class = udf_class.become_java!(false)

  class_name udf_java_class.getName
end