[odb-users] aggregate or dis-aggregate a data member

MM finjulhich at gmail.com
Fri Sep 25 06:11:58 EDT 2015


On 24 September 2015 at 16:36, Boris Kolpackov <boris at codesynthesis.com>
wrote:

> Hi,
>
> MM <finjulhich at gmail.com> writes:
>
> > class D
> > { public:
> > const std::string& get_type() const;
> > const std::uint64_t& get_id() const;
> > }; class C {
> > public:
> > const D* d() const;
> > void d(const D&);
> > private:
> > const D* d_;
> > };
> > const D* get_D( const std::string& type, std::uint64_t id );
> >
> > so, I need the d member to map to 2 columns in the table, and the 2
> columns
> > in the table to map back to a single d object, obtained through the
> get_D()
> > free function.
> >
> > Currently I have:
> >
> > #pragma db object(C) abstract definition
> > #pragma db member(C::d) transient
> > #pragma db member(C::dtype) virtual(std::string)\
> >   get(this.d()? this.d()->get_type(): std::string())\
> >   set()
> > #pragma db member(C::did) virtual(std::uint64_t)\
> >   get(this.d()? this.d()->get_id(): std::uint64_t())\
> >   set()
> >
> > For the setting part, I would need both columns to then do the
> > get_D() call.
>
> Right, and that's the reason why your approach will not work: ODB
> will supply you the columns separately but you need them both at
> the same time.
>
> The way to handle this is with a composite value. Something along
> these lines:
>
> #pragma db value
> struct D_Image
> {
>   #pragma db column("dtype")
>   std::string type;
>
>   #pragma db column("did")
>   std::uint64_t id;
> };
>
> #pragma db member(C::d) virtual(D_Image) column("")          \
>   get(D_Image{this.d ()->get_type (), this.d ()->get_id ()}) \
>   set(this.d (get_D ((?).type, (?).id))
>
> Boris
>

Thanks, the composite value solution does it.

Rds,


More information about the odb-users mailing list