Add provision for report migration
This commit is contained in:
@@ -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) },
|
||||
|
||||
// *************************************************************************************************************
|
||||
|
||||
|
||||
@@ -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...)
|
||||
})
|
||||
}
|
||||
@@ -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"`
|
||||
|
||||
Reference in New Issue
Block a user