I managed to get conversion from CH to arrow using a CHToArrowType<> inter-type 
traits concept. However, I am still trying to crack the use of:

 arrow::VisitArrayInline

and 

arrow::ArrayDataVisitor


I have a struct:

Struct AnArrayUser
{
     template <typename T> arrow::Status Visit(const T &a)
     {
           // How to invoke ArrayDataVisitor?
     }

     void Use(const arrow::Array &a) {arrow::VisitArrayInline(a, this);}


     arrow::Status VisitNull() {return arrow::Status::OK();}
     template <class T> arrow::Status VisitValue(T val) {return 
arrow::Status::OK();}
};

Which appears to have it's "Use" method called appropriately. But inside of the 
Visit method I have so far been unable to find the incantation to make a call 
through the ArrayDataVisitor. I've tried several variations of:

arrow::ArrayDataVisitor<typename T::TypeClass>::Visit(*(array.data()), this);

at the // How to .. line above but can't seem to get it to work. I'm sure I 
just have some fundamental misunderstanding of how this is supposed to work. 
Can someone give me some guidance?

Matt

   

-----Original Message-----
From: Wes McKinney <wesmck...@gmail.com> 
Sent: Wednesday, January 22, 2020 12:03 PM
To: user@arrow.apache.org
Subject: Re: Converting clickhouse column to arrow array

If you search for "VisitTypeInline" or "VisitArrayInline" in the C++ codebase 
you can find numerous examples of where this is used

On Wed, Jan 22, 2020 at 10:58 AM Thomas Buhrmann <thomas.buehrm...@gmail.com> 
wrote:
>
> Hi,
> I was looking for something similar, but didn't find a good example in the 
> docs or the source code showing how to use the visitor pattern. It would be 
> great, e.g., to have an example similar to the "Row to columnar conversion", 
> showing a templated way to read arrow columns into C++ vectors using the 
> visitor pattern, and without implementing a separate reader function for each 
> arrow type. Would that be possible?
>
> Many thanks,
> Thomas
>
> On Wed, 22 Jan 2020 at 17:13, Wes McKinney <wesmck...@gmail.com> wrote:
>>
>> hi Matt,
>>
>> I recommend you use the visitor pattern combined with the 
>> arrow::TypeTraits that we provide
>>
>> https://clicktime.symantec.com/38JEFUTGByJzrxbCs1aM2Mn7Vc?u=https%3A%
>> 2F%2Fgithub.com%2Fapache%2Farrow%2Fblob%2Fmaster%2Fcpp%2Fsrc%2Farrow%
>> 2Ftype_traits.h
>>
>> You'll need to provide a compile-time mapping from Clickhouse types 
>> to Arrow types, but then you can statically access the correct 
>> builder type at compile time
>>
>> using ArrowType = typename CHToArrowType<CHType>::ArrowType; using 
>> BuilderType = typename TypeTraits<ArrowType>::BuilderType;
>>
>> ...
>>
>> or similar. In cases where the exported Clickhouse data does not have 
>> an associated AppendValues method in Arrow you may have to write a 
>> special case (please open JIRA issues if you think there should be 
>> more AppendValues methods)
>>
>> Thanks
>>
>> On Wed, Jan 22, 2020 at 7:44 AM Calder, Matthew <mcal...@xbktrading.com> 
>> wrote:
>> >
>> > Hi,
>> >
>> >
>> >
>> > I am interfacing arrow to a Clickhouse database using their c++ client. 
>> > Both arrow and CH have generic array-like classes with the element data 
>> > type internalized. Ideally, I would like to be able to write something 
>> > like:
>> >
>> >
>> >
>> > arrow::Array a = SomeConversionInvocation(clickhouse::Column c);
>> >
>> >
>> >
>> > Where the array and column have the same element type (int, double, 
>> > string, …) but the code is generic to the specific type.
>> >
>> >
>> >
>> > I can do this by explicitly handling specific types through template 
>> > specialization but I thought that since arrow already has pretty generic 
>> > type handling through its templates, and clickhouse also has similar 
>> > capability there ought to be a more seamless way to do the conversion. 
>> > Zero copy would probably be a lot to ask, but something short of template 
>> > specializations for every type is what I am aiming for.
>> >
>> >
>> >
>> > I currently do explicit type specialization. For example I have functions 
>> > like:
>> >
>> >
>> >
>> > inline std::shared_ptr<arrow::Array> makeArray(const 
>> > std::vector<double> &v)
>> >
>> > {
>> >
>> >     arrow::DoubleBuilder builder;
>> >
>> >     builder.AppendValues(v);
>> >
>> >     std::shared_ptr<arrow::Array> array;
>> >
>> >     builder.Finish(&array);
>> >
>> >     return array;
>> >
>> > }
>> >
>> >
>> >
>> > inline std::shared_ptr<arrow::Array> makeArray(const 
>> > std::vector<int> &v)
>> >
>> > {
>> >
>> >     arrow::Int32Builder builder;
>> >
>> >     builder.AppendValues(v);
>> >
>> >     std::shared_ptr<arrow::Array> array;
>> >
>> >     builder.Finish(&array);
>> >
>> >     return array;
>> >
>> > }
>> >
>> >
>> >
>> > Which I suspect is unnecessarily explicit. Is there a more generic way of 
>> > handling the variety of underlying array element data types when 
>> > constructing arrow::Array objects? And can someone point me to examples 
>> > that interface arrow to another similarly generically typed library 
>> > (doesn’t have to be clickhouse). Thanks for any guidance.
>> >
>> >
>> >
>> > Matt
>> >
>> >
>> >
>> >
>> > The information contained in this e-mail may be confidential and is 
>> > intended solely for the use of the named addressee.
>> >
>> > Access, copying or re-use of the e-mail or any information contained 
>> > therein by any other person is not authorized.
>> >
>> > If you are not the intended recipient please notify us immediately by 
>> > returning the e-mail to the originator.
>> >
>> > Disclaimer Version MB.US.1

The information contained in this e-mail may be confidential and is intended 
solely for the use of the named addressee.

Access, copying or re-use of the e-mail or any information contained therein by 
any other person is not authorized.

If you are not the intended recipient please notify us immediately by returning 
the e-mail to the originator.

Disclaimer Version MB.US.1

Reply via email to