From 987e23069ed17b0b75852078655369f111f26a5c Mon Sep 17 00:00:00 2001 From: Hokuto Shinoda Date: Sun, 10 Dec 2023 16:51:37 +0900 Subject: [PATCH 1/5] =?UTF-8?q?perf:=20livestream=20search=E5=86=85?= =?UTF-8?q?=E3=81=AEN+1=E3=82=92=E8=BB=BD=E6=B8=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webapp/go/livestream_handler.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/webapp/go/livestream_handler.go b/webapp/go/livestream_handler.go index efcd5d3..3f2506c 100644 --- a/webapp/go/livestream_handler.go +++ b/webapp/go/livestream_handler.go @@ -200,14 +200,18 @@ func searchLivestreamsHandler(c echo.Context) error { if err := tx.SelectContext(ctx, &keyTaggedLivestreams, query, params...); err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "failed to get keyTaggedLivestreams: "+err.Error()) } + var keyTaggedLivestreamIDs []int64 + for _, k := range keyTaggedLivestreams { + keyTaggedLivestreamIDs = append(keyTaggedLivestreamIDs, k.LivestreamID) + } - for _, keyTaggedLivestream := range keyTaggedLivestreams { - ls := LivestreamModel{} - if err := tx.GetContext(ctx, &ls, "SELECT * FROM livestreams WHERE id = ?", keyTaggedLivestream.LivestreamID); err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, "failed to get livestreams: "+err.Error()) - } - - livestreamModels = append(livestreamModels, &ls) + // livestreamの取得 + query, params, err = sqlx.In("SELECT * FROM livestreams WHERE id IN (?)", keyTaggedLivestreamIDs) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "failed to construct IN query: "+err.Error()) + } + if err := tx.SelectContext(ctx, &livestreamModels, query, params...); err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "failed to get livestreams: "+err.Error()) } } else { // 検索条件なし From fadba3cab5b67f8f92bbeee6fc04673e7e1848a6 Mon Sep 17 00:00:00 2001 From: Hokuto Shinoda Date: Sun, 10 Dec 2023 16:54:33 +0900 Subject: [PATCH 2/5] =?UTF-8?q?fix:=20=E4=B8=A6=E3=81=B3=E3=81=AB=E6=84=8F?= =?UTF-8?q?=E5=91=B3=E3=81=8C=E3=81=82=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webapp/go/livestream_handler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/go/livestream_handler.go b/webapp/go/livestream_handler.go index 3f2506c..682d16c 100644 --- a/webapp/go/livestream_handler.go +++ b/webapp/go/livestream_handler.go @@ -206,7 +206,7 @@ func searchLivestreamsHandler(c echo.Context) error { } // livestreamの取得 - query, params, err = sqlx.In("SELECT * FROM livestreams WHERE id IN (?)", keyTaggedLivestreamIDs) + query, params, err = sqlx.In("SELECT * FROM livestreams WHERE id IN (?) ORDER BY id DESC", keyTaggedLivestreamIDs) if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "failed to construct IN query: "+err.Error()) } From 8e8ddd983887d979c557d4016080718e975b13be Mon Sep 17 00:00:00 2001 From: Hokuto Shinoda Date: Sun, 10 Dec 2023 17:38:42 +0900 Subject: [PATCH 3/5] =?UTF-8?q?perf:=20livestream=E3=81=AEfill=E3=82=92?= =?UTF-8?q?=E4=B8=80=E6=8B=AC=E3=81=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webapp/go/livestream_handler.go | 88 ++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 8 deletions(-) diff --git a/webapp/go/livestream_handler.go b/webapp/go/livestream_handler.go index 682d16c..924e053 100644 --- a/webapp/go/livestream_handler.go +++ b/webapp/go/livestream_handler.go @@ -191,7 +191,7 @@ func searchLivestreamsHandler(c echo.Context) error { } tagIDList = append(tagIDList, int(tagId)) - + query, params, err := sqlx.In("SELECT * FROM livestream_tags WHERE tag_id IN (?) ORDER BY livestream_id DESC", tagIDList) if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "failed to construct IN query: "+err.Error()) @@ -229,13 +229,9 @@ func searchLivestreamsHandler(c echo.Context) error { } } - livestreams := make([]Livestream, len(livestreamModels)) - for i := range livestreamModels { - livestream, err := fillLivestreamResponse(ctx, tx, *livestreamModels[i]) - if err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, "failed to fill livestream: "+err.Error()) - } - livestreams[i] = livestream + livestreams, err := fillLivestreamResponses(ctx, tx, livestreamModels) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, "failed to fill livestreams: "+err.Error()) } if err := tx.Commit(); err != nil { @@ -492,6 +488,82 @@ func getLivecommentReportsHandler(c echo.Context) error { return c.JSON(http.StatusOK, reports) } +func fillLivestreamResponses(ctx context.Context, tx *sqlx.Tx, models []*LivestreamModel) ([]Livestream, error) { + ownerIds := make([]int64, len(models)) + for i, m := range models { + ownerIds[i] = m.UserID + } + lIds := make([]int64, len(models)) + for i, m := range models { + lIds[i] = m.ID + } + + var ownerModels []UserModel + query, params, err := sqlx.In("SELECT * FROM users WHERE id IN (?)", ownerIds) + if err != nil { + return nil, err + } + if err := tx.SelectContext(ctx, &ownerModels, query, params...); err != nil { + return nil, err + } + var owners map[int64]User + for _, o := range ownerModels { + owner, err := fillUserResponse(ctx, tx, o) + if err != nil { + return nil, err + } + owners[o.ID] = owner + } + + query, params, err = sqlx.In("SELECT livestream_id, tag_id FROM livestream_tags WHERE livestream_id IN (?)", lIds) + if err != nil { + return nil, err + } + var lTagIdModels []struct { + LivestreamID int64 `db:"livestream_id"` + TagID int64 `db:"tag_id"` + } + if err := tx.SelectContext(ctx, &lTagIdModels, query, params...); err != nil { + return nil, err + } + var lTagIds map[int64][]int64 + for _, t := range lTagIdModels { + lTagIds[t.LivestreamID] = append(lTagIds[t.LivestreamID], t.TagID) + } + var lTags map[int64][]Tag + for lId, tIds := range lTagIds { + tags := make([]Tag, len(tIds)) + for i, tId := range tIds { + tag, found := tagCache.GetTagByID(tId) + if !found { + return nil, fmt.Errorf("tag not found: %d", tId) + } + tags[i] = Tag{ + ID: tag.ID, + Name: tag.Name, + } + } + lTags[lId] = tags + } + + livestreams := make([]Livestream, len(models)) + for i, m := range models { + livestreams[i] = Livestream{ + ID: m.ID, + Owner: owners[m.UserID], + Title: m.Title, + Tags: lTags[m.ID], + Description: m.Description, + PlaylistUrl: m.PlaylistUrl, + ThumbnailUrl: m.ThumbnailUrl, + StartAt: m.StartAt, + EndAt: m.EndAt, + } + } + + return livestreams, nil +} + func fillLivestreamResponse(ctx context.Context, tx *sqlx.Tx, livestreamModel LivestreamModel) (Livestream, error) { ownerModel := UserModel{} if err := tx.GetContext(ctx, &ownerModel, "SELECT * FROM users WHERE id = ?", livestreamModel.UserID); err != nil { From f294c56e46c3682dfa0e418db78160bad0dc4e5e Mon Sep 17 00:00:00 2001 From: Hokuto Shinoda Date: Sun, 10 Dec 2023 17:46:01 +0900 Subject: [PATCH 4/5] fix --- webapp/go/livestream_handler.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp/go/livestream_handler.go b/webapp/go/livestream_handler.go index 924e053..8ee0bc1 100644 --- a/webapp/go/livestream_handler.go +++ b/webapp/go/livestream_handler.go @@ -506,7 +506,7 @@ func fillLivestreamResponses(ctx context.Context, tx *sqlx.Tx, models []*Livestr if err := tx.SelectContext(ctx, &ownerModels, query, params...); err != nil { return nil, err } - var owners map[int64]User + owners := map[int64]User{} for _, o := range ownerModels { owner, err := fillUserResponse(ctx, tx, o) if err != nil { @@ -526,11 +526,11 @@ func fillLivestreamResponses(ctx context.Context, tx *sqlx.Tx, models []*Livestr if err := tx.SelectContext(ctx, &lTagIdModels, query, params...); err != nil { return nil, err } - var lTagIds map[int64][]int64 + lTagIds := map[int64][]int64{} for _, t := range lTagIdModels { lTagIds[t.LivestreamID] = append(lTagIds[t.LivestreamID], t.TagID) } - var lTags map[int64][]Tag + lTags := map[int64][]Tag{} for lId, tIds := range lTagIds { tags := make([]Tag, len(tIds)) for i, tId := range tIds { From 69447b6a8742ee53d6fffeb05c4669ada90ce1d0 Mon Sep 17 00:00:00 2001 From: Hokuto Shinoda Date: Sun, 10 Dec 2023 18:06:22 +0900 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20opmitempty=E5=AF=BE=E7=AD=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webapp/go/livestream_handler.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/webapp/go/livestream_handler.go b/webapp/go/livestream_handler.go index 8ee0bc1..0f9e730 100644 --- a/webapp/go/livestream_handler.go +++ b/webapp/go/livestream_handler.go @@ -548,11 +548,16 @@ func fillLivestreamResponses(ctx context.Context, tx *sqlx.Tx, models []*Livestr livestreams := make([]Livestream, len(models)) for i, m := range models { + tags, found := lTags[m.ID] + if !found { + tags = []Tag{} + } + livestreams[i] = Livestream{ ID: m.ID, Owner: owners[m.UserID], Title: m.Title, - Tags: lTags[m.ID], + Tags: tags, Description: m.Description, PlaylistUrl: m.PlaylistUrl, ThumbnailUrl: m.ThumbnailUrl,