Skip to content

Commit ecf06ac

Browse files
authored
Support structs in Adbc.Column.to_list (#140)
1 parent de1e119 commit ecf06ac

File tree

2 files changed

+176
-0
lines changed

2 files changed

+176
-0
lines changed

lib/adbc_column.ex

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,5 +1361,19 @@ defmodule Adbc.Column do
13611361

13621362
def to_list(%Adbc.Column{data: data, type: :list}), do: Enum.map(data, &to_list/1)
13631363

1364+
def to_list(%Adbc.Column{data: data, type: :struct}) do
1365+
struct_to_list(data)
1366+
end
1367+
1368+
def to_list(%Adbc.Column{data: data, type: {:struct, _columns}}) do
1369+
struct_to_list(data)
1370+
end
1371+
13641372
def to_list(%Adbc.Column{data: data}), do: data
1373+
1374+
defp struct_to_list(data) do
1375+
%Adbc.Result{data: data, num_rows: nil}
1376+
|> Table.to_rows()
1377+
|> Enum.to_list()
1378+
end
13651379
end

test/adbc_column_test.exs

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,4 +478,166 @@ defmodule Adbc.Column.Test do
478478
assert Adbc.Column.to_list(dict) == ["foo", "bar", "foo", "bar", nil, "baz"]
479479
end
480480
end
481+
482+
describe "struct" do
483+
test "to list" do
484+
struct = %Adbc.Column{
485+
name: "struct",
486+
type:
487+
{:struct,
488+
[
489+
%Adbc.Column{
490+
name: "val1",
491+
type: :s64,
492+
nullable: true,
493+
metadata: nil,
494+
data: nil,
495+
length: nil,
496+
offset: nil
497+
},
498+
%Adbc.Column{
499+
name: "val2",
500+
type: :string,
501+
nullable: true,
502+
metadata: nil,
503+
data: nil,
504+
length: nil,
505+
offset: nil
506+
}
507+
]},
508+
nullable: true,
509+
metadata: nil,
510+
data: [
511+
%Adbc.Column{
512+
name: "val1",
513+
type: :s64,
514+
nullable: true,
515+
metadata: nil,
516+
data: [298_258_424, 162_342_654],
517+
length: nil,
518+
offset: nil
519+
},
520+
%Adbc.Column{
521+
name: "val2",
522+
type: :string,
523+
nullable: true,
524+
metadata: nil,
525+
data: ["hello world", "hello elixir"],
526+
length: nil,
527+
offset: nil
528+
}
529+
],
530+
length: nil,
531+
offset: nil
532+
}
533+
534+
assert Adbc.Column.to_list(struct) == [
535+
%{"val1" => 298_258_424, "val2" => "hello world"},
536+
%{"val1" => 162_342_654, "val2" => "hello elixir"}
537+
]
538+
end
539+
540+
test "to list with list of structs" do
541+
list_of_structs = %Adbc.Column{
542+
name: "list_of_structs",
543+
type: :list,
544+
nullable: true,
545+
metadata: nil,
546+
data: [
547+
%Adbc.Column{
548+
name: "item",
549+
type: :struct,
550+
nullable: true,
551+
metadata: nil,
552+
data: [
553+
%Adbc.Column{
554+
name: "val1",
555+
type: :string,
556+
nullable: true,
557+
metadata: nil,
558+
data: ["hello1"],
559+
length: nil,
560+
offset: nil
561+
},
562+
%Adbc.Column{
563+
name: "val2",
564+
type: :string,
565+
nullable: true,
566+
metadata: nil,
567+
data: ["world1"],
568+
length: nil,
569+
offset: nil
570+
}
571+
],
572+
length: nil,
573+
offset: nil
574+
},
575+
%Adbc.Column{
576+
name: "item",
577+
type: :struct,
578+
nullable: true,
579+
metadata: nil,
580+
data: [
581+
%Adbc.Column{
582+
name: "val1",
583+
type: :string,
584+
nullable: true,
585+
metadata: nil,
586+
data: ["hello2"],
587+
length: nil,
588+
offset: nil
589+
},
590+
%Adbc.Column{
591+
name: "val2",
592+
type: :string,
593+
nullable: true,
594+
metadata: nil,
595+
data: ["world2"],
596+
length: nil,
597+
offset: nil
598+
}
599+
],
600+
length: nil,
601+
offset: nil
602+
},
603+
%Adbc.Column{
604+
name: "item",
605+
type: :struct,
606+
nullable: true,
607+
metadata: nil,
608+
data: [
609+
%Adbc.Column{
610+
name: "val1",
611+
type: :string,
612+
nullable: true,
613+
metadata: nil,
614+
data: ["hello3"],
615+
length: nil,
616+
offset: nil
617+
},
618+
%Adbc.Column{
619+
name: "val2",
620+
type: :string,
621+
nullable: true,
622+
metadata: nil,
623+
data: ["world3"],
624+
length: nil,
625+
offset: nil
626+
}
627+
],
628+
length: nil,
629+
offset: nil
630+
}
631+
],
632+
length: nil,
633+
offset: nil
634+
}
635+
636+
assert Adbc.Column.to_list(list_of_structs) == [
637+
[%{"val1" => "hello1", "val2" => "world1"}],
638+
[%{"val1" => "hello2", "val2" => "world2"}],
639+
[%{"val1" => "hello3", "val2" => "world3"}]
640+
]
641+
end
642+
end
481643
end

0 commit comments

Comments
 (0)