diff --git a/storage/template.go b/storage/template.go index d525e29..39cfa19 100644 --- a/storage/template.go +++ b/storage/template.go @@ -4,7 +4,6 @@ import ( "strings" "text/template" - lib "git.sr.ht/~cco/go-scopes" "git.sr.ht/~cco/go-scopes/logging/log" ) @@ -22,7 +21,7 @@ func Template(name, src string) *template.Template { return t } -func BuildSql(t *template.Template, data lib.Map) string { +func BuildSql(t *template.Template, data any) string { var out strings.Builder err := t.Execute(&out, data) if err != nil { diff --git a/storage/tracking/sql_code.go b/storage/tracking/sql_code.go index d8b6777..295d7a3 100644 --- a/storage/tracking/sql_code.go +++ b/storage/tracking/sql_code.go @@ -41,17 +41,16 @@ insert into {{ $tablename }} ( returning trackid, timestamp` sql_select = ` -{{- $tablename := or (and .schema (printf "%s.%s" .schema .tablename)) .tablename -}} -select {{ range $j, $c := .scols -}} +select {{ range $j, $c := .Scols -}} {{- if ne $j 0 -}}, {{ end }}{{ toLower $c }}{{- end }} - from {{ $tablename }} - where {{ range $j, $c := .qucols -}} + from {{ .Table }} + where {{ range $j, $c := .Qucols -}} {{- if ne $j 0 }} and {{ end }}{{ toLower $c }} = ${{ add1 $j }}{{- end }} - {{ with .ordcols -}} + {{ with .Ordcols -}} order by {{ range $j, $c := . -}} {{- if ne $j 0 -}}, {{ end }}{{ toLower $c }}{{- end -}} {{- end }} - {{ with .limit }}limit {{ . }}{{ end }} + {{ with .Limit }}limit {{ . }}{{ end }} ` ) diff --git a/storage/tracking/tracking.go b/storage/tracking/tracking.go index 35a1372..4f06fc6 100644 --- a/storage/tracking/tracking.go +++ b/storage/tracking/tracking.go @@ -5,6 +5,7 @@ package tracking import ( sqllib "database/sql" "encoding/json" + "fmt" "time" lib "git.sr.ht/~cco/go-scopes" @@ -92,6 +93,36 @@ func Tracks(db *sql.Storage) *Container { return &Container{container_definition, db} } +func (cont *Container) setupQuerySpec(spec *querySpec) *querySpec { + if cont.Storage.Schema == "" { + spec.Table = cont.TableName + } else { + spec.Table = fmt.Sprintf("%s.%s", cont.Storage.Schema, cont.TableName) + } + spec.Scols = append(cont.HeadFields, "timestamp", "data", "trackid") + for i, v := range spec.Headvals { + if v != "" { + spec.Qucols = append(spec.Qucols, cont.HeadFields[i]) + spec.Quvals = append(spec.Quvals, v) + } + } + return spec +} + +type querySpec struct { + Table string + Headvals lib.StrSlice + Scols lib.StrSlice + Qucols, Ordcols lib.StrSlice + Quspecs []struct{ col, op string } + Ordspecs []struct { + Col string + Desc bool + } + Limit int + Quvals []any +} + func (cont *Container) Get(id lib.Ident) *Track { db := cont.Storage var tr *Track @@ -99,41 +130,31 @@ func (cont *Container) Get(id lib.Ident) *Track { tr = cont.ItemFactory(cont) return tr.ScanP(r) } - quData := lib.Map{ - "schema": db.Schema, - "tablename": cont.TableName, - "scols": append(cont.HeadFields, "timestamp", "data", "trackid"), - "qucols": lib.StrSlice{"trackid"}, + quSpec := &querySpec{ + Qucols: lib.StrSlice{"trackid"}, + Quvals: []any{id}, } - sql := storage.BuildSql(SqlSelect, quData) + cont.setupQuerySpec(quSpec) + sql := storage.BuildSql(SqlSelect, quSpec) db.Query(proc, sql, id) return tr } -func (cont *Container) QueryLast(hv lib.StrSlice) *Track { +func (cont *Container) QueryLast(hv ...string) *Track { db := cont.Storage var tr *Track proc := func(r *sql.Rows) error { tr = cont.ItemFactory(cont) return tr.ScanP(r) } - var qucols lib.StrSlice - var quvals []any - for i, k := range hv { - if k != "" { - qucols = append(qucols, cont.HeadFields[i]) - quvals = append(quvals, k) - } + quSpec := &querySpec{ + Headvals: hv, + Ordcols: lib.StrSlice{"timestamp"}, } - quData := lib.Map{ - "schema": db.Schema, - "tablename": cont.TableName, - "scols": append(cont.HeadFields, "timestamp", "data", "trackid"), - "qucols": qucols, - "ordcols": lib.StrSlice{"timestamp"}, - } - sql := storage.BuildSql(SqlSelect, quData) - db.Query(proc, sql, quvals...) + cont.setupQuerySpec(quSpec) + sql := storage.BuildSql(SqlSelect, quSpec) + println(sql) + db.Query(proc, sql, quSpec.Quvals...) return tr } diff --git a/tests/storage_test.go b/tests/storage_test.go index 0443c66..f1488b7 100644 --- a/tests/storage_test.go +++ b/tests/storage_test.go @@ -74,7 +74,7 @@ func TrackingTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) { tr2 := cont.Get(1) //fmt.Printf("%+v\n", tr2.TimeStamp()) t.AssertEqual(tr2.Head["userName"], "john") - tr3 := cont.QueryLast(lib.StrSlice{"", "john"}) + tr3 := cont.QueryLast("", "john") t.AssertEqual(tr3.Head["taskId"], "t01") }