diff --git a/cmd/schemagen/keyspace.tmpl b/cmd/schemagen/keyspace.tmpl index 807950c..55e801b 100644 --- a/cmd/schemagen/keyspace.tmpl +++ b/cmd/schemagen/keyspace.tmpl @@ -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}} diff --git a/cmd/schemagen/schemagen.go b/cmd/schemagen/schemagen.go index 866ada7..a42c5fe 100644 --- a/cmd/schemagen/schemagen.go +++ b/cmd/schemagen/schemagen.go @@ -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, } diff --git a/cmd/schemagen/testdata/models.go b/cmd/schemagen/testdata/models.go index 5e4fc3e..657892b 100644 --- a/cmd/schemagen/testdata/models.go +++ b/cmd/schemagen/testdata/models.go @@ -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 +}