70 lines
3.1 KiB
C#
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$;
|
|
""");
|
|
}
|
|
}
|
|
}
|