Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
135 commits
Select commit Hold shift + click to select a range
26061f4
First try
ostcar Mar 31, 2025
f28cb73
Listen on notify
ostcar Apr 1, 2025
0625fa2
go generate
ostcar Apr 1, 2025
0321d17
Only return requested keys
ostcar Apr 1, 2025
825f3d6
Fix null
ostcar Apr 1, 2025
67ac92c
Fix update
ostcar Apr 1, 2025
260f87c
Fix update
ostcar Apr 2, 2025
a6a8627
Next Fix
ostcar Apr 2, 2025
e1cbae1
support more types
ostcar Apr 4, 2025
b9e262c
apply temp stuff
ostcar Apr 5, 2025
f9eb92a
New trigger system
ostcar Apr 5, 2025
23f2f34
view-names
ostcar Apr 6, 2025
b011f7e
update meta
ostcar Apr 7, 2025
b4d3a31
Reactivate big querry test
ostcar Apr 7, 2025
8f8ba46
Reavtivate vote-count-test
ostcar Apr 7, 2025
4e71cda
fix go vet
ostcar Apr 7, 2025
d0826db
Merge remote-tracking branch 'upstream/main' into feature/relational-db
ostcar Apr 7, 2025
c9764e0
give tests more time. what a shame
ostcar Apr 7, 2025
c83f7b3
maybe so?
ostcar Apr 7, 2025
c48649a
a bit more time
ostcar Apr 7, 2025
54bb702
cleanups
ostcar Apr 7, 2025
cef23a4
update meta
ostcar Apr 7, 2025
75c65db
Update to new trigger system
ostcar Apr 9, 2025
181bbce
small cleanup
ostcar Apr 9, 2025
92ca235
step
ostcar May 11, 2025
243c49b
Merge remote-tracking branch 'upstream/main' into feature/relational-db
ostcar Jun 4, 2025
cbe9dd4
Update meta
ostcar Jul 17, 2025
4985437
Update meta for new vote service based on rel-db
ostcar Jul 17, 2025
4942aa5
Remove flow_vote
ostcar Jul 17, 2025
1b9ca1d
update meta
ostcar Jul 18, 2025
01d7565
Export postgres pool
ostcar Jul 20, 2025
80d24d9
Update meta after branch merge
ostcar Jul 26, 2025
a48d21e
go mod tidy
ostcar Jul 26, 2025
25ad7ea
Put postgres test in separat package to be used elseware
ostcar Jul 26, 2025
3ae8c92
Merge remote-tracking branch 'upstream/main' into feature/relational-db
ostcar Jul 27, 2025
add91d6
update meta
ostcar Jul 27, 2025
4422a99
fix flow_vote_count_test.go, was broken from merge
ostcar Jul 27, 2025
f12cd0f
Merge remote-tracking branch 'upstream/feature/relational-db' into fe…
ostcar Jul 27, 2025
e918f23
Update meta
ostcar Aug 25, 2025
64f3736
Enhance pgtest system
ostcar Aug 25, 2025
dbef53e
Only request requested fields
ostcar Aug 25, 2025
cb5a27b
Fixes
ostcar Aug 25, 2025
952686c
Fixes to the pgtest and flow_postgres
ostcar Aug 29, 2025
a4ffafc
Enhance pgtest
ostcar Sep 1, 2025
507b25b
Fix order bug in inser test data
ostcar Sep 1, 2025
9f47ef2
Backport from new-vote-service
ostcar Sep 3, 2025
8098e4a
Restore deleted files from main branch
ostcar Sep 3, 2025
670a1ef
Merge remote-tracking branch 'upstream/main' into feature/relational-db
ostcar Sep 4, 2025
2afad81
Fix bug with reused bytes-buffers in pgx raw values
ostcar Sep 4, 2025
fd1dcf8
go generate
ostcar Sep 5, 2025
33a1b2a
Add postgres datatypes varchar array and float8
rrenkert Sep 5, 2025
e168e22
Fix float. It is handled as a number and not like a decimal.
ostcar Sep 5, 2025
5344736
Add test for string list
ostcar Sep 5, 2025
f895c01
Try to fix Update-test.
ostcar Sep 5, 2025
cd308c1
Merge remote-tracking branch 'upstream/feature/relational-db' into fe…
ostcar Sep 6, 2025
7254b9a
Update meta
ostcar Sep 7, 2025
170ba81
Fix insert_data for cases, where a collection gets updated
ostcar Sep 7, 2025
5429586
update meta
ostcar Sep 8, 2025
696f245
Update meta
ostcar Sep 12, 2025
1343e96
update meta
ostcar Sep 13, 2025
3abce04
go generate
ostcar Sep 13, 2025
a83702a
update meta
ostcar Sep 13, 2025
6341f0f
Merge remote-tracking branch 'upstream/main' into feature/relational-db
ostcar Oct 1, 2025
e8e35a6
- Update meta
ostcar Oct 1, 2025
03f23a4
Merge branch 'feature/new-vote-service' into feature/relational-db
ostcar Oct 1, 2025
3f5c0cf
Update go deps
ostcar Oct 1, 2025
e80c850
update meta
ostcar Oct 1, 2025
0fd07bc
Remove vote-flow and flow-combiner
ostcar Oct 1, 2025
0e7e385
Fix tests
ostcar Oct 1, 2025
0811899
Fixes for vote-service
ostcar Oct 3, 2025
ad9e93a
small fix in error message
ostcar Oct 3, 2025
871e1c6
counter returns counter
ostcar Oct 4, 2025
144053a
Fix test after counter change
ostcar Oct 4, 2025
106c0c9
Move vote/*_user_id in its own restriction_mode
ostcar Oct 4, 2025
fcd0e56
update meta
ostcar Oct 5, 2025
3bd78ca
vote_split
ostcar Oct 8, 2025
af9fa3f
Merge remote-tracking branch 'upstream/main' into feature/relational-db
ostcar Oct 15, 2025
a63c08b
Merge remote-tracking branch 'upstream/main' into feature/relational-db
ostcar Oct 17, 2025
5d9a192
update meta
ostcar Oct 17, 2025
bba58cb
update meta
ostcar Oct 29, 2025
8aca57c
Update meta
ostcar Nov 1, 2025
ace32fd
more config changes
ostcar Nov 1, 2025
bfd8240
Update meta
ostcar Nov 1, 2025
e7d156c
Update meta
ostcar Nov 3, 2025
04ce32b
update meta
ostcar Nov 3, 2025
d01b94f
update meta
ostcar Nov 4, 2025
1d0f4ec
Update meta (#120)
rrenkert Nov 18, 2025
1568cb2
Merge remote-tracking branch 'upstream/main' into feature/relational-db
rrenkert Nov 19, 2025
3889681
Merge remote-tracking branch 'upstream/main' into feature/relational-db
ostcar Nov 20, 2025
6f45008
Merge remote-tracking branch 'upstream/main' into feature/relational-db
ostcar Nov 27, 2025
988ee55
Fix colling calculated fields on update (#125)
ostcar Nov 29, 2025
fcb036d
copy fields (#127)
ostcar Nov 29, 2025
34d4253
Move fix to other place (#128)
ostcar Nov 29, 2025
6e9ab40
Update meta
rrenkert Dec 10, 2025
0ed1c58
[rel-db] Fix comma handling in statement (#133)
rrenkert Dec 10, 2025
9299872
Merge remote-tracking branch 'upstream/main' into feature/relational-db
rrenkert Dec 17, 2025
753b539
Merge remote-tracking branch 'upstream/main' into feature/relational-db
ostcar Jan 16, 2026
91dea98
go mod tidy
ostcar Jan 16, 2026
7e85547
Update meta
ostcar Jan 16, 2026
8cb90c5
go generate
ostcar Jan 16, 2026
7af284d
remove vote ds backend
ostcar Jan 16, 2026
553c32f
fix one test
ostcar Jan 16, 2026
dbdffd3
Fix text list
ostcar Jan 16, 2026
3682b79
Support PSQLTypeTextList
ostcar Jan 16, 2026
ac35a16
go mod tidy
ostcar Jan 16, 2026
ae6182f
Update os-go
ostcar Jan 16, 2026
de649fe
Merge remote-tracking branch 'upstream/feature/relational-db' into fe…
ostcar Jan 16, 2026
f3645d5
Merge remote-tracking branch 'upstream/main' into feature/relational-db
ostcar Jan 17, 2026
d4a3266
Update meta
ostcar Jan 17, 2026
45446f2
Merge remote-tracking branch 'upstream/feature/relational-db' into fe…
ostcar Jan 17, 2026
3b3dc48
Remove models in rel-db
ostcar Jan 17, 2026
43cc35a
Merge remote-tracking branch 'upstream/feature/relational-db' into fe…
ostcar Jan 17, 2026
d8288d9
Merge remote-tracking branch 'upstream/main' into feature/vote
ostcar Feb 21, 2026
55e883c
Remove code for calculated fields
ostcar Feb 21, 2026
8648bbe
Update meta
bastianjoel Feb 23, 2026
cc7df46
New system for poll_config requirement
ostcar Mar 1, 2026
e02874a
Export reset in pgtest
ostcar Mar 8, 2026
d1e8b80
update meta
ostcar Mar 18, 2026
ea6b526
Merge branch 'main' into feature/vote
bastianjoel Apr 23, 2026
4ed8ea0
Remove meeting id from ballot (#258)
bastianjoel May 5, 2026
525390c
Merge branch 'main' into feature/vote
bastianjoel May 7, 2026
f12e949
Update meta
bastianjoel May 7, 2026
77bb3e1
Remove projector content
bastianjoel May 7, 2026
ef326b4
Update os-go
ostcar May 9, 2026
46ba1f4
Merge remote-tracking branch 'upstream/main' into feature/vote
ostcar May 9, 2026
117a72a
Merge remote-tracking branch 'upstream/main' into feature/vote
ostcar May 20, 2026
a907536
Merge branch 'main' into feature/vote
bastianjoel Jun 1, 2026
dee9435
Add union types for generic relations (#280)
bastianjoel Jun 12, 2026
039b76d
add package for history (#282)
ostcar Jun 23, 2026
528557d
go generate (#286)
bastianjoel Jun 23, 2026
3b1d358
go generate after update meta
ostcar Jun 30, 2026
e068b09
Merge remote-tracking branch 'upstream/main' into feature/vote
ostcar Jun 30, 2026
2182e41
go generate (#287)
ostcar Jul 3, 2026
2cda15d
Update meta (#300)
bastianjoel Jul 13, 2026
0953b19
Split poll ballot (#289)
ostcar Jul 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,261 changes: 617 additions & 644 deletions datastore/dsfetch/fields_generated.go

Large diffs are not rendered by default.

1,930 changes: 962 additions & 968 deletions datastore/dskey/gen_collection_fields.go

Large diffs are not rendered by default.

59 changes: 38 additions & 21 deletions datastore/dsmodels/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (

type builderWrapperI interface {
SetIds(ids []int)
SetFqids(fqids []string)
setChild(builder builderWrapperI) builderWrapperI
getParent() builderWrapperI
getIDField() string
Expand All @@ -19,27 +20,34 @@ type builderWrapperI interface {
lazyAll(ctx context.Context) []any
}

type builderPtr[T any, M any] interface {
lazy(ds *Fetch, id int) *M
type builderPtr[T any, M any, R any] interface {
lazy(ds *Fetch, id any) R
*T
}

type builder[C any, T builderPtr[C, M], M any] struct {
type builder[C any, T builderPtr[C, M, R], M any, R any] struct {
ids []int
fqids []string
value T
parent builderWrapperI
children map[string]builderWrapperI
idField string
relField string
many bool
fetch *Fetch

conv func(R) M
}

func (b *builder[C, T, M]) SetIds(ids []int) {
func (b *builder[C, T, M, R]) SetIds(ids []int) {
b.ids = ids
}

func (b *builder[C, T, M]) setChild(builder builderWrapperI) builderWrapperI {
func (b *builder[C, T, M, R]) SetFqids(fqids []string) {
b.fqids = fqids
}

func (b *builder[C, T, M, R]) setChild(builder builderWrapperI) builderWrapperI {
if b.children == nil {
b.children = map[string]builderWrapperI{}
}
Expand All @@ -51,31 +59,36 @@ func (b *builder[C, T, M]) setChild(builder builderWrapperI) builderWrapperI {
return b.children[builder.getRelField()]
}

func (b *builder[C, T, M]) getRelField() string {
func (b *builder[C, T, M, R]) getRelField() string {
return b.relField
}

func (b *builder[C, T, M]) getIDField() string {
func (b *builder[C, T, M, R]) getIDField() string {
return b.idField
}

func (b *builder[C, T, M]) getMany() bool {
func (b *builder[C, T, M, R]) getMany() bool {
return b.many
}

func (b *builder[C, T, M]) getParent() builderWrapperI {
func (b *builder[C, T, M, R]) getParent() builderWrapperI {
return b.parent
}

func (b *builder[C, T, M]) lazyAll(ctx context.Context) []any {
func (b *builder[C, T, M, R]) lazyAll(ctx context.Context) []any {
items := []any{}
for _, id := range b.ids {
items = append(items, b.value.lazy(b.fetch, id))
}

for _, id := range b.fqids {
items = append(items, b.value.lazy(b.fetch, id))
}

return items
}

func (b *builder[C, T, M]) Preload(rel builderWrapperI) {
func (b *builder[C, T, M, R]) Preload(rel builderWrapperI) {
children := []builderWrapperI{}
for rel != b && rel != nil && rel.getRelField() != "" {
children = append([]builderWrapperI{rel}, children...)
Expand All @@ -89,12 +102,15 @@ func (b *builder[C, T, M]) Preload(rel builderWrapperI) {
}
}

func getRelationIds(idField reflect.Value, targetField reflect.Value, many bool) []int {
func getRelationIds(idField reflect.Value, targetField reflect.Value, many bool) ([]int, []string) {
ids := []int{}
fqids := []string{}
if many {
ids = idField.Interface().([]int)
} else if idField.Kind() == reflect.Int {
ids = append(ids, int(idField.Int()))
} else if idField.Kind() == reflect.String {
fqids = append(fqids, string(idField.String()))
} else if idField.Type().Name() == "Maybe[int]" {
relMaybeType := targetField.Type().Elem()
relValue := reflect.New(relMaybeType)
Expand All @@ -107,7 +123,7 @@ func getRelationIds(idField reflect.Value, targetField reflect.Value, many bool)
}
}

return ids
return ids, fqids
}

func setRelationField(idField reflect.Value, targetField reflect.Value, item any, many bool) {
Expand All @@ -127,15 +143,16 @@ type childInfo struct {
targetField reflect.Value
}

func (b *builder[C, T, M]) prepareChildren(ctx context.Context, parents ...any) []childInfo {
func (b *builder[C, T, M, R]) prepareChildren(ctx context.Context, parents ...any) []childInfo {
childInfos := make([]childInfo, 0, len(b.children))
for _, parent := range parents {
rParent := reflect.ValueOf(parent).Elem()
for _, child := range b.children {
idField := rParent.FieldByName(child.getIDField())
targetField := rParent.FieldByName(child.getRelField())
ids := getRelationIds(idField, targetField, child.getMany())
ids, fqids := getRelationIds(idField, targetField, child.getMany())
child.SetIds(ids)
child.SetFqids(fqids)
items := child.lazyAll(ctx)
childInfos = append(childInfos, childInfo{
child: child,
Expand Down Expand Up @@ -196,7 +213,7 @@ func bulkLoadChildren(ctx context.Context, fetch *Fetch, requests []loadRequest)
return nil
}

func (b *builder[C, T, M]) loadChildren(ctx context.Context, parents ...any) error {
func (b *builder[C, T, M, R]) loadChildren(ctx context.Context, parents ...any) error {
if b.children == nil {
return nil
}
Expand All @@ -207,7 +224,7 @@ func (b *builder[C, T, M]) loadChildren(ctx context.Context, parents ...any) err
}})
}

func (b *builder[C, T, M]) First(ctx context.Context) (M, error) {
func (b *builder[C, T, M, R]) First(ctx context.Context) (M, error) {
c := b.value.lazy(b.fetch, b.ids[0])

if err := b.fetch.Execute(ctx); err != nil {
Expand All @@ -220,11 +237,11 @@ func (b *builder[C, T, M]) First(ctx context.Context) (M, error) {
return zero, err
}

return *c, nil
return b.conv(c), nil
}

func (b *builder[C, T, M]) Get(ctx context.Context) ([]M, error) {
itemPtrs := make([]*M, len(b.ids))
func (b *builder[C, T, M, R]) Get(ctx context.Context) ([]M, error) {
itemPtrs := make([]R, len(b.ids))
for i, id := range b.ids {
itemPtrs[i] = b.value.lazy(b.fetch, id)
}
Expand All @@ -238,7 +255,7 @@ func (b *builder[C, T, M]) Get(ctx context.Context) ([]M, error) {
if err := b.loadChildren(ctx, el); err != nil {
return []M{}, err
}
items[i] = *el
items[i] = b.conv(el)
}

return items, nil
Expand Down
33 changes: 33 additions & 0 deletions datastore/dsmodels/fetch_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dsmodels_test

import (
"reflect"
"testing"

"github.com/OpenSlides/openslides-go/datastore/dsmock"
Expand Down Expand Up @@ -246,3 +247,35 @@ func TestRequestSinglePreloadMulti(t *testing.T) {
t.Errorf("res.ListOfSpeakers.ContentObjectID = %s, expected topic/1", res.ListOfSpeakers.ContentObjectID)
}
}

func TestPolymorphicPreload(t *testing.T) {
ds := dsmodels.New(dsmock.Stub(dsmock.YAMLData(`---
topic/1:
sequential_number: 1
title: foo
meeting_id: 1
agenda_item_id: 1
list_of_speakers_id: 1
agenda_item/1/content_object_id: topic/1
agenda_item/1/meeting_id: 1
list_of_speakers/1:
sequential_number: 1
content_object_id: topic/1
meeting_id: 1
`)))

tQ := ds.AgendaItem(1)
res, err := tQ.Preload(tQ.ContentObject()).First(t.Context())
if err != nil {
t.Errorf("Topic 1 with agenda item returned unexpected error: %v", err)
}

topic, isTopic := res.ContentObject.(*dsmodels.Topic)
if !isTopic {
t.Errorf("type of res.ContentObject = %s, expected *dsmodels.Topic", reflect.TypeOf(res.ContentObject))
}

if topic.Title != "foo" {
t.Errorf("res.ContentObject.Title = %s, expected 'foo'", topic.Title)
}
}
95 changes: 78 additions & 17 deletions datastore/dsmodels/gen_models/collection.go.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ type {{.GoName}} struct{
}

type {{.GoNameLc}}Builder struct{
builder[{{.GoNameLc}}Builder, *{{.GoNameLc}}Builder, {{.GoName}}]
builder[{{.GoNameLc}}Builder, *{{.GoNameLc}}Builder, {{.GoName}}, *{{.GoName}}]
}

func (b *{{.GoNameLc}}Builder)lazy(ds *Fetch, id int) *{{.GoName}} {
func (b *{{.GoNameLc}}Builder)lazy(ds *Fetch, idI any) *{{.GoName}} {
id := idI.(int)
c := {{.GoName}}{}
{{- range .Fields}}
ds.{{.FetchName}}(id).Lazy(&c.{{.Name}})
Expand All @@ -25,27 +26,87 @@ func (b *{{.GoNameLc}}Builder) Preload(rel builderWrapperI) *{{.GoNameLc}}Builde
return b
}

{{ range .Relations}}
func (b *{{$.GoNameLc}}Builder) {{.MethodName}}() *{{.TypeLc}}Builder {
return &{{.TypeLc}}Builder{
builder: builder[{{.TypeLc}}Builder, *{{.TypeLc}}Builder, {{.Type}}]{
fetch: b.fetch,
parent: b,
idField: "{{.FieldName}}",
relField: "{{.MethodName}}",
{{- if .IsList}}
many: true,
{{- end}}
},
{{ range .Relations }}
func (b *{{$.GoNameLc}}Builder) {{.MethodName}}() *{{.TypeLc}}Builder {
return &{{.TypeLc}}Builder{
builder: builder[{{.TypeLc}}Builder, *{{.TypeLc}}Builder, {{.Type}}, {{ if not .IsGeneric }}*{{ end }}{{.Type}}]{
fetch: b.fetch,
parent: b,
idField: "{{.FieldName}}",
relField: "{{.MethodName}}",
{{- if .IsList}}
many: true,
{{- end}}
{{- if .IsGeneric }}
conv: func(u {{.Type}}) {{.Type}} { return u },
{{- else }}
conv: func(p *{{.Type}}) {{.Type}} { return *p },
{{- end }}
},
}
}
}
{{end}}

{{ if .IsGeneric }}
type {{ .Type }} interface {
is{{ .Type }}()
}

{{ $type := .Type }}
{{ range $index, $element := .GenericTypes }}
func (*{{ $element }}) is{{ $type }}() {}{{ end }}

type {{.TypeLc}}Builder struct {
builder[{{.TypeLc}}Builder, *{{.TypeLc}}Builder, {{.Type}}, {{.Type}}]
}

func (b *{{.TypeLc}}Builder) lazy(ds *Fetch, id any) {{.Type}} {
fqid, ok := id.(string)
if !ok {
return nil
}

collection, idStr, ok := strings.Cut(fqid, "/")
if !ok {
return nil
}

intId, err := strconv.Atoi(idStr)
if err != nil {
return nil
}

switch collection {
{{- $genericTypesLc := .GenericTypesLc }}
{{- $genericTypesCc := .GenericTypesCc }}
{{- range $i, $gType := .GenericTypes }}
case "{{ index $genericTypesCc $i }}":
{{- $typeLc := index $genericTypesLc $i }}
builder := &{{$typeLc}}Builder{
builder: builder[{{$typeLc}}Builder, *{{$typeLc}}Builder, {{$gType}}, *{{$gType}}]{
fetch: ds,
conv: func(p *{{$gType}}) {{$gType}} { return *p },
},
}
return builder.lazy(ds, intId)
{{- end }}
}

return nil
}

func (b *{{.TypeLc}}Builder) Preload(rel builderWrapperI) *{{.TypeLc}}Builder {
b.builder.Preload(rel)
return b
}
{{ end }}
{{ end }}

func (r *Fetch){{.GoName}}(ids... int) *{{.GoNameLc}}Builder {
return &{{.GoNameLc}}Builder{
builder: builder[{{.GoNameLc}}Builder, *{{.GoNameLc}}Builder, {{.GoName}}]{
builder: builder[{{.GoNameLc}}Builder, *{{.GoNameLc}}Builder, {{.GoName}}, *{{.GoName}}]{
ids: ids,
fetch: r,
conv: func(p *{{.GoName}}) {{.GoName}} { return *p },
},
}
}
3 changes: 3 additions & 0 deletions datastore/dsmodels/gen_models/header.go.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ package dsmodels

import (
"encoding/json"
"strconv"
"strings"

"github.com/OpenSlides/openslides-go/datastore/dsfetch"
"github.com/shopspring/decimal"
)
Loading