You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@arrow.apache.org by GitBox <gi...@apache.org> on 2022/05/17 21:06:49 UTC

[GitHub] [arrow-julia] ericphanson opened a new issue, #323: [ArrowTypes] add `@arrow_record`?

ericphanson opened a new issue, #323:
URL: https://github.com/apache/arrow-julia/issues/323

   @kleinschmidt and I came up with
   ```julia
   using Arrow: ArrowTypes
   macro arrow_record(T)
       name = :(Symbol("JuliaLang.", @__MODULE__, ".", string(parentmodule($T), '.', nameof($T))))
       return quote
          ArrowTypes.arrowname(::Type{$T}) = $name
          ArrowTypes.ArrowType(::Type{$T}) = fieldtypes($T)
          ArrowTypes.toarrow(obj::$T) = ntuple(i -> getfield(obj, i), fieldcount($T))
          ArrowTypes.JuliaType(::Val{$name}, ::Any) = $T
          ArrowTypes.fromarrow(::Type{$T}, args...) = $T(args...)
       end
   end
   ```
   as a quick way to declare that a non-parametrized concrete type should be serialized like a "record" (a la [`StructTypes.StructType`](https://juliadata.github.io/StructTypes.jl/stable/#StructTypes.Struct)). (Or maybe it should be called `@arrow_fields` or something?). In other words, we want it to just serialize out as a tuple of its fields with a metadata tag. This could be used as, e.g.
   
   ```julia
   using Arrow
   
   struct Foo
       bar::String
       x::Int
   end
   
   @arrow_record Foo
   
   my_foo =  Foo("hi", 1)
   table = [(; foo_col=my_foo)]
   roundtripped_table = Arrow.Table(Arrow.tobuffer(table))
   using Test
   @test roundtripped_table.foo_col[1] == my_foo # true
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@arrow.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org