activerecord-multirange 1.1.2 → 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/docker-compose.yml +23 -0
- 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 +4 -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
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:
|
@@ -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-07-
|
10
|
+
date: 2025-07-23 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: pg
|
@@ -124,10 +124,12 @@ files:
|
|
124
124
|
- Rakefile
|
125
125
|
- activerecord-multirange-1.1.0.gem
|
126
126
|
- config.ru
|
127
|
+
- docker-compose.yml
|
127
128
|
- lib/activerecord-multirange.rb
|
128
129
|
- lib/activerecord-multirange/adapter.rb
|
129
130
|
- lib/activerecord-multirange/oid/multi_range.rb
|
130
131
|
- lib/activerecord-multirange/quoting.rb
|
132
|
+
- lib/activerecord-multirange/relation.rb
|
131
133
|
- lib/activerecord-multirange/schema_statements.rb
|
132
134
|
- lib/activerecord-multirange/table_definition.rb
|
133
135
|
- lib/activerecord-multirange/type_map.rb
|