mondrian-olap 1.1.0 → 1.3.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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +33 -0
  3. data/LICENSE-Mondrian.txt +87 -0
  4. data/LICENSE.txt +1 -1
  5. data/README.md +4 -4
  6. data/VERSION +1 -1
  7. data/lib/mondrian/jars/guava-17.0.jar +0 -0
  8. data/lib/mondrian/jars/log4j-api-2.17.1.jar +0 -0
  9. data/lib/mondrian/jars/log4j-core-2.17.1.jar +0 -0
  10. data/lib/mondrian/jars/log4j2-config.jar +0 -0
  11. data/lib/mondrian/jars/mondrian-9.3.0.0.jar +0 -0
  12. data/lib/mondrian/olap/connection.rb +126 -73
  13. data/lib/mondrian/olap/cube.rb +46 -4
  14. data/lib/mondrian/olap/error.rb +10 -2
  15. data/lib/mondrian/olap/query.rb +1 -0
  16. data/lib/mondrian/olap/result.rb +132 -56
  17. data/lib/mondrian/olap/schema.rb +9 -3
  18. data/lib/mondrian/olap/schema_element.rb +6 -3
  19. data/lib/mondrian/olap/schema_udf.rb +8 -82
  20. data/lib/mondrian/olap.rb +11 -7
  21. data/spec/connection_role_spec.rb +4 -1
  22. data/spec/connection_spec.rb +38 -5
  23. data/spec/cube_cache_control_spec.rb +7 -17
  24. data/spec/cube_spec.rb +36 -2
  25. data/spec/fixtures/MondrianTest.xml +40 -6
  26. data/spec/fixtures/MondrianTestOracle.xml +40 -6
  27. data/spec/mondrian_spec.rb +203 -1
  28. data/spec/query_spec.rb +94 -25
  29. data/spec/rake_tasks.rb +319 -165
  30. data/spec/schema_definition_spec.rb +8 -241
  31. data/spec/spec_helper.rb +330 -112
  32. data/spec/support/data/customers.csv +10902 -0
  33. data/spec/support/data/product_classes.csv +101 -0
  34. data/spec/support/data/products.csv +101 -0
  35. data/spec/support/data/promotions.csv +11 -0
  36. data/spec/support/data/sales.csv +101 -0
  37. data/spec/support/data/time.csv +731 -0
  38. data/spec/support/data/warehouse.csv +101 -0
  39. data/spec/support/matchers/be_like.rb +1 -0
  40. metadata +42 -83
  41. data/LICENSE-Mondrian.html +0 -259
  42. data/lib/mondrian/jars/log4j-1.2.17.jar +0 -0
  43. data/lib/mondrian/jars/log4j.properties +0 -3
  44. data/lib/mondrian/jars/mondrian-8.3.0.5.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 LucidDB driver" do
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 luciddb).each do |driver|
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 LucidDB driver but with :upcase_data_dictionary set to false" do
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 luciddb).each do |driver|
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>
@@ -863,241 +865,6 @@ describe "Schema definition" do
863
865
  end
864
866
  end
865
867
 
866
- describe "User defined functions and formatters in JavaScript" do
867
- next pending "not supported by Mondrian in Java 8" if ENV_JAVA["java.version"] >= "1.8"
868
-
869
- before(:each) do
870
- @schema.define do
871
- cube 'Sales' do
872
- table 'sales'
873
- dimension 'Customers', :foreign_key => 'customer_id' do
874
- hierarchy :has_all => true, :all_member_name => 'All Customers', :primary_key => 'id' do
875
- table 'customers'
876
- level 'Name', :column => 'fullname' do
877
- member_formatter { javascript "return member.getName().toUpperCase();" }
878
- property 'City', :column => 'city' do
879
- property_formatter { javascript "return propertyValue.toUpperCase();" }
880
- end
881
- end
882
- end
883
- end
884
- calculated_member 'Factorial' do
885
- dimension 'Measures'
886
- formula 'Factorial(6)'
887
- cell_formatter do
888
- javascript <<-JS
889
- var s = value.toString();
890
- while (s.length < 20) {
891
- s = "0" + s;
892
- }
893
- return s;
894
- JS
895
- end
896
- end
897
- calculated_member 'City' do
898
- dimension 'Measures'
899
- formula "[Customers].CurrentMember.Properties('City')"
900
- end
901
- end
902
- user_defined_function 'Factorial' do
903
- javascript <<-JS
904
- function getParameterTypes() {
905
- return new Array(
906
- new mondrian.olap.type.NumericType());
907
- }
908
- function getReturnType(parameterTypes) {
909
- return new mondrian.olap.type.NumericType();
910
- }
911
- function execute(evaluator, arguments) {
912
- var n = arguments[0].evaluateScalar(evaluator);
913
- return factorial(n);
914
- }
915
- function factorial(n) {
916
- return n <= 1 ? 1 : n * factorial(n - 1);
917
- }
918
- JS
919
- end
920
- end
921
- @olap = Mondrian::OLAP::Connection.create(CONNECTION_PARAMS.merge :schema => @schema)
922
- end
923
-
924
- it "should render XML" do
925
- @schema.to_xml.should be_like <<-XML
926
- <?xml version="1.0" encoding="UTF-8"?>
927
- <Schema name="default">
928
- <Cube name="Sales">
929
- <Table name="sales"/>
930
- <Dimension foreignKey="customer_id" name="Customers">
931
- <Hierarchy allMemberName="All Customers" hasAll="true" primaryKey="id">
932
- <Table name="customers"/>
933
- <Level column="fullname" name="Name" uniqueMembers="true">
934
- <MemberFormatter>
935
- <Script language="JavaScript">return member.getName().toUpperCase();</Script>
936
- </MemberFormatter>
937
- <Property column="city" name="City">
938
- <PropertyFormatter>
939
- <Script language="JavaScript">return propertyValue.toUpperCase();</Script>
940
- </PropertyFormatter>
941
- </Property>
942
- </Level>
943
- </Hierarchy>
944
- </Dimension>
945
- <CalculatedMember dimension="Measures" name="Factorial">
946
- <Formula>Factorial(6)</Formula>
947
- <CellFormatter>
948
- <Script language="JavaScript">
949
- var s = value.toString();
950
- while (s.length &lt; 20) {
951
- s = "0" + s;
952
- }
953
- return s;
954
- </Script>
955
- </CellFormatter>
956
- </CalculatedMember>
957
- <CalculatedMember dimension="Measures" name="City">
958
- <Formula>[Customers].CurrentMember.Properties('City')</Formula>
959
- </CalculatedMember>
960
- </Cube>
961
- <UserDefinedFunction name="Factorial">
962
- <Script language="JavaScript">
963
- function getParameterTypes() {
964
- return new Array(
965
- new mondrian.olap.type.NumericType());
966
- }
967
- function getReturnType(parameterTypes) {
968
- return new mondrian.olap.type.NumericType();
969
- }
970
- function execute(evaluator, arguments) {
971
- var n = arguments[0].evaluateScalar(evaluator);
972
- return factorial(n);
973
- }
974
- function factorial(n) {
975
- return n &lt;= 1 ? 1 : n * factorial(n - 1);
976
- }
977
- </Script>
978
- </UserDefinedFunction>
979
- </Schema>
980
- XML
981
- end
982
-
983
- it "should execute user defined function" do
984
- result = @olap.from('Sales').columns('[Measures].[Factorial]').execute
985
- value = 1*2*3*4*5*6
986
- result.values.should == [value]
987
- result.formatted_values.should == ["%020d" % value]
988
- end
989
-
990
- it "should format members and properties" do
991
- result = @olap.from('Sales').columns('[Measures].[City]').rows('[Customers].[All Customers].Children').execute
992
- result.row_members.each_with_index do |member, i|
993
- member.caption.should == member.name.upcase
994
- city = member.property_value('City')
995
- result.formatted_values[i].first.should == city
996
- member.property_formatted_value('City').should == city.upcase
997
- end
998
- end
999
- end
1000
-
1001
- describe "User defined functions and formatters in CoffeeScript" do
1002
- next pending "not supported by Mondrian in Java 8" if ENV_JAVA["java.version"] >= "1.8"
1003
-
1004
- before(:each) do
1005
- @schema.define do
1006
- cube 'Sales' do
1007
- table 'sales'
1008
- dimension 'Customers', :foreign_key => 'customer_id' do
1009
- hierarchy :has_all => true, :all_member_name => 'All Customers', :primary_key => 'id' do
1010
- table 'customers'
1011
- level 'Name', :column => 'fullname' do
1012
- member_formatter { coffeescript "member.getName().toUpperCase()" }
1013
- property 'City', :column => 'city' do
1014
- property_formatter { coffeescript "propertyValue.toUpperCase()" }
1015
- end
1016
- end
1017
- end
1018
- end
1019
- calculated_member 'Factorial' do
1020
- dimension 'Measures'
1021
- formula 'Factorial(6)'
1022
- cell_formatter do
1023
- coffeescript <<-CS
1024
- s = value.toString()
1025
- s = "0" + s while s.length < 20
1026
- s
1027
- CS
1028
- end
1029
- end
1030
- calculated_member 'City' do
1031
- dimension 'Measures'
1032
- formula "[Customers].CurrentMember.Properties('City')"
1033
- end
1034
- end
1035
- user_defined_function 'Factorial' do
1036
- coffeescript <<-CS
1037
- parameters: ["Numeric"]
1038
- returns: "Numeric"
1039
- execute: (n) ->
1040
- if n <= 1 then 1 else n * @execute(n - 1)
1041
- CS
1042
- end
1043
- user_defined_function 'UpperName' do
1044
- coffeescript <<-CS
1045
- parameters: ["Member"]
1046
- returns: "String"
1047
- syntax: "Property"
1048
- execute: (member) ->
1049
- member.getName().toUpperCase()
1050
- CS
1051
- end
1052
- user_defined_function 'toUpperName' do
1053
- coffeescript <<-CS
1054
- parameters: ["Member", "String"]
1055
- returns: "String"
1056
- syntax: "Method"
1057
- execute: (member, dummy) ->
1058
- member.getName().toUpperCase()
1059
- CS
1060
- end
1061
- end
1062
- @olap = Mondrian::OLAP::Connection.create(CONNECTION_PARAMS.merge :schema => @schema)
1063
- end
1064
-
1065
- it "should execute user defined function" do
1066
- result = @olap.from('Sales').columns('[Measures].[Factorial]').execute
1067
- value = 1*2*3*4*5*6
1068
- result.values.should == [value]
1069
- result.formatted_values.should == ["%020d" % value]
1070
- end
1071
-
1072
- it "should format members and properties" do
1073
- result = @olap.from('Sales').columns('[Measures].[City]').rows('[Customers].[All Customers].Children').execute
1074
- result.row_members.each_with_index do |member, i|
1075
- member.caption.should == member.name.upcase
1076
- city = member.property_value('City')
1077
- result.formatted_values[i].first.should == city
1078
- member.property_formatted_value('City').should == city.upcase
1079
- end
1080
- end
1081
-
1082
- it "should execute user defined property on member" do
1083
- result = @olap.from('Sales').
1084
- with_member('[Measures].[Upper Name]').as('[Customers].CurrentMember.UpperName').
1085
- columns('[Measures].[Upper Name]').rows('[Customers].Children').execute
1086
- result.row_members.each_with_index do |member, i|
1087
- result.values[i].should == [member.name.upcase]
1088
- end
1089
- end
1090
-
1091
- it "should execute user defined method on member" do
1092
- result = @olap.from('Sales').
1093
- with_member('[Measures].[Upper Name]').as("[Customers].CurrentMember.toUpperName('dummy')").
1094
- columns('[Measures].[Upper Name]').rows('[Customers].Children').execute
1095
- result.row_members.each_with_index do |member, i|
1096
- result.values[i].should == [member.name.upcase]
1097
- end
1098
- end
1099
- end
1100
-
1101
868
  describe "User defined functions and formatters in Ruby" do
1102
869
  before(:each) do
1103
870
  @schema.define do