objectbox / objectbox-go

Embedded Go Database, the fast alternative to SQLite, gorm, etc.
https://objectbox.io
Apache License 2.0
1.1k stars 45 forks source link

Time property in inlined struct #49

Open jskop opened 1 year ago

jskop commented 1 year ago

Code generator has problems with binding Time properties of inlined struct. Consider following structs:

type Metadata struct {
    Id       uint64
    Created  time.Time `objectbox:"date"`
    Modified time.Time `objectbox:"date"`
}

type BlogPost struct {
    Metadata `objectbox:"inline"`
    Title    string
    Content  string
}

Generated entity definition does not contain Created and Modified properties:

var BlogPostBinding = blogPost_EntityInfo{
    Entity: objectbox.Entity{
        Id: 6,
    },
    Uid: 5152285828382661602,
}

// BlogPost_ contains type-based Property helpers to facilitate some common operations such as Queries.
var BlogPost_ = struct {
    Id      *objectbox.PropertyUint64
    Title   *objectbox.PropertyString
    Content *objectbox.PropertyString
}{
    Id: &objectbox.PropertyUint64{
        BaseProperty: &objectbox.BaseProperty{
            Id:     1,
            Entity: &BlogPostBinding.Entity,
        },
    },
    Title: &objectbox.PropertyString{
        BaseProperty: &objectbox.BaseProperty{
            Id:     2,
            Entity: &BlogPostBinding.Entity,
        },
    },
    Content: &objectbox.PropertyString{
        BaseProperty: &objectbox.BaseProperty{
            Id:     3,
            Entity: &BlogPostBinding.Entity,
        },
    },
}

Additionally Load function looks like this (notice Created and Modified properties):

func (blogPost_EntityInfo) Load(ob *objectbox.ObjectBox, bytes []byte) (interface{}, error) {
    if len(bytes) == 0 { // sanity check, should "never" happen
        return nil, errors.New("can't deserialize an object of type 'BlogPost' - no data received")
    }

    var table = &flatbuffers.Table{
        Bytes: bytes,
        Pos:   flatbuffers.GetUOffsetT(bytes),
    }

    var propId = table.GetUint64Slot(4, 0)

    return &BlogPost{
        Metadata: Metadata{
            Id:       propId,
            Created:  Time{},
            Modified: Time{},
        },
        Title:   fbutils.GetStringSlot(table, 6),
        Content: fbutils.GetStringSlot(table, 8),
    }, nil
}

Expected behaviour: Inlined struct time properties are properly bound (just like regular properties)

Objectbox version: 1.7.0 Objectbox generator version: 0.13.0