From 79f3c4ba46e9a640e6641abc2259a98aa1b89976 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Jerman?= Date: Fri, 30 Sep 2022 10:07:45 +0200 Subject: [PATCH] Add provision for report migration --- pkg/provision/provision.go | 1 + pkg/provision/reports.go | 76 ++++++++++++++++++++++++++++++++++++++ system/types/report.go | 12 ++++++ 3 files changed, 89 insertions(+) create mode 100644 pkg/provision/reports.go diff --git a/pkg/provision/provision.go b/pkg/provision/provision.go index 9bd915d81..2a9eae847 100644 --- a/pkg/provision/provision.go +++ b/pkg/provision/provision.go @@ -28,6 +28,7 @@ func Run(ctx context.Context, log *zap.Logger, s store.Storer, provisionOpt opti ffn := []func() error{ // Migrations: // (placeholder for all post 2022.3.x modifications) + func() error { return migrateReports(ctx, log.Named("reports"), s) }, // ************************************************************************************************************* diff --git a/pkg/provision/reports.go b/pkg/provision/reports.go new file mode 100644 index 000000000..081e6bc59 --- /dev/null +++ b/pkg/provision/reports.go @@ -0,0 +1,76 @@ +package provision + +import ( + "context" + + "github.com/cortezaproject/corteza-server/pkg/filter" + "github.com/cortezaproject/corteza-server/store" + "github.com/cortezaproject/corteza-server/system/types" + "go.uber.org/zap" +) + +func migrateReports(ctx context.Context, log *zap.Logger, s store.Storer) (err error) { + reports, _, err := store.SearchReports(ctx, s, types.ReportFilter{ + Deleted: filter.StateExcluded, + }) + if err != nil { + return + } + + mustMigrate := false + for _, r := range reports { + for _, s := range r.Sources { + mustMigrate = mustMigrate || (s.Step != nil && s.Step.Group_legacy != nil && s.Step.Link == nil) + } + for _, b := range r.Blocks { + for _, s := range b.Sources { + mustMigrate = mustMigrate || (s != nil && s.Group_legacy != nil && s.Link == nil) + } + } + } + + if !mustMigrate { + return + } + + ds := func(step *types.ReportStep) { + if step.Join != nil { + step.Kind = "link" + step.Link = &types.ReportStepLink{ + Name: step.Join.Name, + LocalSource: step.Join.LocalSource, + LocalColumn: step.Join.LocalColumn, + ForeignSource: step.Join.ForeignSource, + ForeignColumn: step.Join.ForeignColumn, + Filter: step.Join.Filter, + } + step.Join = nil + } + if step.Group_legacy != nil { + step.Kind = "aggregate" + step.Aggregate = &types.ReportStepAggregate{ + Name: step.Group_legacy.Name, + Source: step.Group_legacy.Source, + Keys: step.Group_legacy.Keys, + Columns: step.Group_legacy.Columns, + Filter: step.Group_legacy.Filter, + } + step.Group_legacy = nil + } + } + + for _, r := range reports { + for _, s := range r.Sources { + ds(s.Step) + } + for _, b := range r.Blocks { + for _, s := range b.Sources { + ds(s) + } + } + } + + return store.Tx(ctx, s, func(ctx context.Context, s store.Storer) error { + return store.UpdateReport(ctx, s, reports...) + }) +} diff --git a/system/types/report.go b/system/types/report.go index 37555f9f6..eda13882e 100644 --- a/system/types/report.go +++ b/system/types/report.go @@ -74,6 +74,10 @@ type ( Join *ReportStepJoin `json:"join,omitempty"` Link *ReportStepLink `json:"link,omitempty"` Aggregate *ReportStepAggregate `json:"aggregate,omitempty"` + + // @todo remove for the next set of patch/major releases. + // it exists just for the migration as we need to rename this one. + Group_legacy *ReportLegacyStepGroup `json:"group,omitempty"` } ReportStepLoad struct { @@ -101,6 +105,14 @@ type ( Filter *ReportFilterExpr `json:"filter,omitempty"` } + ReportLegacyStepGroup struct { + Name string `json:"name"` + Source string `json:"source"` + Keys ReportAggregateColumnSet `json:"keys"` + Columns ReportAggregateColumnSet `json:"columns"` + Filter *ReportFilterExpr `json:"filter,omitempty"` + } + ReportStepAggregate struct { Name string `json:"name"` Source string `json:"source"`