Iceshrimp.NET/Iceshrimp.Backend/Core/Database/Migrations/20240407184059_RemoveNoteDescendantsDbFunction.cs
Laura Hausmann 969622bfc7
[backend/api] Return note descendants in tree form (ISH-242)
This also partially addresses thread ordering in the Mastodon client API.
2024-04-07 20:43:28 +02:00

70 lines
3.1 KiB
C#

using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Iceshrimp.Backend.Core.Database.Migrations
{
/// <inheritdoc />
public partial class RemoveNoteDescendantsDbFunction : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql("DROP FUNCTION IF EXISTS public.note_descendants;");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql("""
DROP FUNCTION IF EXISTS public.note_descendants;
CREATE FUNCTION public.note_descendants (start_id character varying, max_depth integer, max_breadth integer)
RETURNS SETOF "note"
LANGUAGE sql
AS $function$
SELECT
*
FROM
"note"
WHERE
id IN( SELECT DISTINCT
id FROM (WITH RECURSIVE tree (
id,
ancestors,
depth
) AS (
SELECT
start_id,
'{}'::VARCHAR [],
0
UNION
SELECT
note.id,
CASE WHEN note. "replyId" = tree.id THEN
tree.ancestors || note. "replyId"
ELSE
tree.ancestors || note. "renoteId"
END,
depth + 1 FROM note,
tree
WHERE (note. "replyId" = tree.id
OR(
-- get renotes but not pure renotes
note. "renoteId" = tree.id
AND(note.text IS NOT NULL
OR CARDINALITY (note. "fileIds"
) != 0
OR note. "hasPoll" = TRUE)))
AND depth < max_depth)
SELECT
id,
-- apply the limit per node
row_number() OVER (PARTITION BY ancestors [array_upper(ancestors, 1)]) AS nth_child FROM tree
WHERE
depth > 0) AS RECURSIVE
WHERE
nth_child < max_breadth)
$function$;
""");
}
}
}