From 1c556ce1b10e08df36defc456b8492cf2f0b9981 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Sat, 8 Apr 2023 10:47:24 +0800 Subject: [PATCH] optimize SQLQuery.AllQuery() logic return sorted *Query list --- core.go | 21 +++++++++++++++--- examples/Makefile | 5 ----- examples/auto/yesql.go | 48 +++++++++++++++++++++--------------------- examples/go.mod | 2 +- parser.go | 6 ++++-- version.go | 2 +- 6 files changed, 48 insertions(+), 36 deletions(-) diff --git a/core.go b/core.go index c3edbd4..fc16b67 100644 --- a/core.go +++ b/core.go @@ -37,6 +37,12 @@ type Query struct { Tags map[string]string } +// QueryList query list +type QueryList []*Query + +// QueryMap is a map associating a Tag to its Query +type QueryMap map[string]*Query + func (q *Query) PrepareStyle() string { prepareStyle := PrepareStyleStmt if style, exist := q.Tags["prepare"]; exist { @@ -51,8 +57,17 @@ func (q *Query) PrepareStyle() string { return prepareStyle } -// QueryMap is a map associating a Tag to its Query -type QueryMap map[string]*Query +func (q QueryList) Len() int { + return len(q) +} + +func (q QueryList) Less(i, j int) bool { + return q[i].Scope+"_"+q[i].Name < q[j].Scope+"_"+q[j].Name +} + +func (q QueryList) Swap(i, j int) { + q[i], q[j] = q[j], q[i] +} func (q QueryMap) FilterByStyle(style string) QueryMap { qm := make(QueryMap, len(q)) @@ -94,7 +109,7 @@ type SQLQuery interface { ListScope() ScopeQuery // AllQuery get all *Query list - AllQuery() []*Query + AllQuery() QueryList } // SQLParser sql file parser interface diff --git a/examples/Makefile b/examples/Makefile index 5097650..13495a0 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -8,11 +8,6 @@ default: run run: go run gen.go -.PHONY: mod-tidy -mod-tidy: - @go mod download - @go mod tidy - .PHONY: generate generate: @go generate gen.go diff --git a/examples/auto/yesql.go b/examples/auto/yesql.go index 4cc967c..dfda59d 100644 --- a/examples/auto/yesql.go +++ b/examples/auto/yesql.go @@ -1,6 +1,6 @@ // Code generated by Yesql. DO NOT EDIT. // versions: -// - Yesql v1.1.5 +// - Yesql v1.1.6 package yesql @@ -12,45 +12,45 @@ import ( ) const ( - _UserInfoB = `SELECT ` + "`" + `username` + "`" + `, ` + "`" + `nickname` + "`" + ` FROM @user WHERE username=?` - _UserInfoC = `SELECT "username" FROM @user WHERE username=?` - _UserInfoD = `SELECT "username", "nickname" FROM @user WHERE username=?` _LoginInfoA = `SELECT * FROM @user WHERE username=?` _LoginInfoB = `SELECT * FROM @user WHERE username=?` - _LogoutInfoC = `SELECT * FROM @user WHERE username=?` - _UserInfoA = `SELECT ` + "`" + `username` + "`" + ` FROM @user WHERE username=?` _LoginInfoD = `SELECT * FROM @user WHERE username=?` _LoginInfoE = `SELECT * FROM @user WHERE username=?` - _IncrTagsById_TagsInfo = `UPDATE @tag SET quote_num=quote_num+1, is_del=0, modified_on=? WHERE id IN (?)` + _LogoutInfoC = `SELECT * FROM @user WHERE username=?` + _UserInfoA = `SELECT ` + "`" + `username` + "`" + ` FROM @user WHERE username=?` + _UserInfoB = `SELECT ` + "`" + `username` + "`" + `, ` + "`" + `nickname` + "`" + ` FROM @user WHERE username=?` + _UserInfoC = `SELECT "username" FROM @user WHERE username=?` + _UserInfoD = `SELECT "username", "nickname" FROM @user WHERE username=?` + _DecrTagsById_Shutter = `UPDATE @tag SET quote_num=quote_num-1, modified_on=? WHERE id IN (?)` + _HotTags_Shutter = `SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.quote_num DESC LIMIT ? OFFSET ?` + _IncrTagsById_Shutter = `UPDATE @tag SET quote_num=quote_num+1, is_del=0, modified_on=? WHERE id IN (?)` + _InsertTag_Shutter = `INSERT INTO @tag (user_id, tag, created_on, modified_on, quote_num) VALUES (?, ?, ?, ?, 1)` + _NewestTags_Shutter = `SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.id DESC LIMIT ? OFFSET ?` + _TagsByIdA_Shutter = `SELECT id FROM @tag WHERE id IN (?) AND is_del = 0 AND quote_num > 0` + _TagsByIdB_Shutter = `SELECT id, user_id, tag, quote_num FROM @tag WHERE id IN (?)` + _TagsByKeywordA_Shutter = `SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 ORDER BY quote_num DESC LIMIT 6` + _TagsByKeywordB_Shutter = `SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 AND tag LIKE ? ORDER BY quote_num DESC LIMIT 6` + _TagsForIncr_Shutter = `SELECT id, user_id, tag, quote_num FROM @tag WHERE tag IN (?)` _DecrTagsById_TagsInfo = `UPDATE @tag SET quote_num=quote_num-1, modified_on=? WHERE id IN (?)` _HotTags_TagsInfo = `SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.quote_num DESC LIMIT ? OFFSET ?` - _TagsByKeywordA_TagsInfo = `SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 ORDER BY quote_num DESC LIMIT 6` - _TagsByKeywordB_TagsInfo = `SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 AND tag LIKE ? ORDER BY quote_num DESC LIMIT 6` + _IncrTagsById_TagsInfo = `UPDATE @tag SET quote_num=quote_num+1, is_del=0, modified_on=? WHERE id IN (?)` _InsertTag_TagsInfo = `INSERT INTO @tag (user_id, tag, created_on, modified_on, quote_num) VALUES (?, ?, ?, ?, 1)` + _NewestTags_TagsInfo = `SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.id DESC LIMIT ? OFFSET ?` _TagsByIdA_TagsInfo = `SELECT id FROM @tag WHERE id IN (?) AND is_del = 0 AND quote_num > 0` _TagsByIdB_TagsInfo = `SELECT id, user_id, tag, quote_num FROM @tag WHERE id IN (?)` + _TagsByKeywordA_TagsInfo = `SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 ORDER BY quote_num DESC LIMIT 6` + _TagsByKeywordB_TagsInfo = `SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 AND tag LIKE ? ORDER BY quote_num DESC LIMIT 6` _TagsForIncr_TagsInfo = `SELECT id, user_id, tag, quote_num FROM @tag WHERE tag IN (?)` - _NewestTags_TagsInfo = `SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.id DESC LIMIT ? OFFSET ?` - _NewestTags_Topic = `SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.id DESC LIMIT ? OFFSET ?` - _HotTags_Topic = `SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.quote_num DESC LIMIT ? OFFSET ?` - _TagsByKeywordA_Topic = `SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 ORDER BY quote_num DESC LIMIT 6` _DecrTagsById_Topic = `UPDATE @tag SET quote_num=quote_num-1, modified_on=? WHERE id IN (?)` + _HotTags_Topic = `SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.quote_num DESC LIMIT ? OFFSET ?` _IncrTagsById_Topic = `UPDATE @tag SET quote_num=quote_num+1, is_del=0, modified_on=? WHERE id IN (?)` - _TagsByKeywordB_Topic = `SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 AND tag LIKE ? ORDER BY quote_num DESC LIMIT 6` _InsertTag_Topic = `INSERT INTO @tag (user_id, tag, created_on, modified_on, quote_num) VALUES (?, ?, ?, ?, 1)` + _NewestTags_Topic = `SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.id DESC LIMIT ? OFFSET ?` _TagsByIdA_Topic = `SELECT id FROM @tag WHERE id IN (?) AND is_del = 0 AND quote_num > 0` _TagsByIdB_Topic = `SELECT id, user_id, tag, quote_num FROM @tag WHERE id IN (?)` + _TagsByKeywordA_Topic = `SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 ORDER BY quote_num DESC LIMIT 6` + _TagsByKeywordB_Topic = `SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 AND tag LIKE ? ORDER BY quote_num DESC LIMIT 6` _TagsForIncr_Topic = `SELECT id, user_id, tag, quote_num FROM @tag WHERE tag IN (?)` - _TagsByKeywordB_Shutter = `SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 AND tag LIKE ? ORDER BY quote_num DESC LIMIT 6` - _DecrTagsById_Shutter = `UPDATE @tag SET quote_num=quote_num-1, modified_on=? WHERE id IN (?)` - _HotTags_Shutter = `SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.quote_num DESC LIMIT ? OFFSET ?` - _TagsByKeywordA_Shutter = `SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 ORDER BY quote_num DESC LIMIT 6` - _InsertTag_Shutter = `INSERT INTO @tag (user_id, tag, created_on, modified_on, quote_num) VALUES (?, ?, ?, ?, 1)` - _TagsByIdA_Shutter = `SELECT id FROM @tag WHERE id IN (?) AND is_del = 0 AND quote_num > 0` - _TagsByIdB_Shutter = `SELECT id, user_id, tag, quote_num FROM @tag WHERE id IN (?)` - _TagsForIncr_Shutter = `SELECT id, user_id, tag, quote_num FROM @tag WHERE tag IN (?)` - _IncrTagsById_Shutter = `UPDATE @tag SET quote_num=quote_num+1, is_del=0, modified_on=? WHERE id IN (?)` - _NewestTags_Shutter = `SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin FROM @tag t JOIN @user u ON t.user_id = u.id WHERE t.is_del = 0 AND t.quote_num > 0 ORDER BY t.id DESC LIMIT ? OFFSET ?` ) type Yesql struct { diff --git a/examples/go.mod b/examples/go.mod index 99f118f..48c0b65 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -2,7 +2,7 @@ module github.com/alimy/yesql/examples go 1.18 -require github.com/alimy/yesql v1.1.2 +require github.com/alimy/yesql v1.1.6 require github.com/jmoiron/sqlx v1.3.5 diff --git a/parser.go b/parser.go index 232588e..ad805b6 100644 --- a/parser.go +++ b/parser.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "regexp" + "sort" "strings" ) @@ -71,8 +72,8 @@ func (s *sqlParser) ListScope() ScopeQuery { return s.scopeQuery } -func (s *sqlParser) AllQuery() []*Query { - allQuery := make([]*Query, 0, len(s.queryMap)) +func (s *sqlParser) AllQuery() QueryList { + allQuery := make(QueryList, 0, len(s.queryMap)) for _, query := range s.queryMap { allQuery = append(allQuery, query) } @@ -81,6 +82,7 @@ func (s *sqlParser) AllQuery() []*Query { allQuery = append(allQuery, query) } } + sort.Sort(allQuery) return allQuery } diff --git a/version.go b/version.go index e95c06c..6e74d78 100644 --- a/version.go +++ b/version.go @@ -1,3 +1,3 @@ package yesql -var Version = "v1.1.5" +var Version = "v1.1.6"