diff --git a/.pg_format b/.pg_format new file mode 100644 index 00000000..5d346b91 --- /dev/null +++ b/.pg_format @@ -0,0 +1,4 @@ +tabs=1 +function-case=1 #lowercase +keyword-case=1 +type-case=1 diff --git a/back/src/Kyoo.Core/Controllers/Repositories/LibraryItemRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/LibraryItemRepository.cs index 93f9673d..f3b3dd12 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/LibraryItemRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/LibraryItemRepository.cs @@ -25,6 +25,7 @@ using System.Linq.Expressions; using System.Runtime.CompilerServices; using System.Threading.Tasks; using Dapper; +using InterpolatedSql.Dapper; using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Models; using Kyoo.Abstractions.Models.Exceptions; @@ -97,9 +98,9 @@ namespace Kyoo.Core.Controllers return sort switch { // TODO: Implement default sort by - Sort.Default => "", - Sort.By(string key, bool desc) => $"coalesce({tables.Select(x => $"{x}.{key}")}) {(desc ? "desc" : "asc")}", - Sort.Random(var seed) => $"md5({seed} || coalesce({tables.Select(x => $"{x}.id")}))", + Sort.Default => $"coalesce({string.Join(", ", tables.Select(x => $"{x}.name"))})", + Sort.By(string key, bool desc) => $"coalesce({string.Join(", ", tables.Select(x => $"{x}.{key}"))}) {(desc ? "desc" : "asc")}", + Sort.Random(var seed) => $"md5({seed} || coalesce({string.Join(", ", tables.Select(x => $"{x}.id"))}))", Sort.Conglomerate(var list) => string.Join(", ", list.Select(x => ProcessSort(x, tables))), _ => throw new SwitchExpressionException(), }; @@ -112,19 +113,30 @@ namespace Kyoo.Core.Controllers Include? include = null) { // language=PostgreSQL - string sql = @" - select s.*, m.*, c.*, st.* from shows as s full outer join ( - select * from movies - ) as m on false - full outer join ( - select * from collections - ) as c on false - left join studios as st on st.id = coalesce(s.studio_id, m.studio_id) - order by @SortBy - limit @Take - "; + IDapperSqlCommand query = _database.SqlBuilder($""" + select + s.*, + m.*, + c.*, + st.* + from + shows as s + full outer join ( + select + * + from + movies) as m on false + full outer join ( + select + * + from + collections) as c on false + left join studios as st on st.id = coalesce(s.studio_id, m.studio_id) + order by {ProcessSort(sort, new[] { "s", "m", "c" }):raw} + limit {limit.Limit} + """).Build(); - var data = await _database.QueryAsync(sql, new[] { typeof(Show), typeof(Movie), typeof(Collection), typeof(Studio) }, items => + var data = await query.QueryAsync(new[] { typeof(Show), typeof(Movie), typeof(Collection), typeof(Studio) }, items => { var studio = items[3] as Studio; if (items[0] is Show show && show.Id != 0) @@ -134,7 +146,7 @@ namespace Kyoo.Core.Controllers if (items[2] is Collection collection && collection.Id != 0) return collection; throw new InvalidDataException(); - }, new { SortBy = ProcessSort(sort, new[] { "s", "m", "c" }), Take = limit.Limit }); + }); // await using DbDataReader reader = await _database.ExecuteReaderAsync(sql); // int kindOrdinal = reader.GetOrdinal("kind"); diff --git a/back/src/Kyoo.Core/Kyoo.Core.csproj b/back/src/Kyoo.Core/Kyoo.Core.csproj index 1f9bb856..c423c5d2 100644 --- a/back/src/Kyoo.Core/Kyoo.Core.csproj +++ b/back/src/Kyoo.Core/Kyoo.Core.csproj @@ -9,6 +9,7 @@ + diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index a948acc8..a5deabcf 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -92,6 +92,7 @@ services: - "5432:5432" environment: - POSTGRES_HOST_AUTH_METHOD=trust + command: ["postgres", "-c", "log_statement=all"] healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 5s