mondrian-olap 0.5.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|