Skip to content

Commit d52aafb

Browse files
committed
Add support for datetime
1 parent 4d2bc28 commit d52aafb

File tree

5 files changed

+118
-10
lines changed

5 files changed

+118
-10
lines changed

lib/activerecord_adbc_adapter/database_statements.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ def perform_query(raw_connection,
2222
else
2323
array = Arrow::StringArray.new([type_casted_bind])
2424
end
25+
when DateTime
26+
array = Arrow::TimestampArray.new(:micro, [type_casted_bind])
2527
when Date
2628
array = Arrow::Date32Array.new([type_casted_bind])
2729
else

lib/activerecord_adbc_adapter/result.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ def resolve_type(data_type)
8282
ActiveRecord::Type::String.new
8383
when Arrow::Date32DataType
8484
ActiveRecord::Type::Date.new
85+
when Arrow::TimestampDataType
86+
ActiveRecord::Type::DateTime.new
8587
else
8688
raise "Unknown: #{data_type.inspect}"
8789
end

lib/activerecord_adbc_adapter/schema_statements.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ module SchemaStatements
88
primary_key: "bigserial PRIMARY KEY",
99
string: {name: "character varying"},
1010
binary: {name: "bytea"},
11+
datetime: {name: "timestamp without time zone"},
1112
},
1213
"sqlite" => {
1314
primary_key: "integer PRIMARY KEY AUTOINCREMENT NOT NULL",

test/helper.rb

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,28 @@ def included(base)
1919
end
2020
end
2121

22+
def backend
23+
ENV["ACTIVERECORD_ADBC_ADAPTER_BACKEND"]
24+
end
25+
26+
def duckdb?
27+
backend == "duckdb"
28+
end
29+
30+
def postgresql?
31+
backend == "postgresql"
32+
end
33+
34+
def sqlite?
35+
return false if duckdb?
36+
return false if postgresql?
37+
true
38+
end
39+
2240
def setup_connection
2341
suffix = nil
2442
database = "ar_adbc_test"
25-
case ENV["ACTIVERECORD_ADBC_ADAPTER_BACKEND"]
43+
case backend
2644
when "duckdb"
2745
suffix = ".duckdb"
2846
path_key = :path

test/test_type.rb

Lines changed: 94 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
class TestType < Test::Unit::TestCase
22
include Helper::Sandbox
33

4-
def test_bigint
4+
def test_bigint_active_record
55
ActiveRecord::Base.connection.create_table("users") do |table|
66
table.bigint :bigint
77
end
@@ -10,7 +10,17 @@ def test_bigint
1010
User.first)
1111
end
1212

13-
def test_integer
13+
def test_bigint_arrow
14+
ActiveRecord::Base.connection.create_table("users") do |table|
15+
table.bigint :bigint
16+
end
17+
User.create!(bigint: 2 ** 32)
18+
assert_equal(Arrow::Table.new(id: Arrow::Int64Array.new([1]),
19+
bigint: Arrow::Int64Array.new([2 ** 32])),
20+
User.to_arrow)
21+
end
22+
23+
def test_integer_active_record
1424
ActiveRecord::Base.connection.create_table("users") do |table|
1525
table.integer :integer
1626
end
@@ -19,7 +29,22 @@ def test_integer
1929
User.first)
2030
end
2131

22-
def test_float
32+
def test_integer_arrow
33+
ActiveRecord::Base.connection.create_table("users") do |table|
34+
table.integer :integer
35+
end
36+
User.create!(integer: 1)
37+
if sqlite?
38+
array = Arrow::Int64Array.new([1])
39+
else
40+
array = Arrow::Int32Array.new([1])
41+
end
42+
assert_equal(Arrow::Table.new(id: Arrow::Int64Array.new([1]),
43+
integer: array),
44+
User.to_arrow)
45+
end
46+
47+
def test_float_active_record
2348
ActiveRecord::Base.connection.create_table("users") do |table|
2449
table.float :float
2550
end
@@ -28,7 +53,22 @@ def test_float
2853
User.first)
2954
end
3055

31-
def test_binary
56+
def test_float_arrow
57+
ActiveRecord::Base.connection.create_table("users") do |table|
58+
table.float :float
59+
end
60+
User.create!(float: 2.9)
61+
if duckdb?
62+
array = Arrow::FloatArray.new([2.9])
63+
else
64+
array = Arrow::DoubleArray.new([2.9])
65+
end
66+
assert_equal(Arrow::Table.new(id: Arrow::Int64Array.new([1]),
67+
float: array),
68+
User.to_arrow)
69+
end
70+
71+
def test_binary_active_record
3272
ActiveRecord::Base.connection.create_table("users") do |table|
3373
table.binary :binary
3474
end
@@ -37,7 +77,17 @@ def test_binary
3777
User.first)
3878
end
3979

40-
def test_string
80+
def test_binary_arrow
81+
ActiveRecord::Base.connection.create_table("users") do |table|
82+
table.binary :binary
83+
end
84+
User.create!(binary: "Hello".b)
85+
assert_equal(Arrow::Table.new(id: Arrow::Int64Array.new([1]),
86+
binary: Arrow::BinaryArray.new(["Hello".b])),
87+
User.to_arrow)
88+
end
89+
90+
def test_string_active_record
4191
ActiveRecord::Base.connection.create_table("users") do |table|
4292
table.string :string
4393
end
@@ -46,16 +96,17 @@ def test_string
4696
User.first)
4797
end
4898

49-
def test_text
99+
def test_text_arrow
50100
ActiveRecord::Base.connection.create_table("users") do |table|
51101
table.text :text
52102
end
53103
User.create!(text: "Hello")
54-
assert_equal(User.new(id: 1, text: "Hello"),
55-
User.first)
104+
assert_equal(Arrow::Table.new(id: Arrow::Int64Array.new([1]),
105+
text: Arrow::StringArray.new(["Hello"])),
106+
User.to_arrow)
56107
end
57108

58-
def test_date
109+
def test_date_active_record
59110
ActiveRecord::Base.connection.create_table("users") do |table|
60111
table.date :date
61112
end
@@ -64,4 +115,38 @@ def test_date
64115
assert_equal(User.new(id: 1, date: date),
65116
User.first)
66117
end
118+
119+
def test_date_arrow
120+
omit("TODO") if sqlite?
121+
ActiveRecord::Base.connection.create_table("users") do |table|
122+
table.date :date
123+
end
124+
date = Date.new(2025, 7, 20)
125+
User.create!(date: date)
126+
assert_equal(Arrow::Table.new(id: Arrow::Int64Array.new([1]),
127+
date: Arrow::Date32Array.new([date])),
128+
User.to_arrow)
129+
end
130+
131+
def test_datetime_active_record
132+
ActiveRecord::Base.connection.create_table("users") do |table|
133+
table.datetime :datetime
134+
end
135+
datetime = DateTime.new(2025, 7, 20, 20, 40, 23)
136+
User.create!(datetime: datetime)
137+
assert_equal(User.new(id: 1, datetime: datetime),
138+
User.first)
139+
end
140+
141+
def test_datetime
142+
omit("TODO") if sqlite?
143+
ActiveRecord::Base.connection.create_table("users") do |table|
144+
table.datetime :datetime
145+
end
146+
datetime = DateTime.new(2025, 7, 20, 20, 40, 23)
147+
User.create!(datetime: datetime)
148+
assert_equal(Arrow::Table.new(id: Arrow::Int64Array.new([1]),
149+
datetime: Arrow::TimestampArray.new(:micro, [datetime])),
150+
User.to_arrow)
151+
end
67152
end

0 commit comments

Comments
 (0)