-- NOTE: This file is auto generated by ./sql-generator

-- DuplicateRepository.getAll
with
  "duplicates" as (
    select
      "assets"."duplicateId",
      json_agg(
        "asset"
        order by
          "assets"."localDateTime" asc
      ) as "assets"
    from
      "assets"
      left join lateral (
        select
          "assets".*,
          "exif" as "exifInfo"
        from
          "exif"
        where
          "exif"."assetId" = "assets"."id"
      ) as "asset" on true
    where
      "assets"."visibility" in ('archive', 'timeline')
      and "assets"."ownerId" = $1::uuid
      and "assets"."duplicateId" is not null
      and "assets"."deletedAt" is null
      and "assets"."stackId" is null
    group by
      "assets"."duplicateId"
  ),
  "unique" as (
    select
      "duplicateId"
    from
      "duplicates"
    where
      json_array_length("assets") = $2
  ),
  "removed_unique" as (
    update "assets"
    set
      "duplicateId" = $3
    from
      "unique"
    where
      "assets"."duplicateId" = "unique"."duplicateId"
  )
select
  *
from
  "duplicates"
where
  not exists (
    select
    from
      "unique"
    where
      "unique"."duplicateId" = "duplicates"."duplicateId"
  )

-- DuplicateRepository.delete
update "assets"
set
  "duplicateId" = $1
where
  "ownerId" = $2
  and "duplicateId" = $3

-- DuplicateRepository.deleteAll
update "assets"
set
  "duplicateId" = $1
where
  "ownerId" = $2
  and "duplicateId" in ($3)

-- DuplicateRepository.search
begin
set
  local vchordrq.probes = 1
with
  "cte" as (
    select
      "assets"."id" as "assetId",
      "assets"."duplicateId",
      smart_search.embedding <=> $1 as "distance"
    from
      "assets"
      inner join "smart_search" on "assets"."id" = "smart_search"."assetId"
    where
      "assets"."visibility" in ('archive', 'timeline')
      and "assets"."ownerId" = any ($2::uuid[])
      and "assets"."deletedAt" is null
      and "assets"."type" = $3
      and "assets"."id" != $4::uuid
      and "assets"."stackId" is null
    order by
      "distance"
    limit
      $5
  )
select
  *
from
  "cte"
where
  "cte"."distance" <= $6
commit

-- DuplicateRepository.merge
update "assets"
set
where
  (
    "duplicateId" = any ($1::uuid[])
    or "id" = any ($2::uuid[])
  )
