postgres_ext 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +15 -5
- data/CHANGELOG.md +3 -0
- data/Gemfile +2 -2
- data/README.md +4 -0
- data/docs/type_casting.md +19 -0
- data/lib/postgres_ext/active_record/connection_adapters/postgres_adapter.rb +149 -3
- data/lib/postgres_ext/active_record/relation/predicate_builder.rb +1 -1
- data/lib/postgres_ext/version.rb +1 -1
- data/spec/columns/array_spec.rb +3 -4
- data/spec/columns/ranges/daterange_spec.rb +37 -0
- data/spec/columns/ranges/int4range_spec.rb +38 -0
- data/spec/columns/ranges/int8range_spec.rb +38 -0
- data/spec/columns/ranges/numrange_spec.rb +37 -0
- data/spec/columns/ranges/tsrange_spec.rb +37 -0
- data/spec/dummy/app/models/person.rb +1 -1
- data/spec/dummy/config/application.rb +1 -1
- data/spec/dummy/db/migrate/20120501163758_create_people.rb +1 -0
- data/spec/dummy/db/schema.rb +9 -8
- data/spec/migrations/array_spec.rb +20 -0
- data/spec/migrations/ranges/daterange_spec.rb +27 -0
- data/spec/migrations/ranges/int4range_spec.rb +27 -0
- data/spec/migrations/ranges/int8range_spec.rb +27 -0
- data/spec/migrations/ranges/numrange_spec.rb +27 -0
- data/spec/migrations/ranges/tsrange_spec.rb +27 -0
- data/spec/migrations/ranges/tstzrange_spec.rb +27 -0
- data/spec/models/ranges/daterange_spec.rb +88 -0
- data/spec/models/ranges/int4range_spec.rb +85 -0
- data/spec/models/ranges/int8range_spec.rb +85 -0
- data/spec/models/ranges/numrange_spec.rb +85 -0
- data/spec/models/ranges/tsrange_spec.rb +89 -0
- data/spec/models/ranges/tstzrange_spec.rb +89 -0
- data/spec/queries/sanity_spec.rb +1 -0
- data/spec/schema_dumper/array_spec.rb +1 -1
- data/spec/schema_dumper/ranges/daterange_spec.rb +18 -0
- data/spec/schema_dumper/ranges/int4range_spec.rb +18 -0
- data/spec/schema_dumper/ranges/int8range_spec.rb +18 -0
- data/spec/schema_dumper/ranges/numrange_spec.rb +18 -0
- data/spec/schema_dumper/ranges/tsrange_spec.rb +18 -0
- data/spec/schema_dumper/ranges/tstzrange_spec.rb +17 -0
- metadata +53 -27
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7e8eff00c75c70dcf28c108a470e187fb6c62d01
|
4
|
+
data.tar.gz: 41af271c607addeee1883185aa52602f37227767
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 17fa65379b957864bb359d6ccccd85672422361b6f5126c78f113d8c05ea0c39595fa790d991c3d79d6778b1ce790f133fdb65458f9da8f99f395c2f5fe19bdf
|
7
|
+
data.tar.gz: 80a96500066d32ac9547f5960b3bced0a27a47a20a3c233f7a4c0d78ae06b7febd03be367b901b9ef62747d3f6258da5839ff9ed5d464c8055c6b7a9fe122c1c
|
data/.travis.yml
CHANGED
@@ -1,12 +1,22 @@
|
|
1
1
|
rvm:
|
2
|
-
- 1.8.7
|
3
|
-
- 1.9.2
|
4
2
|
- 1.9.3
|
5
|
-
-
|
3
|
+
- 2.0.0
|
6
4
|
- jruby-19mode
|
7
5
|
|
8
6
|
before_script:
|
9
|
-
-
|
7
|
+
- sudo /etc/init.d/postgresql stop
|
8
|
+
- sudo cp /etc/postgresql/9.1/main/pg_hba.conf ./
|
9
|
+
- sudo apt-get remove postgresql postgresql-9.1 -qq --purge
|
10
|
+
- source /etc/lsb-release
|
11
|
+
- echo "deb http://apt.postgresql.org/pub/repos/apt/ $DISTRIB_CODENAME-pgdg main" > pgdg.list
|
12
|
+
- sudo mv pgdg.list /etc/apt/sources.list.d/
|
13
|
+
- wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | sudo apt-key add -
|
14
|
+
- sudo apt-get update -qq
|
15
|
+
- sudo apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confnew" install postgresql-9.2 postgresql-contrib-9.2 -qq
|
16
|
+
- sudo /etc/init.d/postgresql stop
|
17
|
+
- sudo cp ./pg_hba.conf /etc/postgresql/9.2/main
|
18
|
+
- sudo /etc/init.d/postgresql start
|
19
|
+
- psql -c 'create database postgres_ext_test;' -U postgres -h localhost
|
10
20
|
- cp spec/dummy/config/database.yml.example spec/dummy/config/database.yml
|
11
21
|
- RAILS_ENV=test rake db:migrate
|
12
22
|
|
@@ -15,4 +25,4 @@ notifications:
|
|
15
25
|
- git@danmcclain.net
|
16
26
|
campfire:
|
17
27
|
rooms:
|
18
|
-
- secure: "
|
28
|
+
- secure: "dNVxAfeOqRuA7k4Wu3H63deqV8Z1mmpVBdPEtkK2ry+mp+51RFHcO0cUJ/fI\nN4PXZu2wNWQlvz5LCMRPe+hxio/w8hTvgQxzBVvi0kuOh/22wXumdy7LR/RJ\nvyrrbP3+1hSxhzufyvIe/fOU11v31d3WRA1/q80ls9EkwzoDTNI="
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -13,6 +13,10 @@ the gem please ask the question on
|
|
13
13
|
[Stack Overflow](http://stackoverflow.com). Be sure to tag the
|
14
14
|
question with `DockYard` so we can find it.
|
15
15
|
|
16
|
+
## Note ##
|
17
|
+
PostgresExt is dropping support for Ruby 1.8.7 with the next minor
|
18
|
+
release.
|
19
|
+
|
16
20
|
## Installation
|
17
21
|
|
18
22
|
Add this line to your application's Gemfile:
|
data/docs/type_casting.md
CHANGED
@@ -49,3 +49,22 @@ person_2.favorite_numbers
|
|
49
49
|
person_2.favorite_numbers.first.class
|
50
50
|
# => Fixnum
|
51
51
|
```
|
52
|
+
|
53
|
+
## Ranges
|
54
|
+
Like array objects, postgres\_ext supports range types as well.
|
55
|
+
Numrange, in4range, int8range, daterange, tsrange, and tstzrange are all
|
56
|
+
supported, but there are some notable caveats.
|
57
|
+
|
58
|
+
### Int and Date ranges
|
59
|
+
As integers and days are discrete measurements, PostgreSQL will
|
60
|
+
normalize these ranges as they are store in the database. PostgreSQL
|
61
|
+
will convert end-inclusive ranges to end-exclusive, meaning that `0..4`
|
62
|
+
becomes `0...5`. Developers should be aware of this when using integer
|
63
|
+
and date ranges, since ruby will treat these ranges differently from
|
64
|
+
PostgreSQL.
|
65
|
+
|
66
|
+
### Timestamp with and without timezone
|
67
|
+
Ruby/Rails 3.2.x does not support datetime ranges that begin or end with
|
68
|
+
infinity. Rails 4 has patched datetime and time so that infinity
|
69
|
+
terminated ranges work, but currently postgres\_ext has not patched the
|
70
|
+
required methods.
|
@@ -43,7 +43,10 @@ module ActiveRecord
|
|
43
43
|
value
|
44
44
|
else
|
45
45
|
case type
|
46
|
-
when :inet, :cidr
|
46
|
+
when :inet, :cidr then klass.string_to_cidr_address(value)
|
47
|
+
when :numrange,:int4range,:int8range then klass.string_to_numeric_range(value,type)
|
48
|
+
when :daterange then klass.string_to_date_range(value)
|
49
|
+
when :tsrange,:tstzrange then klass.string_to_datetime_range(value)
|
47
50
|
else
|
48
51
|
type_cast_without_extended_types(value)
|
49
52
|
end
|
@@ -81,7 +84,10 @@ module ActiveRecord
|
|
81
84
|
"#{klass}.new('#{self.name}', #{self.default.nil? ? 'nil' : "'#{self.default}'"}, '#{self.sql_type}').string_to_array(#{var_name})"
|
82
85
|
else
|
83
86
|
case type
|
84
|
-
when :inet, :cidr
|
87
|
+
when :inet, :cidr then "#{klass}.string_to_cidr_address(#{var_name})"
|
88
|
+
when :numrange,:int4range,:int8range then "#{klass}.string_to_numeric_range(#{var_name},#{type.inspect})"
|
89
|
+
when :daterange then "#{klass}.string_to_date_range(#{var_name})"
|
90
|
+
when :tsrange,:tstzrange then "#{klass}.string_to_datetime_range(#{var_name})"
|
85
91
|
else
|
86
92
|
type_cast_code_without_extended_types(var_name)
|
87
93
|
end
|
@@ -89,7 +95,33 @@ module ActiveRecord
|
|
89
95
|
end
|
90
96
|
alias_method_chain :type_cast_code, :extended_types
|
91
97
|
|
98
|
+
if RUBY_PLATFORM =~ /java/
|
99
|
+
def default_value_with_extended_types(default)
|
100
|
+
case default
|
101
|
+
when /\A'(.*)'::(?:(num|int[48]|date|ts(tz)?)range)\z/
|
102
|
+
$1
|
103
|
+
else
|
104
|
+
default_value_without_extended_types(default)
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
alias_method_chain :default_value, :extended_types
|
109
|
+
end
|
110
|
+
|
92
111
|
class << self
|
112
|
+
unless RUBY_PLATFORM =~ /java/
|
113
|
+
def extract_value_from_default_with_extended_types(default)
|
114
|
+
case default
|
115
|
+
when /\A'(.*)'::(?:(num|int[48]|date|ts(tz)?)range)\z/
|
116
|
+
$1
|
117
|
+
else
|
118
|
+
extract_value_from_default_without_extended_types(default)
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
alias_method_chain :extract_value_from_default, :extended_types
|
123
|
+
end
|
124
|
+
|
93
125
|
def string_to_cidr_address(string)
|
94
126
|
return string unless String === string
|
95
127
|
|
@@ -97,6 +129,51 @@ module ActiveRecord
|
|
97
129
|
IPAddr.new(string)
|
98
130
|
end
|
99
131
|
end
|
132
|
+
|
133
|
+
def string_to_numeric_range(value, type)
|
134
|
+
if type == :numrange
|
135
|
+
extract_range(value) do |end_value|
|
136
|
+
end_value.to_f
|
137
|
+
end
|
138
|
+
else
|
139
|
+
extract_range(value) do |end_value|
|
140
|
+
end_value.to_i
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def string_to_date_range(value)
|
146
|
+
extract_range(value) do |end_value|
|
147
|
+
Date.parse(end_value)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def string_to_datetime_range(value)
|
152
|
+
extract_range(value) do |end_value|
|
153
|
+
Time.parse(end_value)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
private
|
158
|
+
|
159
|
+
def extract_range(value, &conversion)
|
160
|
+
if Range === value
|
161
|
+
value
|
162
|
+
else
|
163
|
+
# Until 1.8.7 support is dropped, must use group numbers instead of named groups
|
164
|
+
#range_regex = /\A(?<open>\[|\()(?<start>.*?),(?<end>.*?)(?<close>\]|\))\z/
|
165
|
+
range_regex = /\A(\[|\()(.*?),(.*?)(\]|\))\z/
|
166
|
+
if match = value.match(range_regex)
|
167
|
+
if match = value.match(range_regex)
|
168
|
+
start_value = match[2].empty? ? -(1.0/0.0) : conversion.call(match[2])
|
169
|
+
end_value = match[3].empty? ? (1.0/0.0) : conversion.call(match[3])
|
170
|
+
|
171
|
+
end_exclusive = end_value != (1.0/0.0) && match[4] == ')'
|
172
|
+
Range.new start_value, end_value, end_exclusive
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
100
177
|
end
|
101
178
|
|
102
179
|
private
|
@@ -121,6 +198,18 @@ module ActiveRecord
|
|
121
198
|
:macaddr
|
122
199
|
when 'ean13'
|
123
200
|
:ean13
|
201
|
+
when 'int4range'
|
202
|
+
:int4range
|
203
|
+
when 'int8range'
|
204
|
+
:int8range
|
205
|
+
when 'numrange'
|
206
|
+
:numrange
|
207
|
+
when 'daterange'
|
208
|
+
:daterange
|
209
|
+
when 'tsrange'
|
210
|
+
:tsrange
|
211
|
+
when 'tstzrange'
|
212
|
+
:tstzrange
|
124
213
|
else
|
125
214
|
simplified_type_without_extended_types field_type
|
126
215
|
end
|
@@ -133,7 +222,8 @@ module ActiveRecord
|
|
133
222
|
class UnsupportedFeature < Exception; end
|
134
223
|
|
135
224
|
EXTENDED_TYPES = { :inet => {:name => 'inet'}, :cidr => {:name => 'cidr'}, :macaddr => {:name => 'macaddr'},
|
136
|
-
:uuid => {:name => 'uuid'}, :citext => {:name => 'citext'}, :ean13 => {:name => 'ean13'} }
|
225
|
+
:uuid => {:name => 'uuid'}, :citext => {:name => 'citext'}, :ean13 => {:name => 'ean13'}, :numrange => {:name => 'numrange'},
|
226
|
+
:daterange => {:name => 'daterange'}, :int4range => {:name => 'int4range'}, :int8range => {:name => 'int8range'}, :tsrange => {:name => 'tsrange'}, :tstzrange => {:name => 'tstzrange'} }
|
137
227
|
|
138
228
|
class ColumnDefinition < ActiveRecord::ConnectionAdapters::ColumnDefinition
|
139
229
|
attr_accessor :array
|
@@ -203,6 +293,8 @@ module ActiveRecord
|
|
203
293
|
@database_encoding ||= case ActiveRecord::Base.connection.encoding
|
204
294
|
when 'UTF8'
|
205
295
|
'UTF-8'
|
296
|
+
when 'SQL_ASCII'
|
297
|
+
'ASCII'
|
206
298
|
else
|
207
299
|
ActiveRecord::Base.connection.encoding
|
208
300
|
end
|
@@ -279,6 +371,22 @@ module ActiveRecord
|
|
279
371
|
else
|
280
372
|
type_cast_without_extended_types(value, column)
|
281
373
|
end
|
374
|
+
when Float
|
375
|
+
if [:numrange,:int4range,:int8range,:daterange].include?(column.type)&& value.abs == (1.0/0.0)
|
376
|
+
''
|
377
|
+
else
|
378
|
+
type_cast_without_extended_types(value, column)
|
379
|
+
end
|
380
|
+
when Date, DateTime, Time
|
381
|
+
if column.type == :tstzrange
|
382
|
+
quoted_date(value)
|
383
|
+
elsif column.type == :tsrange
|
384
|
+
value.to_s(:db)
|
385
|
+
else
|
386
|
+
type_cast_without_extended_types(value, column)
|
387
|
+
end
|
388
|
+
when Range
|
389
|
+
range_to_string(value, column)
|
282
390
|
when Array
|
283
391
|
if column.array
|
284
392
|
array_to_string(value, column)
|
@@ -304,6 +412,8 @@ module ActiveRecord
|
|
304
412
|
"'#{array_to_string(value, column, true)}'"
|
305
413
|
elsif column.respond_to?(:array) && column.array && value =~ /^\{.*\}$/
|
306
414
|
"'#{value}'"
|
415
|
+
elsif value.is_a? Range
|
416
|
+
"'#{type_cast(value, column)}'"
|
307
417
|
else
|
308
418
|
quote_without_extended_types(value, column)
|
309
419
|
end
|
@@ -370,6 +480,22 @@ module ActiveRecord
|
|
370
480
|
select_rows('select extname from pg_extension', 'extensions').map { |row| row[0] }.delete_if {|name| name == 'plpgsql'}
|
371
481
|
end
|
372
482
|
|
483
|
+
def change_column_with_extended_types(table_name, column_name, type, options = {})
|
484
|
+
if options[:array]
|
485
|
+
clear_cache!
|
486
|
+
quoted_table_name = quote_table_name(table_name)
|
487
|
+
|
488
|
+
execute "ALTER TABLE #{quoted_table_name} ALTER COLUMN #{quote_column_name(column_name)} TYPE #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}[]"
|
489
|
+
|
490
|
+
change_column_default(table_name, column_name, options[:default]) if options_include_default?(options)
|
491
|
+
change_column_null(table_name, column_name, options[:null], options[:default]) if options.key?(:null)
|
492
|
+
else
|
493
|
+
change_column_without_extended_types(table_name, column_name, type, options)
|
494
|
+
end
|
495
|
+
end
|
496
|
+
|
497
|
+
alias_method_chain :change_column, :extended_types
|
498
|
+
|
373
499
|
private
|
374
500
|
|
375
501
|
def ipaddr_to_string(value)
|
@@ -380,6 +506,26 @@ module ActiveRecord
|
|
380
506
|
"{#{value.map { |val| item_to_string(val, column, encode_single_quotes) }.join(',')}}"
|
381
507
|
end
|
382
508
|
|
509
|
+
def range_to_string(value, column)
|
510
|
+
"#{range_lower_bound_character value}#{type_cast value.begin, column},#{type_cast value.end, column}#{range_upper_bound_character value}"
|
511
|
+
end
|
512
|
+
|
513
|
+
def range_lower_bound_character(value)
|
514
|
+
if value.begin == -(1.0/0.0)
|
515
|
+
'('
|
516
|
+
else
|
517
|
+
'['
|
518
|
+
end
|
519
|
+
end
|
520
|
+
|
521
|
+
def range_upper_bound_character(value)
|
522
|
+
if value.end == (1.0/0.0) || value.exclude_end?
|
523
|
+
')'
|
524
|
+
else
|
525
|
+
']'
|
526
|
+
end
|
527
|
+
end
|
528
|
+
|
383
529
|
def item_to_string(value, column, encode_single_quotes = false)
|
384
530
|
return 'NULL' if value.nil?
|
385
531
|
|
@@ -29,7 +29,7 @@ module ActiveRecord
|
|
29
29
|
value = value.select(value.klass.arel_table[value.klass.primary_key]) if value.select_values.empty?
|
30
30
|
attribute.in(value.arel.ast)
|
31
31
|
when Array, ActiveRecord::Associations::CollectionProxy
|
32
|
-
column_definition = engine.columns.find { |col| col.name == column }
|
32
|
+
column_definition = engine.connection.columns(table.name).find { |col| col.name == column }
|
33
33
|
|
34
34
|
if column_definition.respond_to?(:array) && column_definition.array
|
35
35
|
attribute.eq(value)
|
data/lib/postgres_ext/version.rb
CHANGED
data/spec/columns/array_spec.rb
CHANGED
@@ -9,7 +9,7 @@ describe 'Array column' do
|
|
9
9
|
let!(:adapter) { ActiveRecord::Base.connection }
|
10
10
|
|
11
11
|
context 'string array' do
|
12
|
-
describe '#
|
12
|
+
describe '#type_cast' do
|
13
13
|
context 'has null value' do
|
14
14
|
it 'converts the PostgreSQL value to an array with a nil value' do
|
15
15
|
string_array_column.type_cast('{1,NULL,"NULL"}').should eq ['1',nil,'NULL']
|
@@ -47,7 +47,7 @@ describe 'Array column' do
|
|
47
47
|
end
|
48
48
|
|
49
49
|
context 'text array' do
|
50
|
-
describe '#
|
50
|
+
describe '#type_cast' do
|
51
51
|
context 'has null value' do
|
52
52
|
it 'converts the PostgreSQL value to an array with a nil value' do
|
53
53
|
text_array_column.type_cast('{1,NULL,"NULL"}').should eq ['1',nil,'NULL']
|
@@ -88,7 +88,7 @@ describe 'Array column' do
|
|
88
88
|
end
|
89
89
|
|
90
90
|
context 'integer array' do
|
91
|
-
describe '#
|
91
|
+
describe '#type_cast' do
|
92
92
|
context 'has null value' do
|
93
93
|
it 'converts a Postgres Array with nulls in it' do
|
94
94
|
integer_array_column.type_cast('{1,NULL,2}').should eq [1,nil,2]
|
@@ -116,5 +116,4 @@ describe 'Array column' do
|
|
116
116
|
end
|
117
117
|
end
|
118
118
|
end
|
119
|
-
|
120
119
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'daterange column' do
|
4
|
+
let!(:adapter) { ActiveRecord::Base.connection }
|
5
|
+
let!(:date_range_column) { ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new 'field', nil, 'daterange'}
|
6
|
+
|
7
|
+
describe '#type_class' do
|
8
|
+
it 'converts an end-inclusive PostgreSQL integer range to a Ruby range' do
|
9
|
+
date_range_column.type_cast('[2011-01-01,2012-01-31]').should eq Date.new(2011,01,01)..Date.new(2012,01,31)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'converts an end-exclusive PostgreSQL integer range to a Ruby range' do
|
13
|
+
date_range_column.type_cast('[2011-01-01,2012-01-31)').should eq Date.new(2011,01,01)...Date.new(2012,01,31)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'converts an infinite PostgreSQL integer range to a Ruby range' do
|
17
|
+
# Cannot have a range from -Infinity to a date
|
18
|
+
# date_range_column.type_cast('(,2011-01-01)').should eq -(1.0/0.0)...4
|
19
|
+
date_range_column.type_cast('[2011-01-01,)').should eq Date.new(2011,01,01)..(1.0/0.0)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'date range to SQL statment conversion' do
|
24
|
+
it 'returns an end-inclusive PostgreSQL range' do
|
25
|
+
value = date_range_column.type_cast('[2011-01-01,2012-01-31]')
|
26
|
+
adapter.type_cast(value, date_range_column).should eq '[2011-01-01,2012-01-31]'
|
27
|
+
end
|
28
|
+
it 'returns an end-exclusive PostgreSQL range' do
|
29
|
+
value = date_range_column.type_cast('[2011-01-01,2012-01-31)')
|
30
|
+
adapter.type_cast(value, date_range_column).should eq '[2011-01-01,2012-01-31)'
|
31
|
+
end
|
32
|
+
it 'converts an infinite PostgreSQL integer range to a Ruby range' do
|
33
|
+
value = date_range_column.type_cast('[2011-01-01,)')
|
34
|
+
adapter.type_cast(value, date_range_column).should eq '[2011-01-01,)'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'int4range column' do
|
4
|
+
let!(:adapter) { ActiveRecord::Base.connection }
|
5
|
+
let!(:int4_range_column) { ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new 'field', nil, 'int4range'}
|
6
|
+
|
7
|
+
describe '#type_class' do
|
8
|
+
it 'converts an end-inclusive PostgreSQL integer range to a Ruby range' do
|
9
|
+
int4_range_column.type_cast('[0,4]').should eq 0..4
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'converts an end-exclusive PostgreSQL integer range to a Ruby range' do
|
13
|
+
int4_range_column.type_cast('[0,4)').should eq 0...4
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'converts an infinite PostgreSQL integer range to a Ruby range' do
|
17
|
+
int4_range_column.type_cast('(,4)').should eq -(1.0/0.0)...4
|
18
|
+
int4_range_column.type_cast('[0,)').should eq 0..(1.0/0.0)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'int4 range to SQL statment conversion' do
|
23
|
+
it 'returns an end-inclusive PostgreSQL range' do
|
24
|
+
value = int4_range_column.type_cast('[0,4]')
|
25
|
+
adapter.type_cast(value, int4_range_column).should eq '[0,4]'
|
26
|
+
end
|
27
|
+
it 'returns an end-exclusive PostgreSQL range' do
|
28
|
+
value = int4_range_column.type_cast('[0,4)')
|
29
|
+
adapter.type_cast(value, int4_range_column).should eq '[0,4)'
|
30
|
+
end
|
31
|
+
it 'converts an infinite PostgreSQL integer range to a Ruby range' do
|
32
|
+
value = int4_range_column.type_cast('(,4)')
|
33
|
+
adapter.type_cast(value, int4_range_column).should eq '(,4)'
|
34
|
+
value = int4_range_column.type_cast('[0,)')
|
35
|
+
adapter.type_cast(value, int4_range_column).should eq '[0,)'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|