directiverecord 0.1.0 → 0.1.1
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.
- checksums.yaml +8 -8
- data/CHANGELOG.rdoc +5 -0
- data/VERSION +1 -1
- data/lib/directive_record/query.rb +1 -4
- data/lib/directive_record/query/sql.rb +2 -2
- data/lib/directive_record/version.rb +1 -1
- data/test/unit/query/test_mysql.rb +1 -1
- data/test/unit/test_query.rb +0 -6
- metadata +2 -5
- data/lib/directive_record/query/monetdb.rb +0 -54
- data/test/unit/query/test_monetdb.rb +0 -27
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OTI2YTQyODBjY2FmMmJmYjgyNzZiNDVmOGRjMDA3MjBmNTA1MGQ0ZA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YzQ5ODk1MzAxMWYxM2Q1ZDBmNTE4MjkwYTAyMTEyOTM1MjA4OGNlYQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZTEyNjY3NDVkMmQ1YzUzMTg2ZjU3MjdhZDdlYmY1YTk1NjUzMGU3ODdiODE1
|
10
|
+
YzdkMzUwYTU1ZDA1NmFmNDE0N2IxMDdlM2NmMTc0ZTZmODg2NTcyMDBlNTE2
|
11
|
+
ZjA2YTNiMTQ0MGU4N2E1MmE1MzkyOGJjMmY3YjU0YjU1NzI5NmE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YmFmZWQ5Y2E3NDI4MjUzNzQ1ZTJkYzAwMjE1YmFhMmQ1ODM2ZmUyYzAzZTcw
|
14
|
+
ZTk0YmRlMzNlMThkZWFjOWEzMDcxZmI3YTU3ODFhYTRhMTlmYzRlOTNjM2Rl
|
15
|
+
ZDA4MmQ1ODc1YmUzMDMxODMxMmMzZjkzMDI0MmZhYzI0OGI0NWI=
|
data/CHANGELOG.rdoc
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require "directive_record/query/sql"
|
2
2
|
require "directive_record/query/mysql"
|
3
|
-
require "directive_record/query/monetdb"
|
4
3
|
|
5
4
|
module DirectiveRecord
|
6
5
|
module Query
|
@@ -14,10 +13,8 @@ module DirectiveRecord
|
|
14
13
|
def self.class_for(connection_class)
|
15
14
|
if connection_class.include?("mysql")
|
16
15
|
MySQL
|
17
|
-
elsif connection_class.include?("monetdb")
|
18
|
-
MonetDB
|
19
16
|
else
|
20
|
-
raise NotImplementedError
|
17
|
+
raise NotImplementedError, "Connection type not supported"
|
21
18
|
end
|
22
19
|
end
|
23
20
|
|
@@ -64,12 +64,12 @@ module DirectiveRecord
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def validate_options!(options)
|
67
|
-
options.assert_valid_keys :select, :where, :group_by, :order_by, :limit, :offset, :aggregates, :numerize_aliases
|
67
|
+
options.assert_valid_keys :select, :where, :group_by, :order_by, :limit, :offset, :aggregates, :numerize_aliases, :optimize
|
68
68
|
end
|
69
69
|
|
70
70
|
def optimize_query!(options)
|
71
71
|
select = [options[:select]].flatten
|
72
|
-
if options[:
|
72
|
+
if options[:optimize] && (select != %w(id)) && select.any?{|x| x.match(/^\w+(\.\w+)+$/)}
|
73
73
|
ids = base.connection.select_values(to_sql(options.merge(:select => "id"))).uniq + [0]
|
74
74
|
options[:where] = ["id IN (#{ids.join(", ")})"]
|
75
75
|
options.delete :limit
|
@@ -217,7 +217,7 @@ module Unit
|
|
217
217
|
ORDER BY `office`.city, `e`.last_name, `e`.first_name
|
218
218
|
}
|
219
219
|
),
|
220
|
-
Employee.to_qry("id", "office.city", :where => "office_id = 1", :order_by => "office.city, last_name, first_name")
|
220
|
+
Employee.to_qry("id", "office.city", :where => "office_id = 1", :order_by => "office.city, last_name, first_name", :optimize => true)
|
221
221
|
)
|
222
222
|
|
223
223
|
assert_equal(
|
data/test/unit/test_query.rb
CHANGED
@@ -20,12 +20,6 @@ module Unit
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
describe "when MonetDB" do
|
24
|
-
it "returns the DirectiveRecord::Query::MonetDB class" do
|
25
|
-
assert_equal DirectiveRecord::Query::MonetDB, DirectiveRecord::Query.send(:class_for, "monetdb::connection")
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
23
|
describe "when else" do
|
30
24
|
it "raises a NotImplementedError" do
|
31
25
|
assert_raises NotImplementedError do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: directiverecord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Engel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -143,7 +143,6 @@ files:
|
|
143
143
|
- lib/directive_record/gem_ext/active_record/base.rb
|
144
144
|
- lib/directive_record/gem_ext/active_record/relation.rb
|
145
145
|
- lib/directive_record/query.rb
|
146
|
-
- lib/directive_record/query/monetdb.rb
|
147
146
|
- lib/directive_record/query/mysql.rb
|
148
147
|
- lib/directive_record/query/sql.rb
|
149
148
|
- lib/directive_record/relation.rb
|
@@ -165,7 +164,6 @@ files:
|
|
165
164
|
- test/test_helper/coverage.rb
|
166
165
|
- test/unit/gem_ext/active_record/test_base.rb
|
167
166
|
- test/unit/gem_ext/active_record/test_relation.rb
|
168
|
-
- test/unit/query/test_monetdb.rb
|
169
167
|
- test/unit/query/test_mysql.rb
|
170
168
|
- test/unit/query/test_sql.rb
|
171
169
|
- test/unit/test_directive_record.rb
|
@@ -212,7 +210,6 @@ test_files:
|
|
212
210
|
- test/test_helper/coverage.rb
|
213
211
|
- test/unit/gem_ext/active_record/test_base.rb
|
214
212
|
- test/unit/gem_ext/active_record/test_relation.rb
|
215
|
-
- test/unit/query/test_monetdb.rb
|
216
213
|
- test/unit/query/test_mysql.rb
|
217
214
|
- test/unit/query/test_sql.rb
|
218
215
|
- test/unit/test_directive_record.rb
|
@@ -1,54 +0,0 @@
|
|
1
|
-
module DirectiveRecord
|
2
|
-
module Query
|
3
|
-
class MonetDB < SQL
|
4
|
-
|
5
|
-
private
|
6
|
-
|
7
|
-
def path_delimiter
|
8
|
-
"__"
|
9
|
-
end
|
10
|
-
|
11
|
-
def aggregate_delimiter
|
12
|
-
"__"
|
13
|
-
end
|
14
|
-
|
15
|
-
def group_by_all_sql
|
16
|
-
"all_rows"
|
17
|
-
end
|
18
|
-
|
19
|
-
def prepare_options!(options)
|
20
|
-
normalize_group_by! options
|
21
|
-
[:select, :where, :having, :group_by, :order_by].each do |key|
|
22
|
-
if options[key]
|
23
|
-
base.reflections.keys.each do |association|
|
24
|
-
options[key] = [options[key]].flatten.collect{|x| x.gsub(/^#{association}\.([a-z_\.]+)/) { "#{association}_#{$1.gsub(".", "_")}" }}
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def finalize_options!(options)
|
31
|
-
if options[:having]
|
32
|
-
if options[:numerize_aliases]
|
33
|
-
map = Hash[options[:select].scan(/,?\s?(.*?) AS ([^,]+)/).collect(&:reverse)]
|
34
|
-
options[:aliases].each{|pattern, replacement| options[:having].gsub! pattern, map[replacement]}
|
35
|
-
else
|
36
|
-
(options[:aggregates] || {}).each do |path, aggregate|
|
37
|
-
options[:having].gsub! /\b#{aggregate}__#{path}\b/, "#{aggregate.to_s.upcase}(#{path})"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
options[:select] = options[:select].split(", ").collect do |string|
|
43
|
-
expression, query_alias = string.match(/^(.*) AS (.*)$/).try(:captures)
|
44
|
-
if query_alias
|
45
|
-
options[:group_by].to_s.include?(expression) || !expression.match(/^\w+(\.\w+)*$/) ? string : "MAX(#{expression}) AS #{query_alias}"
|
46
|
-
else
|
47
|
-
string.match(/^\w+(\.\w+)*$/) ? "MAX(#{string})" : string
|
48
|
-
end
|
49
|
-
end.join(", ") if options[:group_by]
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require_relative "../../test_helper"
|
2
|
-
|
3
|
-
module Unit
|
4
|
-
module Query
|
5
|
-
class TestMonetDB < MiniTest::Test
|
6
|
-
|
7
|
-
describe DirectiveRecord::Query::MonetDB do
|
8
|
-
before do
|
9
|
-
DirectiveRecord::Query.expects(:class_for).returns(DirectiveRecord::Query::MonetDB).at_least_once
|
10
|
-
end
|
11
|
-
|
12
|
-
it "generates the expected SQL" do
|
13
|
-
assert_equal(
|
14
|
-
strip(
|
15
|
-
%Q{
|
16
|
-
SELECT o.id, o.city
|
17
|
-
FROM offices o
|
18
|
-
}
|
19
|
-
),
|
20
|
-
Office.to_qry("id, city")
|
21
|
-
)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|