mondrian-olap 0.5.0 → 1.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.
- checksums.yaml +5 -5
- data/Changelog.md +86 -0
- data/LICENSE-Mondrian.txt +87 -0
- data/LICENSE.txt +1 -1
- data/README.md +43 -40
- data/VERSION +1 -1
- data/lib/mondrian/jars/commons-collections-3.2.2.jar +0 -0
- data/lib/mondrian/jars/commons-dbcp-1.4.jar +0 -0
- data/lib/mondrian/jars/commons-io-2.2.jar +0 -0
- data/lib/mondrian/jars/commons-lang-2.6.jar +0 -0
- data/lib/mondrian/jars/commons-logging-1.2.jar +0 -0
- data/lib/mondrian/jars/commons-pool-1.5.7.jar +0 -0
- data/lib/mondrian/jars/commons-vfs2-2.2.jar +0 -0
- data/lib/mondrian/jars/eigenbase-xom-1.3.5.jar +0 -0
- data/lib/mondrian/jars/guava-17.0.jar +0 -0
- data/lib/mondrian/jars/log4j-1.2.17.jar +0 -0
- data/lib/mondrian/jars/log4j.properties +2 -4
- data/lib/mondrian/jars/mondrian-9.1.0.0.jar +0 -0
- data/lib/mondrian/jars/olap4j-1.2.0.jar +0 -0
- data/lib/mondrian/olap/connection.rb +252 -67
- data/lib/mondrian/olap/cube.rb +63 -2
- data/lib/mondrian/olap/error.rb +37 -8
- data/lib/mondrian/olap/query.rb +41 -21
- data/lib/mondrian/olap/result.rb +163 -44
- data/lib/mondrian/olap/schema.rb +42 -3
- data/lib/mondrian/olap/schema_element.rb +25 -6
- data/lib/mondrian/olap/schema_udf.rb +21 -16
- data/spec/connection_role_spec.rb +69 -13
- data/spec/connection_spec.rb +3 -2
- data/spec/cube_cache_control_spec.rb +261 -0
- data/spec/cube_spec.rb +32 -4
- data/spec/fixtures/MondrianTest.xml +1 -6
- data/spec/fixtures/MondrianTestOracle.xml +1 -6
- data/spec/mondrian_spec.rb +71 -1
- data/spec/query_spec.rb +323 -25
- data/spec/rake_tasks.rb +253 -159
- data/spec/schema_definition_spec.rb +314 -61
- data/spec/spec_helper.rb +115 -45
- data/spec/support/data/customers.csv +10902 -0
- data/spec/support/data/product_classes.csv +101 -0
- data/spec/support/data/products.csv +101 -0
- data/spec/support/data/sales.csv +101 -0
- data/spec/support/data/time.csv +731 -0
- metadata +126 -124
- data/LICENSE-Mondrian.html +0 -259
- data/lib/mondrian/jars/commons-collections-3.2.jar +0 -0
- data/lib/mondrian/jars/commons-dbcp-1.2.1.jar +0 -0
- data/lib/mondrian/jars/commons-logging-1.1.1.jar +0 -0
- data/lib/mondrian/jars/commons-pool-1.2.jar +0 -0
- data/lib/mondrian/jars/commons-vfs-1.0.jar +0 -0
- data/lib/mondrian/jars/eigenbase-xom-1.3.1.jar +0 -0
- data/lib/mondrian/jars/log4j-1.2.14.jar +0 -0
- data/lib/mondrian/jars/mondrian.jar +0 -0
- data/lib/mondrian/jars/olap4j-1.0.1.539.jar +0 -0
@@ -85,13 +85,13 @@ describe "Schema definition" do
|
|
85
85
|
XML
|
86
86
|
end
|
87
87
|
|
88
|
-
it "should render table name in uppercase when using Oracle or
|
88
|
+
it "should render table name in uppercase when using Oracle or Snowflake driver" do
|
89
89
|
@schema.define do
|
90
90
|
cube 'Sales' do
|
91
91
|
table 'sales_fact', :alias => 'sales', :schema => 'facts'
|
92
92
|
end
|
93
93
|
end
|
94
|
-
%w(oracle
|
94
|
+
%w(oracle snowflake).each do |driver|
|
95
95
|
@schema.to_xml(:driver => driver).should be_like <<-XML
|
96
96
|
<?xml version="1.0" encoding="UTF-8"?>
|
97
97
|
<Schema name="default">
|
@@ -119,13 +119,13 @@ describe "Schema definition" do
|
|
119
119
|
XML
|
120
120
|
end
|
121
121
|
|
122
|
-
it "should render table name in lowercase when using Oracle or
|
122
|
+
it "should render table name in lowercase when using Oracle or Snowflake driver but with :upcase_data_dictionary set to false" do
|
123
123
|
@schema.define :upcase_data_dictionary => false do
|
124
124
|
cube 'Sales' do
|
125
125
|
table 'sales_fact', :alias => 'sales', :schema => 'facts'
|
126
126
|
end
|
127
127
|
end
|
128
|
-
%w(oracle
|
128
|
+
%w(oracle snowflake).each do |driver|
|
129
129
|
@schema.to_xml(:driver => driver).should be_like <<-XML
|
130
130
|
<?xml version="1.0" encoding="UTF-8"?>
|
131
131
|
<Schema name="default">
|
@@ -191,7 +191,9 @@ describe "Schema definition" do
|
|
191
191
|
all_member_name 'All Genders'
|
192
192
|
primary_key 'customer_id'
|
193
193
|
table 'customer'
|
194
|
-
level 'Gender', :column => 'gender', :unique_members => true
|
194
|
+
level 'Gender', :column => 'gender', :unique_members => true,
|
195
|
+
# Test attribute with a future value
|
196
|
+
:approx_row_count => Thread.new { sleep 0.1; 2 }
|
195
197
|
end
|
196
198
|
end
|
197
199
|
end
|
@@ -203,7 +205,7 @@ describe "Schema definition" do
|
|
203
205
|
<Dimension foreignKey="customer_id" name="Gender">
|
204
206
|
<Hierarchy allMemberName="All Genders" hasAll="true" primaryKey="customer_id">
|
205
207
|
<Table name="customer"/>
|
206
|
-
<Level column="gender" name="Gender" uniqueMembers="true"/>
|
208
|
+
<Level approxRowCount="2" column="gender" name="Gender" uniqueMembers="true"/>
|
207
209
|
</Hierarchy>
|
208
210
|
</Dimension>
|
209
211
|
</Cube>
|
@@ -549,6 +551,27 @@ describe "Schema definition" do
|
|
549
551
|
XML
|
550
552
|
end
|
551
553
|
|
554
|
+
it "should render XML with dimension and hierarchy" do
|
555
|
+
@schema.define do
|
556
|
+
cube 'Sales' do
|
557
|
+
calculated_member 'Current week' do
|
558
|
+
hierarchy '[Time.Weekly]'
|
559
|
+
formula '[Time.Weekly].[Week].CurrentDateMember'
|
560
|
+
end
|
561
|
+
end
|
562
|
+
end
|
563
|
+
@schema.to_xml.should be_like <<-XML
|
564
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
565
|
+
<Schema name="default">
|
566
|
+
<Cube name="Sales">
|
567
|
+
<CalculatedMember hierarchy="[Time.Weekly]" name="Current week">
|
568
|
+
<Formula>[Time.Weekly].[Week].CurrentDateMember</Formula>
|
569
|
+
</CalculatedMember>
|
570
|
+
</Cube>
|
571
|
+
</Schema>
|
572
|
+
XML
|
573
|
+
end
|
574
|
+
|
552
575
|
it "should render embedded cube XML defintion before additional calculated member to XML" do
|
553
576
|
@schema.define do
|
554
577
|
cube 'Sales' do
|
@@ -765,65 +788,86 @@ describe "Schema definition" do
|
|
765
788
|
end
|
766
789
|
|
767
790
|
describe "Element annotations" do
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
annotation 'key1', 'value1'
|
773
|
-
annotation 'key2', 'value2'
|
774
|
-
end
|
775
|
-
measure 'Unit Sales', :column => 'unit_sales' do
|
791
|
+
describe "block of elements" do
|
792
|
+
before do
|
793
|
+
@schema.define do
|
794
|
+
cube 'Sales' do
|
776
795
|
annotations do
|
777
|
-
annotation '
|
796
|
+
annotation 'key1', 'value1'
|
797
|
+
annotation 'key2', 'value2'
|
798
|
+
end
|
799
|
+
measure 'Unit Sales', :column => 'unit_sales' do
|
800
|
+
annotations do
|
801
|
+
annotation 'key3', 'value3'
|
802
|
+
end
|
778
803
|
end
|
779
804
|
end
|
780
805
|
end
|
781
806
|
end
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
<Annotation name="key2">value2</Annotation>
|
789
|
-
</Annotations>
|
790
|
-
<Measure aggregator="sum" column="unit_sales" name="Unit Sales">
|
807
|
+
|
808
|
+
it "should render XML" do
|
809
|
+
@schema.to_xml.should be_like <<-XML
|
810
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
811
|
+
<Schema name="default">
|
812
|
+
<Cube name="Sales">
|
791
813
|
<Annotations>
|
792
|
-
<Annotation name="
|
814
|
+
<Annotation name="key1">value1</Annotation>
|
815
|
+
<Annotation name="key2">value2</Annotation>
|
793
816
|
</Annotations>
|
794
|
-
|
795
|
-
|
796
|
-
|
797
|
-
|
817
|
+
<Measure aggregator="sum" column="unit_sales" name="Unit Sales">
|
818
|
+
<Annotations>
|
819
|
+
<Annotation name="key3">value3</Annotation>
|
820
|
+
</Annotations>
|
821
|
+
</Measure>
|
822
|
+
</Cube>
|
823
|
+
</Schema>
|
824
|
+
XML
|
825
|
+
end
|
826
|
+
|
827
|
+
it "should access annotations from schema definition" do
|
828
|
+
@schema.cubes.first.annotations_hash.should == {'key1' => 'value1', 'key2' => 'value2'}
|
829
|
+
end
|
798
830
|
end
|
799
831
|
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
832
|
+
describe "from hash options" do
|
833
|
+
before do
|
834
|
+
@schema.define do
|
835
|
+
cube 'Sales' do
|
836
|
+
annotations :key1 => 'value1', :key2 => 'value2'
|
837
|
+
measure 'Unit Sales', :column => 'unit_sales', :annotations => {:key3 => 'value3'}
|
838
|
+
end
|
805
839
|
end
|
806
840
|
end
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
<Annotation name="key2">value2</Annotation>
|
814
|
-
</Annotations>
|
815
|
-
<Measure aggregator="sum" column="unit_sales" name="Unit Sales">
|
841
|
+
|
842
|
+
it "should render XML " do
|
843
|
+
@schema.to_xml.should be_like <<-XML
|
844
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
845
|
+
<Schema name="default">
|
846
|
+
<Cube name="Sales">
|
816
847
|
<Annotations>
|
817
|
-
<Annotation name="
|
848
|
+
<Annotation name="key1">value1</Annotation>
|
849
|
+
<Annotation name="key2">value2</Annotation>
|
818
850
|
</Annotations>
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
851
|
+
<Measure aggregator="sum" column="unit_sales" name="Unit Sales">
|
852
|
+
<Annotations>
|
853
|
+
<Annotation name="key3">value3</Annotation>
|
854
|
+
</Annotations>
|
855
|
+
</Measure>
|
856
|
+
</Cube>
|
857
|
+
</Schema>
|
858
|
+
XML
|
859
|
+
end
|
860
|
+
|
861
|
+
it "should access annotations from schema definition" do
|
862
|
+
@schema.cubes.first.annotations_hash.should == {'key1' => 'value1', 'key2' => 'value2'}
|
863
|
+
@schema.cubes.first.measures.first.annotations_hash.should == {'key3' => 'value3'}
|
864
|
+
end
|
823
865
|
end
|
824
866
|
end
|
825
867
|
|
826
868
|
describe "User defined functions and formatters in JavaScript" do
|
869
|
+
next pending "not supported by Mondrian in Java 8" if ENV_JAVA["java.version"] >= "1.8"
|
870
|
+
|
827
871
|
before(:each) do
|
828
872
|
@schema.define do
|
829
873
|
cube 'Sales' do
|
@@ -957,6 +1001,8 @@ describe "Schema definition" do
|
|
957
1001
|
end
|
958
1002
|
|
959
1003
|
describe "User defined functions and formatters in CoffeeScript" do
|
1004
|
+
next pending "not supported by Mondrian in Java 8" if ENV_JAVA["java.version"] >= "1.8"
|
1005
|
+
|
960
1006
|
before(:each) do
|
961
1007
|
@schema.define do
|
962
1008
|
cube 'Sales' do
|
@@ -976,11 +1022,11 @@ describe "Schema definition" do
|
|
976
1022
|
dimension 'Measures'
|
977
1023
|
formula 'Factorial(6)'
|
978
1024
|
cell_formatter do
|
979
|
-
coffeescript <<-
|
1025
|
+
coffeescript <<-CS
|
980
1026
|
s = value.toString()
|
981
1027
|
s = "0" + s while s.length < 20
|
982
1028
|
s
|
983
|
-
|
1029
|
+
CS
|
984
1030
|
end
|
985
1031
|
end
|
986
1032
|
calculated_member 'City' do
|
@@ -989,30 +1035,30 @@ describe "Schema definition" do
|
|
989
1035
|
end
|
990
1036
|
end
|
991
1037
|
user_defined_function 'Factorial' do
|
992
|
-
coffeescript <<-
|
1038
|
+
coffeescript <<-CS
|
993
1039
|
parameters: ["Numeric"]
|
994
1040
|
returns: "Numeric"
|
995
1041
|
execute: (n) ->
|
996
1042
|
if n <= 1 then 1 else n * @execute(n - 1)
|
997
|
-
|
1043
|
+
CS
|
998
1044
|
end
|
999
1045
|
user_defined_function 'UpperName' do
|
1000
|
-
coffeescript <<-
|
1046
|
+
coffeescript <<-CS
|
1001
1047
|
parameters: ["Member"]
|
1002
1048
|
returns: "String"
|
1003
1049
|
syntax: "Property"
|
1004
1050
|
execute: (member) ->
|
1005
1051
|
member.getName().toUpperCase()
|
1006
|
-
|
1052
|
+
CS
|
1007
1053
|
end
|
1008
1054
|
user_defined_function 'toUpperName' do
|
1009
|
-
coffeescript <<-
|
1055
|
+
coffeescript <<-CS
|
1010
1056
|
parameters: ["Member", "String"]
|
1011
1057
|
returns: "String"
|
1012
1058
|
syntax: "Method"
|
1013
1059
|
execute: (member, dummy) ->
|
1014
1060
|
member.getName().toUpperCase()
|
1015
|
-
|
1061
|
+
CS
|
1016
1062
|
end
|
1017
1063
|
end
|
1018
1064
|
@olap = Mondrian::OLAP::Connection.create(CONNECTION_PARAMS.merge :schema => @schema)
|
@@ -1059,12 +1105,21 @@ describe "Schema definition" do
|
|
1059
1105
|
@schema.define do
|
1060
1106
|
cube 'Sales' do
|
1061
1107
|
table 'sales'
|
1062
|
-
dimension '
|
1063
|
-
hierarchy :
|
1108
|
+
dimension 'Time', foreign_key: 'time_id' do
|
1109
|
+
hierarchy all_member_name: 'All Time', primary_key: 'time_id' do
|
1110
|
+
table 'time_by_day'
|
1111
|
+
level 'Year', column: 'the_year', type: 'Numeric'
|
1112
|
+
level 'Quarter', column: 'quarter'
|
1113
|
+
level 'Month', column: 'month_of_year', type: 'Numeric'
|
1114
|
+
level 'Day', column: 'day_of_month', type: 'Numeric'
|
1115
|
+
end
|
1116
|
+
end
|
1117
|
+
dimension 'Customers', foreign_key: 'customer_id' do
|
1118
|
+
hierarchy all_member_name: 'All Customers', primary_key: 'id' do
|
1064
1119
|
table 'customers'
|
1065
|
-
level 'Name', :
|
1120
|
+
level 'Name', column: 'fullname' do
|
1066
1121
|
member_formatter { ruby {|member| member.getName().upcase } }
|
1067
|
-
property 'City', :
|
1122
|
+
property 'City', column: 'city' do
|
1068
1123
|
property_formatter { ruby {|member, property_name, property_value| property_value.upcase} }
|
1069
1124
|
end
|
1070
1125
|
end
|
@@ -1149,8 +1204,38 @@ describe "Schema definition" do
|
|
1149
1204
|
end
|
1150
1205
|
end
|
1151
1206
|
end
|
1207
|
+
user_defined_function 'ChildrenSet' do
|
1208
|
+
ruby do
|
1209
|
+
parameters :member
|
1210
|
+
returns :member_set
|
1211
|
+
syntax :function
|
1212
|
+
def call_with_evaluator(evaluator, member)
|
1213
|
+
evaluator.getSchemaReader.getMemberChildren(member)
|
1214
|
+
end
|
1215
|
+
end
|
1216
|
+
end
|
1217
|
+
user_defined_function 'SetFirstTuple' do
|
1218
|
+
ruby do
|
1219
|
+
parameters :set
|
1220
|
+
returns :tuple
|
1221
|
+
syntax :function
|
1222
|
+
def call_with_evaluator(evaluator, set)
|
1223
|
+
set.first
|
1224
|
+
end
|
1225
|
+
end
|
1226
|
+
end
|
1227
|
+
user_defined_function 'SetFirstTuples' do
|
1228
|
+
ruby do
|
1229
|
+
parameters :tuple_set, :numeric
|
1230
|
+
returns :tuple_set
|
1231
|
+
syntax :function
|
1232
|
+
def call_with_evaluator(evaluator, set, count)
|
1233
|
+
set.to_a[0, count]
|
1234
|
+
end
|
1235
|
+
end
|
1236
|
+
end
|
1152
1237
|
end
|
1153
|
-
@olap = Mondrian::OLAP::Connection.create(CONNECTION_PARAMS.merge :
|
1238
|
+
@olap = Mondrian::OLAP::Connection.create(CONNECTION_PARAMS.merge schema: @schema)
|
1154
1239
|
end
|
1155
1240
|
|
1156
1241
|
it "should execute user defined function" do
|
@@ -1225,6 +1310,35 @@ describe "Schema definition" do
|
|
1225
1310
|
result.values[i].should == [first_member.name.upcase]
|
1226
1311
|
end
|
1227
1312
|
end
|
1313
|
+
|
1314
|
+
it "should execute user defined functions with a member set result" do
|
1315
|
+
result = @olap.from('Sales').
|
1316
|
+
with_member('[Measures].[Children Set]').as("SetToStr(ChildrenSet([Customers].CurrentMember))").
|
1317
|
+
columns('[Measures].[Children Set]').rows('[Customers].DefaultMember').execute
|
1318
|
+
result.row_members.each_with_index do |member, i|
|
1319
|
+
result.values[i].first.should == "{#{member.children.map(&:full_name).join(', ')}}"
|
1320
|
+
end
|
1321
|
+
end
|
1322
|
+
|
1323
|
+
it "should execute user defined functions with a tuple result" do
|
1324
|
+
result = @olap.from('Sales').
|
1325
|
+
with_member('[Measures].[First Tuple]').
|
1326
|
+
as("TupleToStr(SetFirstTuple([Customers].CurrentMember.Children * [Time].DefaultMember))").
|
1327
|
+
columns('[Measures].[First Tuple]').rows('[Customers].DefaultMember').execute
|
1328
|
+
result.row_members.each_with_index do |member, i|
|
1329
|
+
result.values[i].first.should == "(#{member.children.first.full_name}, [Time].[All Time])"
|
1330
|
+
end
|
1331
|
+
end
|
1332
|
+
|
1333
|
+
it "should execute user defined functions with a tuple result" do
|
1334
|
+
result = @olap.from('Sales').
|
1335
|
+
with_member('[Measures].[First Tuple]').
|
1336
|
+
as("SetToStr(SetFirstTuples([Customers].CurrentMember.Children * [Time].DefaultMember, 1))").
|
1337
|
+
columns('[Measures].[First Tuple]').rows('[Customers].DefaultMember').execute
|
1338
|
+
result.row_members.each_with_index do |member, i|
|
1339
|
+
result.values[i].first.should == "{(#{member.children.first.full_name}, [Time].[All Time])}"
|
1340
|
+
end
|
1341
|
+
end
|
1228
1342
|
end
|
1229
1343
|
|
1230
1344
|
describe "Shared user defined functions in Ruby" do
|
@@ -1328,6 +1442,15 @@ describe "Schema definition" do
|
|
1328
1442
|
@olap.cube('Sales').member('[Measures].[Unit Sales]').cell_formatter_name.should be_nil
|
1329
1443
|
end
|
1330
1444
|
|
1445
|
+
it "should get measure cell formatter" do
|
1446
|
+
@olap.cube('Sales').member('[Measures].[Factorial]').cell_formatter.class.name.should ==
|
1447
|
+
'Mondrian::OLAP::Schema::CellFormatter::Integer20DigitsUdf'
|
1448
|
+
end
|
1449
|
+
|
1450
|
+
it "should not get measure cell formatter if not specified" do
|
1451
|
+
@olap.cube('Sales').member('[Measures].[Unit Sales]').cell_formatter.should be_nil
|
1452
|
+
end
|
1453
|
+
|
1331
1454
|
it "should get measure format string" do
|
1332
1455
|
@olap.cube('Sales').member('[Measures].[Unit Sales]').format_string.should == '#,##0'
|
1333
1456
|
end
|
@@ -1373,6 +1496,136 @@ describe "Schema definition" do
|
|
1373
1496
|
end
|
1374
1497
|
end
|
1375
1498
|
|
1499
|
+
describe "Parameters" do
|
1500
|
+
before(:each) do
|
1501
|
+
@schema.define do
|
1502
|
+
parameter 'Current User', :type => 'String', :modifiable => true, :default_value => "'demo'"
|
1503
|
+
parameter 'Current User 1', :type => 'String', :modifiable => true, :default_value => "''"
|
1504
|
+
parameter 'Default User', :type => 'String', :modifiable => false, :default_value => "'default'"
|
1505
|
+
cube 'Sales' do
|
1506
|
+
table 'sales'
|
1507
|
+
measure 'Unit Sales', :column => 'unit_sales', :aggregator => 'sum'
|
1508
|
+
end
|
1509
|
+
user_defined_function 'ParameterValue' do
|
1510
|
+
ruby :shared do
|
1511
|
+
parameters :string
|
1512
|
+
returns :scalar
|
1513
|
+
syntax :function
|
1514
|
+
def call_with_evaluator(evaluator, parameter_name)
|
1515
|
+
parameter = evaluator.getQuery.getSchemaReader(false).getParameter(parameter_name)
|
1516
|
+
parameter && parameter.getValue
|
1517
|
+
end
|
1518
|
+
end
|
1519
|
+
end
|
1520
|
+
end
|
1521
|
+
@olap = Mondrian::OLAP::Connection.create(CONNECTION_PARAMS.merge :schema => @schema)
|
1522
|
+
end
|
1523
|
+
|
1524
|
+
it "should render XML" do
|
1525
|
+
@schema.to_xml.should be_like <<-XML
|
1526
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
1527
|
+
<Schema name="default">
|
1528
|
+
<Parameter defaultValue="'demo'" modifiable="true" name="Current User" type="String"/>
|
1529
|
+
<Parameter defaultValue="''" modifiable="true" name="Current User 1" type="String"/>
|
1530
|
+
<Parameter defaultValue="'default'" modifiable="false" name="Default User" type="String"/>
|
1531
|
+
<Cube name="Sales">
|
1532
|
+
<Table name="sales"/>
|
1533
|
+
<Measure aggregator="sum" column="unit_sales" name="Unit Sales"/>
|
1534
|
+
</Cube>
|
1535
|
+
<UserDefinedFunction className="rubyobj.Mondrian.OLAP.Schema.UserDefinedFunction.ParametervalueUdf" name="ParameterValue"/>
|
1536
|
+
</Schema>
|
1537
|
+
XML
|
1538
|
+
end
|
1539
|
+
|
1540
|
+
it "should get parameter definition from connection" do
|
1541
|
+
parameter = @olap.mondrian_parameter('Current User')
|
1542
|
+
parameter.should_not be_nil
|
1543
|
+
parameter.name.should == 'Current User'
|
1544
|
+
parameter.description.should be_nil
|
1545
|
+
parameter.should be_modifiable
|
1546
|
+
parameter.scope.to_s.should == 'Schema'
|
1547
|
+
parameter.type.to_s.should == 'STRING'
|
1548
|
+
end
|
1549
|
+
|
1550
|
+
it "should not get parameter definition with invalid name" do
|
1551
|
+
@olap.mondrian_parameter('Current User 2').should be_nil
|
1552
|
+
end
|
1553
|
+
|
1554
|
+
it "should get default parameter value with ParamRef" do
|
1555
|
+
result = @olap.from('Sales').
|
1556
|
+
with_member('[Measures].[Current User]').as("ParamRef('Current User')").
|
1557
|
+
columns('[Measures].[Current User]').execute
|
1558
|
+
result.values.should == ['demo']
|
1559
|
+
end
|
1560
|
+
|
1561
|
+
it "should execute query with schema parameter value and get value with ParamRef" do
|
1562
|
+
result = @olap.from('Sales').
|
1563
|
+
with_member('[Measures].[Current User]').as("ParamRef('Current User 1')").
|
1564
|
+
columns('[Measures].[Current User]').execute("Current User 1" => "test")
|
1565
|
+
result.values.should == ['test']
|
1566
|
+
end
|
1567
|
+
|
1568
|
+
it "should execute query with query parameter value and get value with Parameter" do
|
1569
|
+
result = @olap.from('Sales').
|
1570
|
+
with_member('[Measures].[Current User]').as("Parameter('Current User 2', String, 'demo2')").
|
1571
|
+
columns('[Measures].[Current User]').execute("Current User 2" => "test2")
|
1572
|
+
result.values.should == ['test2']
|
1573
|
+
end
|
1574
|
+
|
1575
|
+
# can be used in user defined functions
|
1576
|
+
it "should execute query with additional defined parameter string value" do
|
1577
|
+
result = @olap.from('Sales').
|
1578
|
+
with_member('[Measures].[Parameter]').as("ParameterValue('String Parameter')").
|
1579
|
+
columns('[Measures].[Parameter]').execute(:define_parameters => {"String Parameter" => "test"})
|
1580
|
+
result.values.should == ['test']
|
1581
|
+
end
|
1582
|
+
|
1583
|
+
it "should execute query with additional defined parameter integer value" do
|
1584
|
+
result = @olap.from('Sales').
|
1585
|
+
with_member('[Measures].[Parameter]').as("ParameterValue('Integer Parameter')").
|
1586
|
+
columns('[Measures].[Parameter]').execute(:define_parameters => {"Integer Parameter" => 123})
|
1587
|
+
result.values.should == [123]
|
1588
|
+
end
|
1589
|
+
|
1590
|
+
it "should execute query with additional defined parameter double value" do
|
1591
|
+
result = @olap.from('Sales').
|
1592
|
+
with_member('[Measures].[Parameter]').as("ParameterValue('Double Parameter')").
|
1593
|
+
columns('[Measures].[Parameter]').execute(:define_parameters => {"Double Parameter" => 123.456})
|
1594
|
+
result.values.should == [123.456]
|
1595
|
+
end
|
1596
|
+
|
1597
|
+
it "should execute query with additional defined parameter nil value" do
|
1598
|
+
result = @olap.from('Sales').
|
1599
|
+
with_member('[Measures].[Parameter]').as("ParameterValue('Nil Parameter')").
|
1600
|
+
columns('[Measures].[Parameter]').execute(:define_parameters => {"Nil Parameter" => nil})
|
1601
|
+
result.values.should == [nil]
|
1602
|
+
end
|
1603
|
+
|
1604
|
+
it "should fail if executing with invalid parameter name" do
|
1605
|
+
expect {
|
1606
|
+
@olap.from('Sales').
|
1607
|
+
with_member('[Measures].[Current User]').as("'dummy'").
|
1608
|
+
columns('[Measures].[Current User]').execute("Current User 2" => "test2")
|
1609
|
+
}.to raise_error {|e|
|
1610
|
+
e.should be_kind_of(Mondrian::OLAP::Error)
|
1611
|
+
e.message.should == "mondrian.olap.MondrianException: Mondrian Error:Unknown parameter 'Current User 2'"
|
1612
|
+
e.root_cause_message.should == "Unknown parameter 'Current User 2'"
|
1613
|
+
}
|
1614
|
+
end
|
1615
|
+
|
1616
|
+
it "should fail if executing with non-modifiable parameter" do
|
1617
|
+
expect {
|
1618
|
+
@olap.from('Sales').
|
1619
|
+
with_member('[Measures].[Current User]').as("'dummy'").
|
1620
|
+
columns('[Measures].[Current User]').execute("Default User" => "test")
|
1621
|
+
}.to raise_error {|e|
|
1622
|
+
e.should be_kind_of(Mondrian::OLAP::Error)
|
1623
|
+
e.message.should == "mondrian.olap.MondrianException: Mondrian Error:Parameter 'Default User' (defined at 'Schema' scope) is not modifiable"
|
1624
|
+
e.root_cause_message.should == "Parameter 'Default User' (defined at 'Schema' scope) is not modifiable"
|
1625
|
+
}
|
1626
|
+
end
|
1627
|
+
end
|
1628
|
+
|
1376
1629
|
end
|
1377
1630
|
|
1378
1631
|
describe "connection with schema" do
|