relation_to_struct 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 13c9453de8bfec35a498a7819b901efe8d380c11
4
- data.tar.gz: 54fe4e8053127c1dc35a17df5dd4e11933c299be
3
+ metadata.gz: 20d99ebc500ab5e07fd4b78fcb158790fa26b475
4
+ data.tar.gz: 5af91e2d780a6e0ec03383c3c29599674707f0a5
5
5
  SHA512:
6
- metadata.gz: 9062091e453d07f865fcd1a5fb9441bf36ae3e6ff488939d66ffdfff43d6ad7892a087d074c6b07c0796f60b80b1dd49e407817810ac4d1720609db47f3601dd
7
- data.tar.gz: de7d53e292cb15de12b73f11a461ace4b23cfd7ff35bc678bbca7eb719496c880c848d48082ba5ae0b25d6d98f693cf21737458bc6c3d5359e55bd5d13e5a093
6
+ metadata.gz: 732739b20458d9223cb161bdc4c3c9928b28a2b1c70536aca9371ddf642264a83b6f78ea1dd8eb78862d22069672a78b4cc12930d9cfbb97f448aa506ecdc759
7
+ data.tar.gz: 258ea4297e9b7f2538d54a727b9b4eeee01df5f8dfae0041c5ee8ebf2ecc0ba1753866aa0d127e9699aedfc2af95005a74d76b35e97995899e3450b9d444b4c4
@@ -43,6 +43,20 @@ module RelationToStruct::ActiveRecordBaseExtension
43
43
  raise ArgumentError, 'Expected only a single result to be returned'
44
44
  end
45
45
  end
46
+
47
+ def tuple_from_sql(sql, binds=[])
48
+ result = connection.select_all(sanitize_sql(sql, nil), "Value SQL Load", binds)
49
+ values = result.cast_values()
50
+
51
+ case values.size
52
+ when 0
53
+ nil
54
+ when 1
55
+ result.columns.size == 1 ? values : values[0]
56
+ else
57
+ raise ArgumentError, 'Expected only a single result to be returned'
58
+ end
59
+ end
46
60
  end
47
61
  end
48
62
 
@@ -1,3 +1,3 @@
1
1
  module RelationToStruct
2
- VERSION = "1.1.0"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -24,7 +24,7 @@ describe ActiveRecord::Base do
24
24
  expect(ActiveRecord::Base.value_from_sql(sql)).to eq(23)
25
25
  end
26
26
 
27
- it 'raises an error when multiple columns are selected' do
27
+ it 'raises an error when multiple rows are selected' do
28
28
  expect do
29
29
  sql = "SELECT * FROM (VALUES (1), (2)) t"
30
30
  ActiveRecord::Base.value_from_sql(sql)
@@ -56,6 +56,64 @@ describe ActiveRecord::Base do
56
56
  end
57
57
  end
58
58
 
59
+ describe "#tuple_from_sql" do
60
+ it 'allows selecting one value with SQL directly' do
61
+ sql = "SELECT 1"
62
+ expect(ActiveRecord::Base.tuple_from_sql(sql)).to eq([1])
63
+ end
64
+
65
+ it 'allows selecting multiple values with SQL directly' do
66
+ sql = "SELECT 1, 23"
67
+ expect(ActiveRecord::Base.tuple_from_sql(sql)).to eq([1, 23])
68
+ end
69
+
70
+ it 'raises an error when multiple rows are selected' do
71
+ expect do
72
+ sql = "SELECT * FROM (VALUES (1, 3), (2, 4)) t"
73
+ ActiveRecord::Base.tuple_from_sql(sql)
74
+ end.to raise_error(ArgumentError, 'Expected only a single result to be returned')
75
+ end
76
+
77
+ it 'supports binds' do
78
+ sql = ["SELECT ?, ?", 5, 6]
79
+ expect(ActiveRecord::Base.tuple_from_sql(sql)).to eq([5, 6])
80
+ end
81
+
82
+ it 'supports a single array' do
83
+ if active_record_supports_arrays?
84
+ Economist.create!(name: 'F.A. Hayek')
85
+ Economist.create!(name: 'Ludwig von Mises')
86
+
87
+ result = ActiveRecord::Base.tuple_from_sql(<<-SQL)
88
+ SELECT ARRAY_AGG(name ORDER BY id) AS names
89
+ FROM economists
90
+ SQL
91
+ expected_names = ['F.A. Hayek', 'Ludwig von Mises']
92
+ expect(result).to eq([expected_names])
93
+ else
94
+ skip "DB selection doesn't support ARRAY[]"
95
+ end
96
+ end
97
+
98
+ it 'supports multiple arrays' do
99
+ if active_record_supports_arrays?
100
+ Economist.create!(name: 'F.A. Hayek')
101
+ Economist.create!(name: 'Ludwig von Mises')
102
+
103
+ result = ActiveRecord::Base.tuple_from_sql(<<-SQL)
104
+ SELECT
105
+ ARRAY_AGG(name ORDER BY id) AS names,
106
+ ARRAY_AGG(CHAR_LENGTH(name) ORDER BY id) AS lengths
107
+ FROM economists
108
+ SQL
109
+ expected_names = ['F.A. Hayek', 'Ludwig von Mises']
110
+ expect(result).to eq([expected_names, expected_names.map(&:size)])
111
+ else
112
+ skip "DB selection doesn't support ARRAY[]"
113
+ end
114
+ end
115
+ end
116
+
59
117
  describe "#structs_from_sql" do
60
118
  it 'ActiveRecord::Base should respond to :structs_from_sql' do
61
119
  expect(ActiveRecord::Base.respond_to?(:structs_from_sql)).to eq(true)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: relation_to_struct
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Coleman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-19 00:00:00.000000000 Z
11
+ date: 2016-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: appraisal