olap4r 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,6 +11,7 @@ GEM
11
11
  rdoc
12
12
  jruby-openssl (0.7.7)
13
13
  bouncy-castle-java (>= 1.5.0146.1)
14
+ json (1.7.3)
14
15
  json (1.7.3-java)
15
16
  olap4r-mondrian (0.1.0)
16
17
  olap4r-xmla (0.1.0)
@@ -29,6 +30,7 @@ GEM
29
30
 
30
31
  PLATFORMS
31
32
  java
33
+ ruby
32
34
 
33
35
  DEPENDENCIES
34
36
  bundler (~> 1.1.0)
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # olap4r
2
2
 
3
+ olap4r is a Ruby wrapper for olap4j library. It was open-sourced as a part of [data visualization and reporting tool - Rubbi](http://rubbi.net).
4
+
3
5
  ## Examples
4
6
 
5
7
  Create connection:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
@@ -1,7 +1,7 @@
1
1
  module Olap
2
2
  class QueryBuilder
3
3
  def initialize
4
- @select = { :columns => [], :rows => [] }
4
+ @select = {:columns => [], :rows => []}
5
5
  @from = nil
6
6
  @conditions = []
7
7
  end
@@ -49,13 +49,16 @@ module Olap
49
49
  field
50
50
  end
51
51
 
52
+ def extract_hierarchy(field)
53
+ field.match(/\[([^\]]+)\]/)[0]
54
+ end
55
+
52
56
  def build_axis axis
53
57
  return nil if @select[axis].empty?
54
58
 
55
59
  hierarchies = {}
56
60
  @select[axis].each do |field|
57
- hierarchy = field.match(/\[([^\]]+)\]/)[0]
58
-
61
+ hierarchy = extract_hierarchy(field)
59
62
  hierarchies[hierarchy] = [] if hierarchies[hierarchy].nil?
60
63
  hierarchies[hierarchy].push field
61
64
  end
@@ -102,12 +105,26 @@ module Olap
102
105
  crossjoined
103
106
  end
104
107
 
108
+ def build_conditions
109
+ filters_by_hierarchy = @conditions.inject({}) { |hash, c|
110
+ hierarchy = extract_hierarchy(c)
111
+ if !hash[hierarchy] then
112
+ hash[hierarchy] = [c]
113
+ else
114
+ hash[hierarchy] << c
115
+ end
116
+ hash
117
+ }
118
+ filters_by_hierarchy.collect { |k, v| (v.size > 1) ? "{#{v.join(', ')}}" : v }.join(' * ')
119
+ end
120
+
105
121
  def build_query
106
122
  query = []
107
123
 
108
124
  columns = build_axis :columns
109
125
  rows = build_axis :rows
110
126
 
127
+
111
128
  unless rows.nil? && columns.nil?
112
129
  query << "SELECT"
113
130
 
@@ -119,7 +136,7 @@ module Olap
119
136
  end
120
137
 
121
138
  query << "FROM #{@from}" unless @from.nil?
122
- query << "WHERE ( #{@conditions.join ", "} )" if @conditions.any?
139
+ query << "WHERE ( #{build_conditions} )" if @conditions.any?
123
140
 
124
141
  query.join " "
125
142
  end
@@ -128,4 +145,4 @@ module Olap
128
145
  field.scan(/\[([^\]]*)\]/).length
129
146
  end
130
147
  end
131
- end
148
+ end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "olap4r"
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Filip Tepper"]
12
- s.date = "2012-08-20"
12
+ s.date = "2012-10-22"
13
13
  s.description = "olap4j wrapper for JRuby"
14
14
  s.email = "filip@tepper.pl"
15
15
  s.extra_rdoc_files = [
@@ -95,6 +95,24 @@ shared_examples_for "an Olap::Connection driver" do
95
95
  end
96
96
  end
97
97
 
98
+ context "#execute query with conditions" do
99
+ let(:cellset) { connection.execute "SELECT { [Department] } ON COLUMNS, \
100
+ { [Position] } ON ROWS \
101
+ FROM [HR] \
102
+ WHERE ( {[Time].[1997].[Q1], [Time].[1997].[Q2], [Time].[1998].[Q1]} \
103
+ * {[Employees].[Sheri Nowmer].[Maya Gutierrez], [Employees].[Sheri Nowmer].[Darren Stanz]} \
104
+ * [Pay Type].[Hourly] \
105
+ * [Store Type].[Small Grocery] )" }
106
+
107
+ it "returns Olap::CellSet instance for successful queries" do
108
+ cellset.should be_a(Olap::CellSet)
109
+ end
110
+
111
+ it "returns cellset formatted values" do
112
+ cellset.values(:value).should =~ [[10.309]]
113
+ end
114
+ end
115
+
98
116
  context "#execute" do
99
117
  let(:cellset) { connection.execute "SELECT [Measures].[Unit Sales] ON COLUMNS, [Store] ON ROWS FROM [Sales]" }
100
118
 
@@ -109,7 +109,13 @@ describe Olap::QueryBuilder do
109
109
 
110
110
  it "adds multiple where conditions" do
111
111
  query_builder.where "[Measures].[Unit Sales]", "[Store].[All Stores]"
112
- query_builder.to_s.should == "WHERE ( [Measures].[Unit Sales], [Store].[All Stores] )"
112
+ query_builder.to_s.should == "WHERE ( [Measures].[Unit Sales] * [Store].[All Stores] )"
113
+ end
114
+
115
+
116
+ it "adds multiple where conditions correctly for conditions from the same dimension" do
117
+ query_builder.where "[Measures].[Unit Sales]", "[Store].[All Stores].[USA]", "[Store].[All Stores].[Canada]"
118
+ query_builder.to_s.should == "WHERE ( [Measures].[Unit Sales] * {[Store].[All Stores].[USA], [Store].[All Stores].[Canada]} )"
113
119
  end
114
120
 
115
121
  it "builds the whole query with chaining" do
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: olap4r
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.0
5
+ version: 0.1.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Filip Tepper
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-08-20 00:00:00 Z
13
+ date: 2012-10-22 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: jruby-openssl