Bring back materialized view generation (#321)

This commit is contained in:
Daniel Bershatsky
2025-06-10 19:18:46 +03:00
committed by GitHub
parent 368eebb8a7
commit 16bd2372a7
3 changed files with 78 additions and 5 deletions

View File

@@ -36,6 +36,33 @@ var (
{{end}}
)
// Materialized view models.
var (
{{with .Views}}
{{range .}}
{{$model_name := .ViewName | camelize}}
{{$model_name}} = table.New(table.Metadata {
Name: "{{.ViewName}}",
Columns: []string{
{{- range .OrderedColumns}}
"{{.}}",
{{- end}}
},
PartKey: []string {
{{- range .PartitionKey}}
"{{.Name}}",
{{- end}}
},
SortKey: []string{
{{- range .ClusteringColumns}}
"{{.Name}}",
{{- end}}
},
})
{{end}}
{{end}}
)
{{with .UserTypes}}
{{range .}}
{{- $type_name := .Name | camelize}}
@@ -61,3 +88,16 @@ type {{$model_name}}Struct struct {
}
{{- end}}
{{- end}}
{{with .Views}}
{{range .}}
{{- $model_name := .ViewName | camelize}}
type {{$model_name}}Struct struct {
{{- range .Columns}}
{{- if not (eq .Type "empty") }}
{{.Name | camelize}} {{.Type | mapScyllaToGoType}}
{{- end}}
{{- end}}
}
{{- end}}
{{- end}}

View File

@@ -128,11 +128,8 @@ func renderTemplate(md *gocql.KeyspaceMetadata) ([]byte, error) {
imports = append(imports, "github.com/scylladb/gocqlx/v3")
}
for _, t := range md.Tables {
// Ensure ordered columns are sorted alphabetically
sort.Strings(t.OrderedColumns)
for _, c := range t.Columns {
updateImports := func(columns map[string]*gocql.ColumnMetadata) {
for _, c := range columns {
if (c.Type == "timestamp" || c.Type == "date" || c.Type == "time") && !existsInSlice(imports, "time") {
imports = append(imports, "time")
}
@@ -145,10 +142,24 @@ func renderTemplate(md *gocql.KeyspaceMetadata) ([]byte, error) {
}
}
// Ensure that for each table and materialized view
//
// 1. ordered columns are sorted alphabetically;
// 2. imports are resolves for column types.
for _, t := range md.Tables {
sort.Strings(t.OrderedColumns)
updateImports(t.Columns)
}
for _, v := range md.Views {
sort.Strings(v.OrderedColumns)
updateImports(v.Columns)
}
buf := &bytes.Buffer{}
data := map[string]interface{}{
"PackageName": *flagPkgname,
"Tables": md.Tables,
"Views": md.Views,
"UserTypes": md.Types,
"Imports": imports,
}

View File

@@ -47,6 +47,23 @@ var (
})
)
// Materialized view models.
var (
ComposersByName = table.New(table.Metadata{
Name: "composers_by_name",
Columns: []string{
"id",
"name",
},
PartKey: []string{
"id",
},
SortKey: []string{
"name",
},
})
)
type AlbumUserType struct {
gocqlx.UDT
Name string
@@ -69,3 +86,8 @@ type SongsStruct struct {
Tags []string
Title string
}
type ComposersByNameStruct struct {
Id [16]byte
Name string
}