Skip to content

Commit

Permalink
fix: properly handle structs and nested list when decoding (#90)
Browse files Browse the repository at this point in the history
* fix: properly handle nested lists when decoding

* test: add a test case for `Adbc.Result.to_map/1` when list views in the result set

* fix: properly handle structs when decoding

* revert the default value of `metadata` to `nil`

* minor fix for timestamp types
  • Loading branch information
cocoa-xu authored Jun 3, 2024
1 parent 53dc000 commit 46bcbca
Show file tree
Hide file tree
Showing 8 changed files with 287 additions and 493 deletions.
279 changes: 139 additions & 140 deletions c_src/adbc_arrow_array.hpp

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions c_src/adbc_consts.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ static ERL_NIF_TERM kAtomStructKey;
// name: "sample_list_view",
// type: :list_view,
// nullable: true,
// metadata: %{},
// metadata: nil,
// data: %{
// validity: [true, false, true, true, true],
// offsets: [4, 7, 0, 0, 3],
Expand All @@ -27,7 +27,7 @@ static ERL_NIF_TERM kAtomStructKey;
// name: "sample_list",
// type: :i32,
// nullable: false,
// metadata: %{},
// metadata: nil,
// data: [0, -127, 127, 50, 12, -7, 25]
// }
// }
Expand Down
12 changes: 6 additions & 6 deletions c_src/adbc_nif.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -519,15 +519,15 @@ static ERL_NIF_TERM adbc_arrow_array_stream_next(ErlNifEnv *env, int argc, const
if (out.release) out.release(&out);
return error;
}
if (end_of_series) {
if (out.release) {
out.release(&out);
}
return kAtomEndOfSeries;
}

if (out_terms.size() == 1) {
ret = out_terms[0];
if (end_of_series) {
if (out.release) {
out.release(&out);
}
return kAtomEndOfSeries;
}
} else {
ret = enif_make_tuple2(env, out_terms[0], out_terms[1]);
}
Expand Down
45 changes: 23 additions & 22 deletions lib/adbc_column.ex
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ defmodule Adbc.Column do
defstruct name: nil,
type: nil,
nullable: false,
metadata: %{},
metadata: nil,
data: nil

@type i8 :: -128..127
Expand Down Expand Up @@ -98,6 +98,7 @@ defmodule Adbc.Column do
| :large_string
| decimal_t
| {:fixed_size_binary, non_neg_integer()}
| :struct
| :date32
| :date64
| time_t
Expand All @@ -110,7 +111,7 @@ defmodule Adbc.Column do
(is_list(data) or (type in @list_view_types and is_map(data))) and is_list(opts) do
name = opts[:name]
nullable = opts[:nullable] || false
metadata = opts[:metadata] || %{}
metadata = opts[:metadata] || nil

%Adbc.Column{
name: name,
Expand Down Expand Up @@ -165,7 +166,7 @@ defmodule Adbc.Column do
name: nil,
type: :boolean,
nullable: false,
metadata: %{},
metadata: nil,
data: [true, false, true]
}
Expand Down Expand Up @@ -196,7 +197,7 @@ defmodule Adbc.Column do
name: nil,
type: :u8,
nullable: false,
metadata: %{},
metadata: nil,
data: [1, 2, 3]
}
Expand Down Expand Up @@ -227,7 +228,7 @@ defmodule Adbc.Column do
name: nil,
type: :u16,
nullable: false,
metadata: %{},
metadata: nil,
data: [1, 2, 3]
}
Expand Down Expand Up @@ -258,7 +259,7 @@ defmodule Adbc.Column do
name: nil,
type: :u32,
nullable: false,
metadata: %{},
metadata: nil,
data: [1, 2, 3]
}
Expand Down Expand Up @@ -289,7 +290,7 @@ defmodule Adbc.Column do
name: nil,
type: :u32,
nullable: false,
metadata: %{},
metadata: nil,
data: [1, 2, 3]
}
Expand Down Expand Up @@ -320,7 +321,7 @@ defmodule Adbc.Column do
name: nil,
type: :i8,
nullable: false,
metadata: %{},
metadata: nil,
data: [1, 2, 3]
}
Expand Down Expand Up @@ -351,7 +352,7 @@ defmodule Adbc.Column do
name: nil,
type: :i16,
nullable: false,
metadata: %{},
metadata: nil,
data: [1, 2, 3]
}
Expand Down Expand Up @@ -382,7 +383,7 @@ defmodule Adbc.Column do
name: nil,
type: :i32,
nullable: false,
metadata: %{},
metadata: nil,
data: [1, 2, 3]
}
Expand Down Expand Up @@ -413,7 +414,7 @@ defmodule Adbc.Column do
name: nil,
type: :i64,
nullable: false,
metadata: %{},
metadata: nil,
data: [1, 2, 3]
}
Expand Down Expand Up @@ -444,7 +445,7 @@ defmodule Adbc.Column do
name: nil,
type: :f16,
nullable: false,
metadata: %{},
metadata: nil,
data: [1.0, 2.0, 3.0]
}
Expand Down Expand Up @@ -475,7 +476,7 @@ defmodule Adbc.Column do
name: nil,
type: :f32,
nullable: false,
metadata: %{},
metadata: nil,
data: [1.0, 2.0, 3.0]
}
Expand Down Expand Up @@ -506,7 +507,7 @@ defmodule Adbc.Column do
name: nil,
type: :f64,
nullable: false,
metadata: %{},
metadata: nil,
data: [1.0, 2.0, 3.0]
}
Expand Down Expand Up @@ -646,7 +647,7 @@ defmodule Adbc.Column do
name: nil,
type: :string,
nullable: false,
metadata: %{},
metadata: nil,
data: ["a", "ab", "abc"]
}
Expand Down Expand Up @@ -679,7 +680,7 @@ defmodule Adbc.Column do
name: nil,
type: :large_string,
nullable: false,
metadata: %{},
metadata: nil,
data: ["a", "ab", "abc"]
}
Expand Down Expand Up @@ -710,7 +711,7 @@ defmodule Adbc.Column do
name: nil,
type: :binary,
nullable: false,
metadata: %{},
metadata: nil,
data: [<<0>>, <<1>>, <<2>>]
}
Expand Down Expand Up @@ -743,7 +744,7 @@ defmodule Adbc.Column do
name: nil,
type: :large_binary,
nullable: false,
metadata: %{},
metadata: nil,
data: [<<0>>, <<1>>, <<2>>]
}
Expand Down Expand Up @@ -777,7 +778,7 @@ defmodule Adbc.Column do
name: nil,
type: {:fixed_size_binary, 1},
nullable: false,
metadata: %{},
metadata: nil,
data: [<<0>>, <<1>>, <<2>>]
}
Expand Down Expand Up @@ -1096,7 +1097,7 @@ defmodule Adbc.Column do
...> name: nil,
...> type: :list_view,
...> nullable: true,
...> metadata: %{},
...> metadata: nil,
...> data: %{
...> values: %Adbc.Column{
...> name: "item",
Expand All @@ -1114,7 +1115,7 @@ defmodule Adbc.Column do
name: nil,
type: :list_view,
nullable: true,
metadata: %{},
metadata: nil,
data: %{
offsets: [4, 7, 0, 0, 3],
sizes: [3, 0, 4, 0, 2],
Expand All @@ -1133,7 +1134,7 @@ defmodule Adbc.Column do
name: nil,
type: :list,
nullable: true,
metadata: %{},
metadata: nil,
data: [
%Adbc.Column{
name: "item",
Expand Down
8 changes: 5 additions & 3 deletions lib/adbc_result.ex
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,8 @@ defmodule Adbc.Result do
@doc """
Returns a map of columns as a result.
"""
def to_map(result=%Adbc.Result{}) do
result = list_view_to_list(result)
Map.new(result.data, fn %Adbc.Column{name: name, type: type, data: data} ->
def to_map(result = %Adbc.Result{}) do
Map.new(list_view_to_list(result).data, fn %Adbc.Column{name: name, type: type, data: data} ->
case type do
:list -> {name, Enum.map(data, &list_to_map/1)}
_ -> {name, data}
Expand All @@ -47,6 +46,9 @@ defmodule Adbc.Result do
{name, list}
end

:struct ->
Enum.map(data, &list_to_map/1)

_ ->
if name == "item" do
data
Expand Down
Loading

0 comments on commit 46bcbca

Please sign in to comment.