blazer 1.7.7 → 1.7.8
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of blazer might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +34 -4
- data/app/controllers/blazer/base_controller.rb +5 -0
- data/app/views/blazer/queries/run.html.erb +1 -1
- data/lib/blazer.rb +13 -0
- data/lib/blazer/adapters/sql_adapter.rb +32 -4
- data/lib/blazer/data_source.rb +2 -9
- data/lib/blazer/version.rb +1 -1
- data/lib/generators/blazer/templates/config.yml +4 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 26fcc8a24832e5f3f482ac9e2ae622b43f2c44e8
|
4
|
+
data.tar.gz: a4ce257d4c97d36bf577a952202a139721097482
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 115725c9779514165f926c36f9f71406a480892414d249f2f156c176ce632b1893b9bf9617a0c03a6f9044bf2e53aabe3d378ea971b1a7d64e18acf5bf357c5f
|
7
|
+
data.tar.gz: 985b07bf120c96a196d8c5bef81d8c9c5c6ee64cea56c15c64a3c4d2e7a2b9b0fe010ace797d3a98d6aa565171a0bd675d378fb944b911d29d1bb1cc7931274d
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -394,7 +394,7 @@ data_sources:
|
|
394
394
|
- [MongoDB](#mongodb-1) [beta]
|
395
395
|
- [Elasticsearch](#elasticsearch) [beta]
|
396
396
|
|
397
|
-
You can also create an adapter for any other data store.
|
397
|
+
You can also [create an adapter](#creating-an-adapter) for any other data store.
|
398
398
|
|
399
399
|
**Note:** In the examples below, we recommend using environment variables for urls.
|
400
400
|
|
@@ -426,7 +426,13 @@ data_sources:
|
|
426
426
|
|
427
427
|
### SQL Server
|
428
428
|
|
429
|
-
|
429
|
+
Add [tiny_tds](https://github.com/rails-sqlserver/tiny_tds) and [activerecord-sqlserver-adapter](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter) to your Gemfile and set:
|
430
|
+
|
431
|
+
```yml
|
432
|
+
data_sources:
|
433
|
+
my_source:
|
434
|
+
url: sqlserver://user:password@hostname:1433/database
|
435
|
+
```
|
430
436
|
|
431
437
|
### Oracle
|
432
438
|
|
@@ -448,7 +454,7 @@ data_sources:
|
|
448
454
|
|
449
455
|
### Redshift
|
450
456
|
|
451
|
-
Add [activerecord4-redshift-adapter](https://github.com/aamine/activerecord4-redshift-adapter) to your Gemfile and set:
|
457
|
+
Add [activerecord4-redshift-adapter](https://github.com/aamine/activerecord4-redshift-adapter) or [activerecord5-redshift-adapter](https://github.com/ConsultingMD/activerecord5-redshift-adapter) to your Gemfile and set:
|
452
458
|
|
453
459
|
```yml
|
454
460
|
data_sources:
|
@@ -487,6 +493,27 @@ data_sources:
|
|
487
493
|
url: http://user:password@hostname:9200/
|
488
494
|
```
|
489
495
|
|
496
|
+
## Creating an Adapter
|
497
|
+
|
498
|
+
Create an adapter for any data store with:
|
499
|
+
|
500
|
+
```ruby
|
501
|
+
class FooAdapter < Blazer::Adapters::BaseAdapter
|
502
|
+
# code goes here
|
503
|
+
end
|
504
|
+
|
505
|
+
Blazer.register_adapter "foo", FooAdapter
|
506
|
+
```
|
507
|
+
|
508
|
+
See the [Presto adapter](https://github.com/ankane/blazer/blob/master/lib/blazer/adapters/presto_adapter.rb) for a good example. Then use:
|
509
|
+
|
510
|
+
```yml
|
511
|
+
data_sources:
|
512
|
+
my_source:
|
513
|
+
adapter: foo
|
514
|
+
url: http://user:password@hostname:9200/
|
515
|
+
```
|
516
|
+
|
490
517
|
## Query Permissions
|
491
518
|
|
492
519
|
Blazer supports a basic permissions model.
|
@@ -663,7 +690,10 @@ audit: true
|
|
663
690
|
# class name of the user model
|
664
691
|
# user_class: User
|
665
692
|
|
666
|
-
# method name for the user
|
693
|
+
# method name for the current user
|
694
|
+
# user_method: current_user
|
695
|
+
|
696
|
+
# method name for the display name
|
667
697
|
# user_name: name
|
668
698
|
|
669
699
|
# email to send checks from
|
@@ -92,7 +92,7 @@
|
|
92
92
|
<% end %>
|
93
93
|
<%= column_chart first_20.group_by { |r| v = r[1]; (@boom[@columns[1]] || {})[v.to_s] || v }.each_with_index.map { |(name, v), i| {name: name, data: v.sort_by { |r2| labels.index(r2[0]) }.map { |v2| v3 = v2[0]; [(@boom[@columns[0]] || {})[v3.to_s] || v3, v2[2]] }} }, id: chart_id %>
|
94
94
|
<% elsif chart_type == "scatter" %>
|
95
|
-
<%= scatter_chart @rows, xtitle: @columns[0], ytitle: @columns[1] %>
|
95
|
+
<%= scatter_chart @rows, xtitle: @columns[0], ytitle: @columns[1], id: chart_id %>
|
96
96
|
<% elsif @only_chart %>
|
97
97
|
<% if @rows.size == 1 && @rows.first.size == 1 %>
|
98
98
|
<% v = @rows.first.first %>
|
data/lib/blazer.rb
CHANGED
@@ -148,4 +148,17 @@ module Blazer
|
|
148
148
|
end
|
149
149
|
end
|
150
150
|
end
|
151
|
+
|
152
|
+
def self.adapters
|
153
|
+
@adapters ||= {}
|
154
|
+
end
|
155
|
+
|
156
|
+
def self.register_adapter(name, adapter)
|
157
|
+
adapters[name] = adapter
|
158
|
+
end
|
151
159
|
end
|
160
|
+
|
161
|
+
Blazer.register_adapter "elasticsearch", Blazer::Adapters::ElasticsearchAdapter
|
162
|
+
Blazer.register_adapter "mongodb", Blazer::Adapters::MongodbAdapter
|
163
|
+
Blazer.register_adapter "presto", Blazer::Adapters::PrestoAdapter
|
164
|
+
Blazer.register_adapter "sql", Blazer::Adapters::SqlAdapter
|
@@ -53,6 +53,8 @@ module Blazer
|
|
53
53
|
def preview_statement
|
54
54
|
if postgresql?
|
55
55
|
"SELECT * FROM \"{table}\" LIMIT 10"
|
56
|
+
elsif sqlserver?
|
57
|
+
"SELECT TOP (10) * FROM {table}"
|
56
58
|
else
|
57
59
|
"SELECT * FROM {table} LIMIT 10"
|
58
60
|
end
|
@@ -64,13 +66,25 @@ module Blazer
|
|
64
66
|
|
65
67
|
def cost(statement)
|
66
68
|
result = explain(statement)
|
67
|
-
|
68
|
-
|
69
|
+
if sqlserver?
|
70
|
+
result["TotalSubtreeCost"]
|
71
|
+
else
|
72
|
+
match = /cost=\d+\.\d+..(\d+\.\d+) /.match(result)
|
73
|
+
match[1] if match
|
74
|
+
end
|
69
75
|
end
|
70
76
|
|
71
77
|
def explain(statement)
|
72
78
|
if postgresql? || redshift?
|
73
79
|
select_all("EXPLAIN #{statement}").rows.first.first
|
80
|
+
elsif sqlserver?
|
81
|
+
begin
|
82
|
+
execute("SET SHOWPLAN_ALL ON")
|
83
|
+
result = select_all(statement).each.first
|
84
|
+
ensure
|
85
|
+
execute("SET SHOWPLAN_ALL OFF")
|
86
|
+
end
|
87
|
+
result
|
74
88
|
end
|
75
89
|
rescue
|
76
90
|
nil
|
@@ -114,15 +128,29 @@ module Blazer
|
|
114
128
|
["MySQL", "Mysql2", "Mysql2Spatial"].include?(adapter_name)
|
115
129
|
end
|
116
130
|
|
131
|
+
def sqlserver?
|
132
|
+
["SQLServer", "tinytds", "mssql"].include?(adapter_name)
|
133
|
+
end
|
134
|
+
|
117
135
|
def adapter_name
|
118
|
-
|
136
|
+
# prevent bad data source from taking down queries/new
|
137
|
+
connection_model.connection.adapter_name rescue nil
|
119
138
|
end
|
120
139
|
|
121
140
|
def schemas
|
122
|
-
default_schema = (postgresql? || redshift?) ? "public" : connection_model.connection_config[:database]
|
123
141
|
settings["schemas"] || [connection_model.connection_config[:schema] || default_schema]
|
124
142
|
end
|
125
143
|
|
144
|
+
def default_schema
|
145
|
+
if postgresql? || redshift?
|
146
|
+
"public"
|
147
|
+
elsif sqlserver?
|
148
|
+
"dbo"
|
149
|
+
else
|
150
|
+
connection_model.connection_config[:database]
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
126
154
|
def set_timeout(timeout)
|
127
155
|
if postgresql? || redshift?
|
128
156
|
execute("SET #{use_transaction? ? "LOCAL " : ""}statement_timeout = #{timeout.to_i * 1000}")
|
data/lib/blazer/data_source.rb
CHANGED
@@ -17,15 +17,8 @@ module Blazer
|
|
17
17
|
end
|
18
18
|
|
19
19
|
@adapter_instance =
|
20
|
-
|
21
|
-
|
22
|
-
Blazer::Adapters::ElasticsearchAdapter.new(self)
|
23
|
-
when "mongodb"
|
24
|
-
Blazer::Adapters::MongodbAdapter.new(self)
|
25
|
-
when "presto"
|
26
|
-
Blazer::Adapters::PrestoAdapter.new(self)
|
27
|
-
when "sql"
|
28
|
-
Blazer::Adapters::SqlAdapter.new(self)
|
20
|
+
if Blazer.adapters[adapter]
|
21
|
+
Blazer.adapters[adapter].new(self)
|
29
22
|
else
|
30
23
|
raise Blazer::Error, "Unknown adapter"
|
31
24
|
end
|
data/lib/blazer/version.rb
CHANGED
@@ -41,7 +41,10 @@ audit: true
|
|
41
41
|
# class name of the user model
|
42
42
|
# user_class: User
|
43
43
|
|
44
|
-
# method name for the user
|
44
|
+
# method name for the current user
|
45
|
+
# user_method: current_user
|
46
|
+
|
47
|
+
# method name for the display name
|
45
48
|
# user_name: name
|
46
49
|
|
47
50
|
# optional auth method to use as a before_action (default: nil)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blazer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.7.
|
4
|
+
version: 1.7.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -199,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
199
199
|
version: '0'
|
200
200
|
requirements: []
|
201
201
|
rubyforge_project:
|
202
|
-
rubygems_version: 2.
|
202
|
+
rubygems_version: 2.6.8
|
203
203
|
signing_key:
|
204
204
|
specification_version: 4
|
205
205
|
summary: Explore your data with SQL. Easily create charts and dashboards, and share
|