old_sql 1.17.0 → 1.18.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +15 -3
- data/app/controllers/old_sql/report_controller.rb +6 -8
- data/app/views/layouts/old_sql/chart.html.erb +1 -0
- data/app/views/old_sql/report/chart.html.erb +5 -1
- data/app/views/old_sql/report/print.html.erb +5 -1
- data/app/views/old_sql/report/table.html.erb +5 -1
- data/lib/generators/old_sql/copy_assets_generator.rb +1 -0
- data/lib/generators/old_sql/templates/reports.yml.example +3 -0
- data/lib/generators/old_sql/templates/user_processor.rb.example +0 -2
- data/lib/old_sql/report_processor/base.rb +101 -73
- metadata +3 -3
data/README.md
CHANGED
@@ -13,15 +13,17 @@ Some features of Old SQL are:
|
|
13
13
|
and describe the layout of the report in an intuitive way.
|
14
14
|
- If you want more fine grained control, a custom report processor can parse the SQL.
|
15
15
|
- Simple to convert legacy reports into Old SQL reports.
|
16
|
-
* Multiple report views (jqGrid, HTML table, and chart)
|
17
|
-
*
|
18
|
-
even add Devise support to an existing model (by default users).
|
16
|
+
* Multiple report views (jqGrid, HTML table, and chart).
|
17
|
+
* Bar and Pie charts using Google Charts.
|
19
18
|
* In the report design all data is rounded to a precision that can be set in the old_sql initializer.
|
20
19
|
This feature can also be disabled in the initializer.
|
21
20
|
* Old SQL has rake tasks for running the reports and outputting the result as CSV. This can simplify testing.
|
22
21
|
It also allows reports to be run as a cron task.
|
23
22
|
* The look of Old SQL can be customized.
|
24
23
|
* Support for printing and exporting to CSV.
|
24
|
+
* Old SQL uses Devise for authentication, and will install it for you. It can
|
25
|
+
even add Devise support to an existing model (by default users).
|
26
|
+
* Support for multiple database connections.
|
25
27
|
|
26
28
|
Quick Setup and Demo
|
27
29
|
--------------------
|
@@ -40,9 +42,16 @@ Quick Setup and Demo
|
|
40
42
|
|
41
43
|
Screenshots
|
42
44
|
-----------
|
45
|
+
#### jqGrid
|
43
46
|
|
44
47
|
![jqGrid view](https://github.com/egonz/old_sql/raw/master/screenshots/jqgrid.png "jqGrid view")
|
48
|
+
|
49
|
+
#### HTML Table
|
50
|
+
|
45
51
|
![table view](https://github.com/egonz/old_sql/raw/master/screenshots/table.png "Table view")
|
52
|
+
|
53
|
+
#### Google Charts
|
54
|
+
|
46
55
|
![table view](https://github.com/egonz/old_sql/raw/master/screenshots/chart.png "Chart view")
|
47
56
|
|
48
57
|
Installation
|
@@ -86,6 +95,9 @@ Configure your reports config/old_sql/report.yml. An example configuration is cr
|
|
86
95
|
# 'report_view' is optional. It overrides the default_report_view defined in the initializer. It
|
87
96
|
# can be set to jqgrid, table, or chart.
|
88
97
|
#
|
98
|
+
# Optionally use 'report_db' to specify a class that extends ActiveRecord::Base. Use the require
|
99
|
+
# path for your class. E.g. foo/my_alternative_db.
|
100
|
+
#
|
89
101
|
# The 'fields' are the headers for the report.
|
90
102
|
|
91
103
|
user_jqgrid:
|
@@ -46,8 +46,7 @@ module OldSql
|
|
46
46
|
@height = OldSql.report_height
|
47
47
|
|
48
48
|
processor = load_base_processor
|
49
|
-
@report = processor.execute_query(@
|
50
|
-
@reports[@report_name]['report_processor'])
|
49
|
+
@report = processor.execute_query(@reports[@report_name],@start_date,@end_date,query_vars(@report_name))
|
51
50
|
|
52
51
|
render :template => "old_sql/report/table.html.erb"
|
53
52
|
end
|
@@ -63,8 +62,7 @@ module OldSql
|
|
63
62
|
@height = 500
|
64
63
|
|
65
64
|
processor = load_base_processor
|
66
|
-
@report = processor.execute_query(@
|
67
|
-
@reports[@report_name]['report_processor'])
|
65
|
+
@report = processor.execute_query(@reports[@report_name],@start_date,@end_date,query_vars(@report_name))
|
68
66
|
|
69
67
|
render :layout => 'old_sql/chart.html.erb', :template => "old_sql/report/chart.html.erb"
|
70
68
|
end
|
@@ -77,8 +75,7 @@ module OldSql
|
|
77
75
|
@report_sql_orig = params[:report_sql].downcase
|
78
76
|
|
79
77
|
processor = load_base_processor
|
80
|
-
@report = processor.execute_query(@
|
81
|
-
@reports[@report_name]['report_processor'])
|
78
|
+
@report = processor.execute_query(@reports[@report_name],@start_date,@end_date,query_vars(@report_name))
|
82
79
|
|
83
80
|
respond_to do |format|
|
84
81
|
format.json { render :json => @report.to_json}
|
@@ -115,8 +112,7 @@ module OldSql
|
|
115
112
|
@report_sql_orig = params[:report_sql].downcase
|
116
113
|
|
117
114
|
processor = load_base_processor
|
118
|
-
@report = processor.execute_query(@
|
119
|
-
@reports[@report_name]['report_processor'])
|
115
|
+
@report = processor.execute_query(@reports[@report_name],@start_date,@end_date,query_vars(@report_name))
|
120
116
|
|
121
117
|
render :template => "old_sql/report/print.html.erb"
|
122
118
|
end
|
@@ -194,11 +190,13 @@ module OldSql
|
|
194
190
|
end
|
195
191
|
|
196
192
|
def chart_data
|
193
|
+
return nil if @report.nil?
|
197
194
|
json = @report.values.first.to_json
|
198
195
|
json.html_safe
|
199
196
|
end
|
200
197
|
|
201
198
|
def chart_type
|
199
|
+
return nil if @report.nil?
|
202
200
|
@report.keys.first
|
203
201
|
end
|
204
202
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
<html>
|
2
2
|
<head>
|
3
3
|
<title><%=OldSql.report_select_page_title%></title>
|
4
|
+
<%= stylesheet_link_tag "old_sql/old_sql.css" %>
|
4
5
|
<!--Load the AJAX API-->
|
5
6
|
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
|
6
7
|
<%= javascript_include_tag "old_sql/chart.js" %>
|
@@ -1,3 +1,6 @@
|
|
1
|
+
<% if @report.nil? %>
|
2
|
+
The report has no data for this date range.
|
3
|
+
<% else %>
|
1
4
|
<script type="text/javascript">
|
2
5
|
var chart_title = "<%=@reports[@report_name]['description']%> Report";
|
3
6
|
var chart_type = "<%=chart_type%>";
|
@@ -7,4 +10,5 @@
|
|
7
10
|
var height = <%=@height%>;
|
8
11
|
</script>
|
9
12
|
|
10
|
-
<div id="chart_div"></div>
|
13
|
+
<div id="chart_div"></div>
|
14
|
+
<% end %>
|
@@ -1,3 +1,6 @@
|
|
1
|
+
<% if @report.nil? %>
|
2
|
+
The report has no data for this date range.
|
3
|
+
<% else %>
|
1
4
|
<%= stylesheet_link_tag "old_sql/table.css" %>
|
2
5
|
<%= javascript_include_tag "old_sql/table.js" %>
|
3
6
|
|
@@ -17,4 +20,5 @@
|
|
17
20
|
<% end %>
|
18
21
|
</tr>
|
19
22
|
<% end %>
|
20
|
-
</table>
|
23
|
+
</table>
|
24
|
+
<% end %>
|
@@ -17,6 +17,7 @@ module OldSql
|
|
17
17
|
copy_file "#{gem_path}/public/stylesheets/old_sql/old_sql.css", "#{app_path}/public/stylesheets/old_sql/old_sql.css"
|
18
18
|
copy_file "#{gem_path}/public/stylesheets/old_sql/old_sql.css", "#{app_path}/public/stylesheets/old_sql/table.css"
|
19
19
|
copy_file "#{gem_path}/app/views/layouts/old_sql/report.html.erb", "#{app_path}/app/views/layouts/old_sql/report.html.erb"
|
20
|
+
copy_file "#{gem_path}/app/views/layouts/old_sql/report.html.erb", "#{app_path}/app/views/layouts/old_sql/chart.html.erb"
|
20
21
|
end
|
21
22
|
|
22
23
|
private
|
@@ -18,6 +18,9 @@
|
|
18
18
|
# 'report_view' is optional. It overrides the default_report_view defined in the initializer. It
|
19
19
|
# can be set to jqgrid, table, or chart.
|
20
20
|
#
|
21
|
+
# Optionally use 'report_db' to specify a class that extends ActiveRecord::Base. Use the require
|
22
|
+
# path for your class. E.g. foo/my_alternative_db.
|
23
|
+
#
|
21
24
|
# The 'fields' are the headers for the report.
|
22
25
|
|
23
26
|
user_jqgrid:
|
@@ -3,7 +3,6 @@ require 'old_sql/report_design/model'
|
|
3
3
|
require 'old_sql/report_design/row'
|
4
4
|
require 'old_sql/report_design/cell'
|
5
5
|
require 'old_sql/report_design/cell_data'
|
6
|
-
|
7
6
|
require 'old_sql/report_design/chart_parser'
|
8
7
|
require 'old_sql/report_design/chart'
|
9
8
|
require 'old_sql/report_design/chart_item'
|
@@ -15,7 +14,50 @@ module OldSql
|
|
15
14
|
|
16
15
|
ROUND_PRECISION = OldSql.rounding_precision
|
17
16
|
|
18
|
-
def execute_query(
|
17
|
+
def execute_query(report_config, start_date, end_date, query_vars = nil)
|
18
|
+
sql = load_sql(report_config['report_sql'], start_date, end_date, query_vars)
|
19
|
+
query(sql, report_config)
|
20
|
+
|
21
|
+
return nil if @resultset.nil?
|
22
|
+
|
23
|
+
init
|
24
|
+
|
25
|
+
report_design = report_config['report_design']
|
26
|
+
|
27
|
+
if report_design
|
28
|
+
parse_design(report_design, @resultset) if report_design =~ /csv/
|
29
|
+
parse_chart_design(report_design, @resultset) if report_design =~ /yml/
|
30
|
+
else
|
31
|
+
loaded_sub_processor = load_sub_processor(report_config['report_processor'])
|
32
|
+
|
33
|
+
if loaded_sub_processor.nil?
|
34
|
+
parse(@resultset)
|
35
|
+
else
|
36
|
+
@data = loaded_sub_processor.parse(@resultset)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
@data
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
|
45
|
+
def add_row(cell_data = [], id = @id+1)
|
46
|
+
@data[:rows] << {id: id, cell: cell_data}
|
47
|
+
end
|
48
|
+
|
49
|
+
def round(value, precision = ROUND_PRECISION)
|
50
|
+
factor = 10.0**precision
|
51
|
+
(value*factor).round / factor
|
52
|
+
end
|
53
|
+
|
54
|
+
def isNumeric(s)
|
55
|
+
Float(s) != nil rescue false
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def load_sql(report_sql, start_date, end_date, query_vars)
|
19
61
|
vars = {:start_date => start_date, :end_date => end_date}
|
20
62
|
|
21
63
|
if !query_vars.nil?
|
@@ -24,10 +66,14 @@ module OldSql
|
|
24
66
|
|
25
67
|
template = File.read("#{Rails.root}/config/old_sql/report_sql/#{report_sql}.erb")
|
26
68
|
sql = Erubis::Eruby.new(template).result(vars)
|
69
|
+
end
|
27
70
|
|
71
|
+
def query sql, report_config
|
28
72
|
begin
|
29
73
|
#todo change to a reporting db
|
30
|
-
db =
|
74
|
+
db = db_connection(report_config['report_db'])
|
75
|
+
|
76
|
+
raise Exception("Unable to Establish a Database Connection") unless db.active?
|
31
77
|
|
32
78
|
@resultset = []
|
33
79
|
rec = db.select_all(sql)
|
@@ -35,34 +81,67 @@ module OldSql
|
|
35
81
|
@resultset << row
|
36
82
|
end
|
37
83
|
rescue Exception=>e
|
38
|
-
#todo log error
|
39
84
|
Rails.logger.error e
|
40
85
|
end
|
41
86
|
|
42
|
-
|
43
|
-
|
44
|
-
|
87
|
+
@resultset
|
88
|
+
end
|
89
|
+
|
90
|
+
def db_connection report_db
|
91
|
+
db = nil
|
92
|
+
if report_db.nil?
|
93
|
+
db = ActiveRecord::Base.connection();
|
45
94
|
else
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
95
|
+
require report_db
|
96
|
+
|
97
|
+
db_class_name = ""
|
98
|
+
first = true
|
99
|
+
|
100
|
+
report_db.split("/").each do |path|
|
101
|
+
db_class_name << "::" unless first
|
102
|
+
path.split("_").each {|c| db_class_name << c.capitalize }
|
103
|
+
first = false
|
52
104
|
end
|
105
|
+
|
106
|
+
db=eval(db_class_name).connection
|
53
107
|
end
|
54
108
|
|
55
|
-
|
109
|
+
db
|
56
110
|
end
|
57
|
-
|
58
|
-
def
|
59
|
-
|
60
|
-
|
111
|
+
|
112
|
+
def load_sub_processor sub_processor
|
113
|
+
return if sub_processor.nil?
|
114
|
+
|
115
|
+
loaded_sub_processor = nil
|
116
|
+
begin
|
117
|
+
require "old_sql/report_processor/#{sub_processor.downcase}"
|
118
|
+
loaded_sub_processor=eval("OldSql::ReportProcessor::#{sub_processor.gsub("_","")}").new
|
119
|
+
rescue Exception=>e
|
120
|
+
Rails.logger.error e.message
|
121
|
+
end
|
122
|
+
|
123
|
+
loaded_sub_processor
|
124
|
+
end
|
125
|
+
|
126
|
+
def init
|
127
|
+
@rec = @resultset[0]
|
128
|
+
@id = 0
|
129
|
+
@data = {}
|
130
|
+
@data[:rows] = []
|
131
|
+
|
132
|
+
init_jqgrid_data
|
61
133
|
end
|
134
|
+
|
135
|
+
def init_jqgrid_data(page=1, total=1, records=1)
|
136
|
+
@data[:page]=page
|
137
|
+
@data[:total]=total
|
138
|
+
@data[:records]=records
|
139
|
+
end
|
140
|
+
|
62
141
|
|
63
142
|
def parse(resultset)
|
64
|
-
|
65
|
-
|
143
|
+
init_jqgrid_data
|
144
|
+
|
66
145
|
resultset.each do |r|
|
67
146
|
cell = []
|
68
147
|
r.each do |key, value|
|
@@ -75,14 +154,8 @@ module OldSql
|
|
75
154
|
end
|
76
155
|
|
77
156
|
def parse_design(design, resultset)
|
78
|
-
init(resultset)
|
79
|
-
|
80
|
-
return nil if @rec.nil?
|
81
|
-
|
82
157
|
model = OldSql::ReportDesign::Parser.read_file("#{design}")
|
83
158
|
|
84
|
-
init(resultset)
|
85
|
-
|
86
159
|
model.rows.each do |row|
|
87
160
|
report_row = []
|
88
161
|
row.cells.each do |cell|
|
@@ -116,13 +189,13 @@ module OldSql
|
|
116
189
|
|
117
190
|
def parse_chart_design(design, resultset)
|
118
191
|
report_row = []
|
119
|
-
|
120
|
-
|
192
|
+
|
121
193
|
chart = OldSql::ReportDesign::ChartParser.read_file("#{design}")
|
122
194
|
|
123
195
|
chart.items.each do |item|
|
124
196
|
key = item.key
|
125
197
|
expression = ""
|
198
|
+
|
126
199
|
item.chart_data.each do |data|
|
127
200
|
if item.expression?
|
128
201
|
if data.type == OldSql::ReportDesign::ChartData::COLUMN
|
@@ -167,51 +240,6 @@ module OldSql
|
|
167
240
|
|
168
241
|
result
|
169
242
|
end
|
170
|
-
|
171
|
-
def round(value, precision = ROUND_PRECISION)
|
172
|
-
factor = 10.0**precision
|
173
|
-
(value*factor).round / factor
|
174
|
-
end
|
175
|
-
|
176
|
-
def new_data(page=1, total=1, records=1)
|
177
|
-
@id = 0
|
178
|
-
@data = {}
|
179
|
-
@data[:page]=page
|
180
|
-
@data[:total]=total
|
181
|
-
@data[:records]=records
|
182
|
-
@data[:rows] = []
|
183
|
-
end
|
184
|
-
|
185
|
-
def add_row(cell_data = [], id = @id+1)
|
186
|
-
@data[:rows] << {id: id, cell: cell_data}
|
187
|
-
end
|
188
|
-
|
189
|
-
def ifnull(o)
|
190
|
-
if !o.nil? && o != 0
|
191
|
-
return o
|
192
|
-
else
|
193
|
-
return 1
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
def isNumeric(s)
|
198
|
-
Float(s) != nil rescue false
|
199
|
-
end
|
200
|
-
|
201
|
-
def load_sub_processor sub_processor
|
202
|
-
return if sub_processor.nil?
|
203
|
-
|
204
|
-
loaded_sub_processor = nil
|
205
|
-
begin
|
206
|
-
Rails.logger.info "Loading Processor old_sql/report_processor/#{sub_processor.downcase}"
|
207
|
-
require "old_sql/report_processor/#{sub_processor.downcase}"
|
208
|
-
loaded_sub_processor=eval("OldSql::ReportProcessor::#{sub_processor.gsub("_","")}").new
|
209
|
-
rescue Exception=>e
|
210
|
-
Rails.logger.error e.message
|
211
|
-
end
|
212
|
-
|
213
|
-
loaded_sub_processor
|
214
|
-
end
|
215
243
|
end
|
216
244
|
end
|
217
245
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: old_sql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.
|
5
|
+
version: 1.18.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Eddie Gonzales
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-06-
|
13
|
+
date: 2011-06-16 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: devise
|
@@ -193,7 +193,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
193
193
|
requirements:
|
194
194
|
- - ">="
|
195
195
|
- !ruby/object:Gem::Version
|
196
|
-
hash:
|
196
|
+
hash: 1596520403789192732
|
197
197
|
segments:
|
198
198
|
- 0
|
199
199
|
version: "0"
|