activerecord-multirange 1.1.1 → 1.2.0
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 +4 -4
- data/Gemfile.lock +1 -1
- data/activerecord-multirange-1.1.0.gem +0 -0
- data/docker-compose.yml +23 -0
- data/lib/activerecord-multirange/adapter.rb +3 -3
- data/lib/activerecord-multirange/quoting.rb +63 -0
- data/lib/activerecord-multirange/relation.rb +34 -0
- data/lib/activerecord-multirange/version.rb +1 -1
- data/lib/activerecord-multirange.rb +2 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f87d2966974c30e9f99e685735b5e170e3f29be0bd91c859c87e2dea1dc08b7c
|
4
|
+
data.tar.gz: 19392c448ddffa2060f95e2cca9b9179e76c14d8118b71547ac164f0f3b0ce2f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7007b2ca7b1783f54dc75445dbaeb52af74b84573fcce2be230f6833be6d61efd6015a6157800a391be437d544f9eb2a5d61a7b5af40ff809b835fabc5626871
|
7
|
+
data.tar.gz: '0682628116f285b5477ec182a3635642134fa95a76a8bd986bae217a51cafa3cdf33803797d2c31a659cebef9c16e5356f265965485860cb01deaadba34fa212'
|
data/Gemfile.lock
CHANGED
Binary file
|
data/docker-compose.yml
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
version: '3.8'
|
2
|
+
|
3
|
+
services:
|
4
|
+
postgres:
|
5
|
+
image: postgres:15-alpine
|
6
|
+
environment:
|
7
|
+
POSTGRES_USER: postgres
|
8
|
+
POSTGRES_PASSWORD: postgres
|
9
|
+
POSTGRES_DB: activerecord_multirange_test
|
10
|
+
ports:
|
11
|
+
- "15432:5432"
|
12
|
+
volumes:
|
13
|
+
- postgres_data:/var/lib/postgresql/data
|
14
|
+
- ./docker/postgres-init:/docker-entrypoint-initdb.d
|
15
|
+
command: postgres -c shared_preload_libraries=pg_stat_statements
|
16
|
+
healthcheck:
|
17
|
+
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
18
|
+
interval: 5s
|
19
|
+
timeout: 5s
|
20
|
+
retries: 5
|
21
|
+
|
22
|
+
volumes:
|
23
|
+
postgres_data:
|
@@ -16,13 +16,13 @@ module Activerecord
|
|
16
16
|
initializer =
|
17
17
|
::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::OID::TypeMapInitializer
|
18
18
|
.new(type_map)
|
19
|
-
|
19
|
+
|
20
20
|
# Query for multirange types and their corresponding base types (not range types)
|
21
21
|
# We need to get the range's subtype (e.g., date) not the range type itself
|
22
22
|
query = <<-QUERY.squish
|
23
|
-
SELECT m.oid, m.typname, m.typelem, m.typdelim, m.typinput,
|
23
|
+
SELECT m.oid, m.typname, m.typelem, m.typdelim, m.typinput::varchar,
|
24
24
|
pr.rngsubtype, m.typtype, m.typbasetype
|
25
|
-
FROM pg_type m
|
25
|
+
FROM pg_type m
|
26
26
|
JOIN pg_type r ON REPLACE(m.typname, 'multirange', 'range') = r.typname
|
27
27
|
JOIN pg_range pr ON r.oid = pr.rngtypid
|
28
28
|
WHERE m.typtype = 'm';
|
@@ -5,21 +5,84 @@ module Activerecord
|
|
5
5
|
module Quoting
|
6
6
|
def quote(value)
|
7
7
|
return quote(encode_multirange(value)) if value.is_a?(::Activerecord::Multirange::OID::MultiRange::Data)
|
8
|
+
return quote_array_as_multirange(value) if array_of_ranges?(value)
|
8
9
|
|
9
10
|
super
|
10
11
|
end
|
11
12
|
|
12
13
|
def type_cast(value)
|
13
14
|
return encode_multirange(value) if value.is_a?(::Activerecord::Multirange::OID::MultiRange::Data)
|
15
|
+
return encode_array_as_multirange(value) if array_of_ranges?(value)
|
14
16
|
|
15
17
|
super
|
16
18
|
end
|
17
19
|
|
20
|
+
# Override the bound value quoting for parameter binding in WHERE clauses
|
21
|
+
def quoted_literal(value)
|
22
|
+
if array_of_ranges?(value)
|
23
|
+
encode_array_as_multirange(value)
|
24
|
+
else
|
25
|
+
super
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Override quote_bound_value for newer Rails versions
|
30
|
+
def quote_bound_value(value)
|
31
|
+
if array_of_ranges?(value)
|
32
|
+
"'#{encode_array_as_multirange(value)}'"
|
33
|
+
else
|
34
|
+
super
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Override for default expression quoting
|
39
|
+
def quote_default_expression(value, column)
|
40
|
+
if array_of_ranges?(value)
|
41
|
+
"'#{encode_array_as_multirange(value)}'"
|
42
|
+
else
|
43
|
+
super
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Override sanitize_sql_array to catch arrays of ranges at parameter binding level
|
48
|
+
def sanitize_sql_array(ary)
|
49
|
+
statement, *values = ary
|
50
|
+
if statement.respond_to?(:to_str)
|
51
|
+
# Convert arrays of ranges to multirange format in the values
|
52
|
+
converted_values = values.map do |value|
|
53
|
+
if array_of_ranges?(value)
|
54
|
+
encode_array_as_multirange(value)
|
55
|
+
else
|
56
|
+
value
|
57
|
+
end
|
58
|
+
end
|
59
|
+
sanitize_sql_for_conditions([statement, *converted_values])
|
60
|
+
else
|
61
|
+
super
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
18
65
|
def encode_multirange(range_data)
|
19
66
|
collection = range_data.ranges.map { |r| encode_range(r) }.join(",")
|
20
67
|
|
21
68
|
"{#{collection}}"
|
22
69
|
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def array_of_ranges?(value)
|
74
|
+
value.is_a?(::Array) && value.all? { |item| item.is_a?(::Range) }
|
75
|
+
end
|
76
|
+
|
77
|
+
def quote_array_as_multirange(ranges)
|
78
|
+
encoded_multirange = encode_array_as_multirange(ranges)
|
79
|
+
"'#{encoded_multirange}'"
|
80
|
+
end
|
81
|
+
|
82
|
+
def encode_array_as_multirange(ranges)
|
83
|
+
collection = ranges.map { |r| encode_range(r) }.join(",")
|
84
|
+
"{#{collection}}"
|
85
|
+
end
|
23
86
|
end
|
24
87
|
end
|
25
88
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Activerecord
|
4
|
+
module Multirange
|
5
|
+
module Relation
|
6
|
+
def where(opts = :chain, *rest)
|
7
|
+
if opts.is_a?(String) && rest.any?
|
8
|
+
# Convert any arrays of ranges in the parameters to multirange format
|
9
|
+
converted_rest = rest.map do |param|
|
10
|
+
if array_of_ranges?(param)
|
11
|
+
encode_array_as_multirange(param)
|
12
|
+
else
|
13
|
+
param
|
14
|
+
end
|
15
|
+
end
|
16
|
+
super(opts, *converted_rest)
|
17
|
+
else
|
18
|
+
super
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def array_of_ranges?(value)
|
25
|
+
value.is_a?(::Array) && value.all? { |item| item.is_a?(::Range) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def encode_array_as_multirange(ranges)
|
29
|
+
collection = ranges.map { |r| connection.send(:encode_range, r) }.join(",")
|
30
|
+
"{#{collection}}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -6,6 +6,7 @@ require 'activerecord-multirange/quoting'
|
|
6
6
|
require 'activerecord-multirange/schema_statements'
|
7
7
|
require 'activerecord-multirange/table_definition'
|
8
8
|
require 'activerecord-multirange/type_map'
|
9
|
+
require 'activerecord-multirange/relation'
|
9
10
|
require 'active_record'
|
10
11
|
|
11
12
|
module Activerecord
|
@@ -38,6 +39,7 @@ module Activerecord
|
|
38
39
|
ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition.prepend(
|
39
40
|
TableDefinition
|
40
41
|
)
|
42
|
+
ActiveRecord::Relation.prepend(Relation)
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-multirange
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gustavo Warmling Teixeira
|
8
8
|
bindir: exe
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-
|
10
|
+
date: 2025-07-23 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: pg
|
@@ -122,11 +122,14 @@ files:
|
|
122
122
|
- LICENSE.txt
|
123
123
|
- README.md
|
124
124
|
- Rakefile
|
125
|
+
- activerecord-multirange-1.1.0.gem
|
125
126
|
- config.ru
|
127
|
+
- docker-compose.yml
|
126
128
|
- lib/activerecord-multirange.rb
|
127
129
|
- lib/activerecord-multirange/adapter.rb
|
128
130
|
- lib/activerecord-multirange/oid/multi_range.rb
|
129
131
|
- lib/activerecord-multirange/quoting.rb
|
132
|
+
- lib/activerecord-multirange/relation.rb
|
130
133
|
- lib/activerecord-multirange/schema_statements.rb
|
131
134
|
- lib/activerecord-multirange/table_definition.rb
|
132
135
|
- lib/activerecord-multirange/type_map.rb
|