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

-- AssetRepository.getByDayOfYear
SELECT
  "entity"."id" AS "entity_id",
  "entity"."deviceAssetId" AS "entity_deviceAssetId",
  "entity"."ownerId" AS "entity_ownerId",
  "entity"."libraryId" AS "entity_libraryId",
  "entity"."deviceId" AS "entity_deviceId",
  "entity"."type" AS "entity_type",
  "entity"."status" AS "entity_status",
  "entity"."originalPath" AS "entity_originalPath",
  "entity"."thumbhash" AS "entity_thumbhash",
  "entity"."encodedVideoPath" AS "entity_encodedVideoPath",
  "entity"."createdAt" AS "entity_createdAt",
  "entity"."updatedAt" AS "entity_updatedAt",
  "entity"."deletedAt" AS "entity_deletedAt",
  "entity"."fileCreatedAt" AS "entity_fileCreatedAt",
  "entity"."localDateTime" AS "entity_localDateTime",
  "entity"."fileModifiedAt" AS "entity_fileModifiedAt",
  "entity"."isFavorite" AS "entity_isFavorite",
  "entity"."isArchived" AS "entity_isArchived",
  "entity"."isExternal" AS "entity_isExternal",
  "entity"."isOffline" AS "entity_isOffline",
  "entity"."checksum" AS "entity_checksum",
  "entity"."duration" AS "entity_duration",
  "entity"."isVisible" AS "entity_isVisible",
  "entity"."livePhotoVideoId" AS "entity_livePhotoVideoId",
  "entity"."originalFileName" AS "entity_originalFileName",
  "entity"."sidecarPath" AS "entity_sidecarPath",
  "entity"."stackId" AS "entity_stackId",
  "entity"."duplicateId" AS "entity_duplicateId",
  "exifInfo"."assetId" AS "exifInfo_assetId",
  "exifInfo"."description" AS "exifInfo_description",
  "exifInfo"."exifImageWidth" AS "exifInfo_exifImageWidth",
  "exifInfo"."exifImageHeight" AS "exifInfo_exifImageHeight",
  "exifInfo"."fileSizeInByte" AS "exifInfo_fileSizeInByte",
  "exifInfo"."orientation" AS "exifInfo_orientation",
  "exifInfo"."dateTimeOriginal" AS "exifInfo_dateTimeOriginal",
  "exifInfo"."modifyDate" AS "exifInfo_modifyDate",
  "exifInfo"."timeZone" AS "exifInfo_timeZone",
  "exifInfo"."latitude" AS "exifInfo_latitude",
  "exifInfo"."longitude" AS "exifInfo_longitude",
  "exifInfo"."projectionType" AS "exifInfo_projectionType",
  "exifInfo"."city" AS "exifInfo_city",
  "exifInfo"."livePhotoCID" AS "exifInfo_livePhotoCID",
  "exifInfo"."autoStackId" AS "exifInfo_autoStackId",
  "exifInfo"."state" AS "exifInfo_state",
  "exifInfo"."country" AS "exifInfo_country",
  "exifInfo"."make" AS "exifInfo_make",
  "exifInfo"."model" AS "exifInfo_model",
  "exifInfo"."lensModel" AS "exifInfo_lensModel",
  "exifInfo"."fNumber" AS "exifInfo_fNumber",
  "exifInfo"."focalLength" AS "exifInfo_focalLength",
  "exifInfo"."iso" AS "exifInfo_iso",
  "exifInfo"."exposureTime" AS "exifInfo_exposureTime",
  "exifInfo"."profileDescription" AS "exifInfo_profileDescription",
  "exifInfo"."colorspace" AS "exifInfo_colorspace",
  "exifInfo"."bitsPerSample" AS "exifInfo_bitsPerSample",
  "exifInfo"."rating" AS "exifInfo_rating",
  "exifInfo"."fps" AS "exifInfo_fps",
  "files"."id" AS "files_id",
  "files"."assetId" AS "files_assetId",
  "files"."createdAt" AS "files_createdAt",
  "files"."updatedAt" AS "files_updatedAt",
  "files"."type" AS "files_type",
  "files"."path" AS "files_path"
FROM
  "assets" "entity"
  LEFT JOIN "exif" "exifInfo" ON "exifInfo"."assetId" = "entity"."id"
  LEFT JOIN "asset_files" "files" ON "files"."assetId" = "entity"."id"
WHERE
  (
    "entity"."ownerId" IN ($1)
    AND "entity"."isVisible" = true
    AND "entity"."isArchived" = false
    AND EXTRACT(
      DAY
      FROM
        "entity"."localDateTime" AT TIME ZONE 'UTC'
    ) = $2
    AND EXTRACT(
      MONTH
      FROM
        "entity"."localDateTime" AT TIME ZONE 'UTC'
    ) = $3
  )
  AND ("entity"."deletedAt" IS NULL)
ORDER BY
  "entity"."localDateTime" ASC

-- AssetRepository.getByIds
SELECT
  "AssetEntity"."id" AS "AssetEntity_id",
  "AssetEntity"."deviceAssetId" AS "AssetEntity_deviceAssetId",
  "AssetEntity"."ownerId" AS "AssetEntity_ownerId",
  "AssetEntity"."libraryId" AS "AssetEntity_libraryId",
  "AssetEntity"."deviceId" AS "AssetEntity_deviceId",
  "AssetEntity"."type" AS "AssetEntity_type",
  "AssetEntity"."status" AS "AssetEntity_status",
  "AssetEntity"."originalPath" AS "AssetEntity_originalPath",
  "AssetEntity"."thumbhash" AS "AssetEntity_thumbhash",
  "AssetEntity"."encodedVideoPath" AS "AssetEntity_encodedVideoPath",
  "AssetEntity"."createdAt" AS "AssetEntity_createdAt",
  "AssetEntity"."updatedAt" AS "AssetEntity_updatedAt",
  "AssetEntity"."deletedAt" AS "AssetEntity_deletedAt",
  "AssetEntity"."fileCreatedAt" AS "AssetEntity_fileCreatedAt",
  "AssetEntity"."localDateTime" AS "AssetEntity_localDateTime",
  "AssetEntity"."fileModifiedAt" AS "AssetEntity_fileModifiedAt",
  "AssetEntity"."isFavorite" AS "AssetEntity_isFavorite",
  "AssetEntity"."isArchived" AS "AssetEntity_isArchived",
  "AssetEntity"."isExternal" AS "AssetEntity_isExternal",
  "AssetEntity"."isOffline" AS "AssetEntity_isOffline",
  "AssetEntity"."checksum" AS "AssetEntity_checksum",
  "AssetEntity"."duration" AS "AssetEntity_duration",
  "AssetEntity"."isVisible" AS "AssetEntity_isVisible",
  "AssetEntity"."livePhotoVideoId" AS "AssetEntity_livePhotoVideoId",
  "AssetEntity"."originalFileName" AS "AssetEntity_originalFileName",
  "AssetEntity"."sidecarPath" AS "AssetEntity_sidecarPath",
  "AssetEntity"."stackId" AS "AssetEntity_stackId",
  "AssetEntity"."duplicateId" AS "AssetEntity_duplicateId"
FROM
  "assets" "AssetEntity"
WHERE
  (("AssetEntity"."id" IN ($1)))

-- AssetRepository.getByIdsWithAllRelations
SELECT
  "AssetEntity"."id" AS "AssetEntity_id",
  "AssetEntity"."deviceAssetId" AS "AssetEntity_deviceAssetId",
  "AssetEntity"."ownerId" AS "AssetEntity_ownerId",
  "AssetEntity"."libraryId" AS "AssetEntity_libraryId",
  "AssetEntity"."deviceId" AS "AssetEntity_deviceId",
  "AssetEntity"."type" AS "AssetEntity_type",
  "AssetEntity"."status" AS "AssetEntity_status",
  "AssetEntity"."originalPath" AS "AssetEntity_originalPath",
  "AssetEntity"."thumbhash" AS "AssetEntity_thumbhash",
  "AssetEntity"."encodedVideoPath" AS "AssetEntity_encodedVideoPath",
  "AssetEntity"."createdAt" AS "AssetEntity_createdAt",
  "AssetEntity"."updatedAt" AS "AssetEntity_updatedAt",
  "AssetEntity"."deletedAt" AS "AssetEntity_deletedAt",
  "AssetEntity"."fileCreatedAt" AS "AssetEntity_fileCreatedAt",
  "AssetEntity"."localDateTime" AS "AssetEntity_localDateTime",
  "AssetEntity"."fileModifiedAt" AS "AssetEntity_fileModifiedAt",
  "AssetEntity"."isFavorite" AS "AssetEntity_isFavorite",
  "AssetEntity"."isArchived" AS "AssetEntity_isArchived",
  "AssetEntity"."isExternal" AS "AssetEntity_isExternal",
  "AssetEntity"."isOffline" AS "AssetEntity_isOffline",
  "AssetEntity"."checksum" AS "AssetEntity_checksum",
  "AssetEntity"."duration" AS "AssetEntity_duration",
  "AssetEntity"."isVisible" AS "AssetEntity_isVisible",
  "AssetEntity"."livePhotoVideoId" AS "AssetEntity_livePhotoVideoId",
  "AssetEntity"."originalFileName" AS "AssetEntity_originalFileName",
  "AssetEntity"."sidecarPath" AS "AssetEntity_sidecarPath",
  "AssetEntity"."stackId" AS "AssetEntity_stackId",
  "AssetEntity"."duplicateId" AS "AssetEntity_duplicateId",
  "AssetEntity__AssetEntity_exifInfo"."assetId" AS "AssetEntity__AssetEntity_exifInfo_assetId",
  "AssetEntity__AssetEntity_exifInfo"."description" AS "AssetEntity__AssetEntity_exifInfo_description",
  "AssetEntity__AssetEntity_exifInfo"."exifImageWidth" AS "AssetEntity__AssetEntity_exifInfo_exifImageWidth",
  "AssetEntity__AssetEntity_exifInfo"."exifImageHeight" AS "AssetEntity__AssetEntity_exifInfo_exifImageHeight",
  "AssetEntity__AssetEntity_exifInfo"."fileSizeInByte" AS "AssetEntity__AssetEntity_exifInfo_fileSizeInByte",
  "AssetEntity__AssetEntity_exifInfo"."orientation" AS "AssetEntity__AssetEntity_exifInfo_orientation",
  "AssetEntity__AssetEntity_exifInfo"."dateTimeOriginal" AS "AssetEntity__AssetEntity_exifInfo_dateTimeOriginal",
  "AssetEntity__AssetEntity_exifInfo"."modifyDate" AS "AssetEntity__AssetEntity_exifInfo_modifyDate",
  "AssetEntity__AssetEntity_exifInfo"."timeZone" AS "AssetEntity__AssetEntity_exifInfo_timeZone",
  "AssetEntity__AssetEntity_exifInfo"."latitude" AS "AssetEntity__AssetEntity_exifInfo_latitude",
  "AssetEntity__AssetEntity_exifInfo"."longitude" AS "AssetEntity__AssetEntity_exifInfo_longitude",
  "AssetEntity__AssetEntity_exifInfo"."projectionType" AS "AssetEntity__AssetEntity_exifInfo_projectionType",
  "AssetEntity__AssetEntity_exifInfo"."city" AS "AssetEntity__AssetEntity_exifInfo_city",
  "AssetEntity__AssetEntity_exifInfo"."livePhotoCID" AS "AssetEntity__AssetEntity_exifInfo_livePhotoCID",
  "AssetEntity__AssetEntity_exifInfo"."autoStackId" AS "AssetEntity__AssetEntity_exifInfo_autoStackId",
  "AssetEntity__AssetEntity_exifInfo"."state" AS "AssetEntity__AssetEntity_exifInfo_state",
  "AssetEntity__AssetEntity_exifInfo"."country" AS "AssetEntity__AssetEntity_exifInfo_country",
  "AssetEntity__AssetEntity_exifInfo"."make" AS "AssetEntity__AssetEntity_exifInfo_make",
  "AssetEntity__AssetEntity_exifInfo"."model" AS "AssetEntity__AssetEntity_exifInfo_model",
  "AssetEntity__AssetEntity_exifInfo"."lensModel" AS "AssetEntity__AssetEntity_exifInfo_lensModel",
  "AssetEntity__AssetEntity_exifInfo"."fNumber" AS "AssetEntity__AssetEntity_exifInfo_fNumber",
  "AssetEntity__AssetEntity_exifInfo"."focalLength" AS "AssetEntity__AssetEntity_exifInfo_focalLength",
  "AssetEntity__AssetEntity_exifInfo"."iso" AS "AssetEntity__AssetEntity_exifInfo_iso",
  "AssetEntity__AssetEntity_exifInfo"."exposureTime" AS "AssetEntity__AssetEntity_exifInfo_exposureTime",
  "AssetEntity__AssetEntity_exifInfo"."profileDescription" AS "AssetEntity__AssetEntity_exifInfo_profileDescription",
  "AssetEntity__AssetEntity_exifInfo"."colorspace" AS "AssetEntity__AssetEntity_exifInfo_colorspace",
  "AssetEntity__AssetEntity_exifInfo"."bitsPerSample" AS "AssetEntity__AssetEntity_exifInfo_bitsPerSample",
  "AssetEntity__AssetEntity_exifInfo"."rating" AS "AssetEntity__AssetEntity_exifInfo_rating",
  "AssetEntity__AssetEntity_exifInfo"."fps" AS "AssetEntity__AssetEntity_exifInfo_fps",
  "AssetEntity__AssetEntity_smartInfo"."assetId" AS "AssetEntity__AssetEntity_smartInfo_assetId",
  "AssetEntity__AssetEntity_smartInfo"."tags" AS "AssetEntity__AssetEntity_smartInfo_tags",
  "AssetEntity__AssetEntity_smartInfo"."objects" AS "AssetEntity__AssetEntity_smartInfo_objects",
  "AssetEntity__AssetEntity_tags"."id" AS "AssetEntity__AssetEntity_tags_id",
  "AssetEntity__AssetEntity_tags"."value" AS "AssetEntity__AssetEntity_tags_value",
  "AssetEntity__AssetEntity_tags"."createdAt" AS "AssetEntity__AssetEntity_tags_createdAt",
  "AssetEntity__AssetEntity_tags"."updatedAt" AS "AssetEntity__AssetEntity_tags_updatedAt",
  "AssetEntity__AssetEntity_tags"."color" AS "AssetEntity__AssetEntity_tags_color",
  "AssetEntity__AssetEntity_tags"."parentId" AS "AssetEntity__AssetEntity_tags_parentId",
  "AssetEntity__AssetEntity_tags"."userId" AS "AssetEntity__AssetEntity_tags_userId",
  "AssetEntity__AssetEntity_faces"."id" AS "AssetEntity__AssetEntity_faces_id",
  "AssetEntity__AssetEntity_faces"."assetId" AS "AssetEntity__AssetEntity_faces_assetId",
  "AssetEntity__AssetEntity_faces"."personId" AS "AssetEntity__AssetEntity_faces_personId",
  "AssetEntity__AssetEntity_faces"."imageWidth" AS "AssetEntity__AssetEntity_faces_imageWidth",
  "AssetEntity__AssetEntity_faces"."imageHeight" AS "AssetEntity__AssetEntity_faces_imageHeight",
  "AssetEntity__AssetEntity_faces"."boundingBoxX1" AS "AssetEntity__AssetEntity_faces_boundingBoxX1",
  "AssetEntity__AssetEntity_faces"."boundingBoxY1" AS "AssetEntity__AssetEntity_faces_boundingBoxY1",
  "AssetEntity__AssetEntity_faces"."boundingBoxX2" AS "AssetEntity__AssetEntity_faces_boundingBoxX2",
  "AssetEntity__AssetEntity_faces"."boundingBoxY2" AS "AssetEntity__AssetEntity_faces_boundingBoxY2",
  "AssetEntity__AssetEntity_faces"."sourceType" AS "AssetEntity__AssetEntity_faces_sourceType",
  "8258e303a73a72cf6abb13d73fb592dde0d68280"."id" AS "8258e303a73a72cf6abb13d73fb592dde0d68280_id",
  "8258e303a73a72cf6abb13d73fb592dde0d68280"."createdAt" AS "8258e303a73a72cf6abb13d73fb592dde0d68280_createdAt",
  "8258e303a73a72cf6abb13d73fb592dde0d68280"."updatedAt" AS "8258e303a73a72cf6abb13d73fb592dde0d68280_updatedAt",
  "8258e303a73a72cf6abb13d73fb592dde0d68280"."ownerId" AS "8258e303a73a72cf6abb13d73fb592dde0d68280_ownerId",
  "8258e303a73a72cf6abb13d73fb592dde0d68280"."name" AS "8258e303a73a72cf6abb13d73fb592dde0d68280_name",
  "8258e303a73a72cf6abb13d73fb592dde0d68280"."birthDate" AS "8258e303a73a72cf6abb13d73fb592dde0d68280_birthDate",
  "8258e303a73a72cf6abb13d73fb592dde0d68280"."thumbnailPath" AS "8258e303a73a72cf6abb13d73fb592dde0d68280_thumbnailPath",
  "8258e303a73a72cf6abb13d73fb592dde0d68280"."faceAssetId" AS "8258e303a73a72cf6abb13d73fb592dde0d68280_faceAssetId",
  "8258e303a73a72cf6abb13d73fb592dde0d68280"."isHidden" AS "8258e303a73a72cf6abb13d73fb592dde0d68280_isHidden",
  "8258e303a73a72cf6abb13d73fb592dde0d68280"."withArchived" AS "8258e303a73a72cf6abb13d73fb592dde0d68280_withArchived",
  "AssetEntity__AssetEntity_stack"."id" AS "AssetEntity__AssetEntity_stack_id",
  "AssetEntity__AssetEntity_stack"."ownerId" AS "AssetEntity__AssetEntity_stack_ownerId",
  "AssetEntity__AssetEntity_stack"."primaryAssetId" AS "AssetEntity__AssetEntity_stack_primaryAssetId",
  "bd93d5747511a4dad4923546c51365bf1a803774"."id" AS "bd93d5747511a4dad4923546c51365bf1a803774_id",
  "bd93d5747511a4dad4923546c51365bf1a803774"."deviceAssetId" AS "bd93d5747511a4dad4923546c51365bf1a803774_deviceAssetId",
  "bd93d5747511a4dad4923546c51365bf1a803774"."ownerId" AS "bd93d5747511a4dad4923546c51365bf1a803774_ownerId",
  "bd93d5747511a4dad4923546c51365bf1a803774"."libraryId" AS "bd93d5747511a4dad4923546c51365bf1a803774_libraryId",
  "bd93d5747511a4dad4923546c51365bf1a803774"."deviceId" AS "bd93d5747511a4dad4923546c51365bf1a803774_deviceId",
  "bd93d5747511a4dad4923546c51365bf1a803774"."type" AS "bd93d5747511a4dad4923546c51365bf1a803774_type",
  "bd93d5747511a4dad4923546c51365bf1a803774"."status" AS "bd93d5747511a4dad4923546c51365bf1a803774_status",
  "bd93d5747511a4dad4923546c51365bf1a803774"."originalPath" AS "bd93d5747511a4dad4923546c51365bf1a803774_originalPath",
  "bd93d5747511a4dad4923546c51365bf1a803774"."thumbhash" AS "bd93d5747511a4dad4923546c51365bf1a803774_thumbhash",
  "bd93d5747511a4dad4923546c51365bf1a803774"."encodedVideoPath" AS "bd93d5747511a4dad4923546c51365bf1a803774_encodedVideoPath",
  "bd93d5747511a4dad4923546c51365bf1a803774"."createdAt" AS "bd93d5747511a4dad4923546c51365bf1a803774_createdAt",
  "bd93d5747511a4dad4923546c51365bf1a803774"."updatedAt" AS "bd93d5747511a4dad4923546c51365bf1a803774_updatedAt",
  "bd93d5747511a4dad4923546c51365bf1a803774"."deletedAt" AS "bd93d5747511a4dad4923546c51365bf1a803774_deletedAt",
  "bd93d5747511a4dad4923546c51365bf1a803774"."fileCreatedAt" AS "bd93d5747511a4dad4923546c51365bf1a803774_fileCreatedAt",
  "bd93d5747511a4dad4923546c51365bf1a803774"."localDateTime" AS "bd93d5747511a4dad4923546c51365bf1a803774_localDateTime",
  "bd93d5747511a4dad4923546c51365bf1a803774"."fileModifiedAt" AS "bd93d5747511a4dad4923546c51365bf1a803774_fileModifiedAt",
  "bd93d5747511a4dad4923546c51365bf1a803774"."isFavorite" AS "bd93d5747511a4dad4923546c51365bf1a803774_isFavorite",
  "bd93d5747511a4dad4923546c51365bf1a803774"."isArchived" AS "bd93d5747511a4dad4923546c51365bf1a803774_isArchived",
  "bd93d5747511a4dad4923546c51365bf1a803774"."isExternal" AS "bd93d5747511a4dad4923546c51365bf1a803774_isExternal",
  "bd93d5747511a4dad4923546c51365bf1a803774"."isOffline" AS "bd93d5747511a4dad4923546c51365bf1a803774_isOffline",
  "bd93d5747511a4dad4923546c51365bf1a803774"."checksum" AS "bd93d5747511a4dad4923546c51365bf1a803774_checksum",
  "bd93d5747511a4dad4923546c51365bf1a803774"."duration" AS "bd93d5747511a4dad4923546c51365bf1a803774_duration",
  "bd93d5747511a4dad4923546c51365bf1a803774"."isVisible" AS "bd93d5747511a4dad4923546c51365bf1a803774_isVisible",
  "bd93d5747511a4dad4923546c51365bf1a803774"."livePhotoVideoId" AS "bd93d5747511a4dad4923546c51365bf1a803774_livePhotoVideoId",
  "bd93d5747511a4dad4923546c51365bf1a803774"."originalFileName" AS "bd93d5747511a4dad4923546c51365bf1a803774_originalFileName",
  "bd93d5747511a4dad4923546c51365bf1a803774"."sidecarPath" AS "bd93d5747511a4dad4923546c51365bf1a803774_sidecarPath",
  "bd93d5747511a4dad4923546c51365bf1a803774"."stackId" AS "bd93d5747511a4dad4923546c51365bf1a803774_stackId",
  "bd93d5747511a4dad4923546c51365bf1a803774"."duplicateId" AS "bd93d5747511a4dad4923546c51365bf1a803774_duplicateId",
  "AssetEntity__AssetEntity_files"."id" AS "AssetEntity__AssetEntity_files_id",
  "AssetEntity__AssetEntity_files"."assetId" AS "AssetEntity__AssetEntity_files_assetId",
  "AssetEntity__AssetEntity_files"."createdAt" AS "AssetEntity__AssetEntity_files_createdAt",
  "AssetEntity__AssetEntity_files"."updatedAt" AS "AssetEntity__AssetEntity_files_updatedAt",
  "AssetEntity__AssetEntity_files"."type" AS "AssetEntity__AssetEntity_files_type",
  "AssetEntity__AssetEntity_files"."path" AS "AssetEntity__AssetEntity_files_path"
FROM
  "assets" "AssetEntity"
  LEFT JOIN "exif" "AssetEntity__AssetEntity_exifInfo" ON "AssetEntity__AssetEntity_exifInfo"."assetId" = "AssetEntity"."id"
  LEFT JOIN "smart_info" "AssetEntity__AssetEntity_smartInfo" ON "AssetEntity__AssetEntity_smartInfo"."assetId" = "AssetEntity"."id"
  LEFT JOIN "tag_asset" "AssetEntity_AssetEntity__AssetEntity_tags" ON "AssetEntity_AssetEntity__AssetEntity_tags"."assetsId" = "AssetEntity"."id"
  LEFT JOIN "tags" "AssetEntity__AssetEntity_tags" ON "AssetEntity__AssetEntity_tags"."id" = "AssetEntity_AssetEntity__AssetEntity_tags"."tagsId"
  LEFT JOIN "asset_faces" "AssetEntity__AssetEntity_faces" ON "AssetEntity__AssetEntity_faces"."assetId" = "AssetEntity"."id"
  LEFT JOIN "person" "8258e303a73a72cf6abb13d73fb592dde0d68280" ON "8258e303a73a72cf6abb13d73fb592dde0d68280"."id" = "AssetEntity__AssetEntity_faces"."personId"
  LEFT JOIN "asset_stack" "AssetEntity__AssetEntity_stack" ON "AssetEntity__AssetEntity_stack"."id" = "AssetEntity"."stackId"
  LEFT JOIN "assets" "bd93d5747511a4dad4923546c51365bf1a803774" ON "bd93d5747511a4dad4923546c51365bf1a803774"."stackId" = "AssetEntity__AssetEntity_stack"."id"
  LEFT JOIN "asset_files" "AssetEntity__AssetEntity_files" ON "AssetEntity__AssetEntity_files"."assetId" = "AssetEntity"."id"
WHERE
  (("AssetEntity"."id" IN ($1)))

-- AssetRepository.deleteAll
DELETE FROM "assets"
WHERE
  "ownerId" = $1

-- AssetRepository.getByLibraryIdAndOriginalPath
SELECT DISTINCT
  "distinctAlias"."AssetEntity_id" AS "ids_AssetEntity_id"
FROM
  (
    SELECT
      "AssetEntity"."id" AS "AssetEntity_id",
      "AssetEntity"."deviceAssetId" AS "AssetEntity_deviceAssetId",
      "AssetEntity"."ownerId" AS "AssetEntity_ownerId",
      "AssetEntity"."libraryId" AS "AssetEntity_libraryId",
      "AssetEntity"."deviceId" AS "AssetEntity_deviceId",
      "AssetEntity"."type" AS "AssetEntity_type",
      "AssetEntity"."status" AS "AssetEntity_status",
      "AssetEntity"."originalPath" AS "AssetEntity_originalPath",
      "AssetEntity"."thumbhash" AS "AssetEntity_thumbhash",
      "AssetEntity"."encodedVideoPath" AS "AssetEntity_encodedVideoPath",
      "AssetEntity"."createdAt" AS "AssetEntity_createdAt",
      "AssetEntity"."updatedAt" AS "AssetEntity_updatedAt",
      "AssetEntity"."deletedAt" AS "AssetEntity_deletedAt",
      "AssetEntity"."fileCreatedAt" AS "AssetEntity_fileCreatedAt",
      "AssetEntity"."localDateTime" AS "AssetEntity_localDateTime",
      "AssetEntity"."fileModifiedAt" AS "AssetEntity_fileModifiedAt",
      "AssetEntity"."isFavorite" AS "AssetEntity_isFavorite",
      "AssetEntity"."isArchived" AS "AssetEntity_isArchived",
      "AssetEntity"."isExternal" AS "AssetEntity_isExternal",
      "AssetEntity"."isOffline" AS "AssetEntity_isOffline",
      "AssetEntity"."checksum" AS "AssetEntity_checksum",
      "AssetEntity"."duration" AS "AssetEntity_duration",
      "AssetEntity"."isVisible" AS "AssetEntity_isVisible",
      "AssetEntity"."livePhotoVideoId" AS "AssetEntity_livePhotoVideoId",
      "AssetEntity"."originalFileName" AS "AssetEntity_originalFileName",
      "AssetEntity"."sidecarPath" AS "AssetEntity_sidecarPath",
      "AssetEntity"."stackId" AS "AssetEntity_stackId",
      "AssetEntity"."duplicateId" AS "AssetEntity_duplicateId"
    FROM
      "assets" "AssetEntity"
      LEFT JOIN "libraries" "AssetEntity__AssetEntity_library" ON "AssetEntity__AssetEntity_library"."id" = "AssetEntity"."libraryId"
    WHERE
      (
        ((("AssetEntity__AssetEntity_library"."id" = $1)))
        AND ("AssetEntity"."originalPath" = $2)
      )
  ) "distinctAlias"
ORDER BY
  "AssetEntity_id" ASC
LIMIT
  1

-- AssetRepository.getPathsNotInLibrary
WITH
  paths AS (
    SELECT
      unnest($2::text[]) AS path
  )
SELECT
  path
FROM
  paths
WHERE
  NOT EXISTS (
    SELECT
      1
    FROM
      assets
    WHERE
      "libraryId" = $1
      AND "originalPath" = path
  );

-- AssetRepository.getAllByDeviceId
SELECT
  "AssetEntity"."deviceAssetId" AS "AssetEntity_deviceAssetId",
  "AssetEntity"."id" AS "AssetEntity_id"
FROM
  "assets" "AssetEntity"
WHERE
  (
    ("AssetEntity"."ownerId" = $1)
    AND ("AssetEntity"."deviceId" = $2)
    AND ("AssetEntity"."isVisible" = $3)
  )

-- AssetRepository.getLivePhotoCount
SELECT
  COUNT(1) AS "cnt"
FROM
  "assets" "AssetEntity"
WHERE
  (("AssetEntity"."livePhotoVideoId" = $1))

-- AssetRepository.getById
SELECT
  "AssetEntity"."id" AS "AssetEntity_id",
  "AssetEntity"."deviceAssetId" AS "AssetEntity_deviceAssetId",
  "AssetEntity"."ownerId" AS "AssetEntity_ownerId",
  "AssetEntity"."libraryId" AS "AssetEntity_libraryId",
  "AssetEntity"."deviceId" AS "AssetEntity_deviceId",
  "AssetEntity"."type" AS "AssetEntity_type",
  "AssetEntity"."status" AS "AssetEntity_status",
  "AssetEntity"."originalPath" AS "AssetEntity_originalPath",
  "AssetEntity"."thumbhash" AS "AssetEntity_thumbhash",
  "AssetEntity"."encodedVideoPath" AS "AssetEntity_encodedVideoPath",
  "AssetEntity"."createdAt" AS "AssetEntity_createdAt",
  "AssetEntity"."updatedAt" AS "AssetEntity_updatedAt",
  "AssetEntity"."deletedAt" AS "AssetEntity_deletedAt",
  "AssetEntity"."fileCreatedAt" AS "AssetEntity_fileCreatedAt",
  "AssetEntity"."localDateTime" AS "AssetEntity_localDateTime",
  "AssetEntity"."fileModifiedAt" AS "AssetEntity_fileModifiedAt",
  "AssetEntity"."isFavorite" AS "AssetEntity_isFavorite",
  "AssetEntity"."isArchived" AS "AssetEntity_isArchived",
  "AssetEntity"."isExternal" AS "AssetEntity_isExternal",
  "AssetEntity"."isOffline" AS "AssetEntity_isOffline",
  "AssetEntity"."checksum" AS "AssetEntity_checksum",
  "AssetEntity"."duration" AS "AssetEntity_duration",
  "AssetEntity"."isVisible" AS "AssetEntity_isVisible",
  "AssetEntity"."livePhotoVideoId" AS "AssetEntity_livePhotoVideoId",
  "AssetEntity"."originalFileName" AS "AssetEntity_originalFileName",
  "AssetEntity"."sidecarPath" AS "AssetEntity_sidecarPath",
  "AssetEntity"."stackId" AS "AssetEntity_stackId",
  "AssetEntity"."duplicateId" AS "AssetEntity_duplicateId"
FROM
  "assets" "AssetEntity"
WHERE
  (("AssetEntity"."id" = $1))
LIMIT
  1

-- AssetRepository.updateAll
UPDATE "assets"
SET
  "deviceId" = $1,
  "updatedAt" = CURRENT_TIMESTAMP
WHERE
  "id" IN ($2)

-- AssetRepository.updateDuplicates
UPDATE "assets"
SET
  "duplicateId" = $1,
  "updatedAt" = CURRENT_TIMESTAMP
WHERE
  "duplicateId" IN ($2)
  OR "id" IN ($3)

-- AssetRepository.getByChecksum
SELECT
  "AssetEntity"."id" AS "AssetEntity_id",
  "AssetEntity"."deviceAssetId" AS "AssetEntity_deviceAssetId",
  "AssetEntity"."ownerId" AS "AssetEntity_ownerId",
  "AssetEntity"."libraryId" AS "AssetEntity_libraryId",
  "AssetEntity"."deviceId" AS "AssetEntity_deviceId",
  "AssetEntity"."type" AS "AssetEntity_type",
  "AssetEntity"."status" AS "AssetEntity_status",
  "AssetEntity"."originalPath" AS "AssetEntity_originalPath",
  "AssetEntity"."thumbhash" AS "AssetEntity_thumbhash",
  "AssetEntity"."encodedVideoPath" AS "AssetEntity_encodedVideoPath",
  "AssetEntity"."createdAt" AS "AssetEntity_createdAt",
  "AssetEntity"."updatedAt" AS "AssetEntity_updatedAt",
  "AssetEntity"."deletedAt" AS "AssetEntity_deletedAt",
  "AssetEntity"."fileCreatedAt" AS "AssetEntity_fileCreatedAt",
  "AssetEntity"."localDateTime" AS "AssetEntity_localDateTime",
  "AssetEntity"."fileModifiedAt" AS "AssetEntity_fileModifiedAt",
  "AssetEntity"."isFavorite" AS "AssetEntity_isFavorite",
  "AssetEntity"."isArchived" AS "AssetEntity_isArchived",
  "AssetEntity"."isExternal" AS "AssetEntity_isExternal",
  "AssetEntity"."isOffline" AS "AssetEntity_isOffline",
  "AssetEntity"."checksum" AS "AssetEntity_checksum",
  "AssetEntity"."duration" AS "AssetEntity_duration",
  "AssetEntity"."isVisible" AS "AssetEntity_isVisible",
  "AssetEntity"."livePhotoVideoId" AS "AssetEntity_livePhotoVideoId",
  "AssetEntity"."originalFileName" AS "AssetEntity_originalFileName",
  "AssetEntity"."sidecarPath" AS "AssetEntity_sidecarPath",
  "AssetEntity"."stackId" AS "AssetEntity_stackId",
  "AssetEntity"."duplicateId" AS "AssetEntity_duplicateId"
FROM
  "assets" "AssetEntity"
WHERE
  (
    (
      ("AssetEntity"."ownerId" = $1)
      AND ("AssetEntity"."libraryId" = $2)
      AND ("AssetEntity"."checksum" = $3)
    )
  )
  AND ("AssetEntity"."deletedAt" IS NULL)
LIMIT
  1

-- AssetRepository.getByChecksums
SELECT
  "AssetEntity"."id" AS "AssetEntity_id",
  "AssetEntity"."deletedAt" AS "AssetEntity_deletedAt",
  "AssetEntity"."checksum" AS "AssetEntity_checksum"
FROM
  "assets" "AssetEntity"
WHERE
  (
    ("AssetEntity"."ownerId" = $1)
    AND (
      "AssetEntity"."checksum" IN ($2, $3, $4, $5, $6, $7, $8, $9, $10)
    )
  )

-- AssetRepository.getUploadAssetIdByChecksum
SELECT
  "AssetEntity"."id" AS "AssetEntity_id"
FROM
  "assets" "AssetEntity"
WHERE
  (
    ("AssetEntity"."ownerId" = $1)
    AND ("AssetEntity"."checksum" = $2)
    AND ("AssetEntity"."libraryId" IS NULL)
  )
LIMIT
  1

-- AssetRepository.getWithout (sidecar)
SELECT
  "AssetEntity"."id" AS "AssetEntity_id",
  "AssetEntity"."deviceAssetId" AS "AssetEntity_deviceAssetId",
  "AssetEntity"."ownerId" AS "AssetEntity_ownerId",
  "AssetEntity"."libraryId" AS "AssetEntity_libraryId",
  "AssetEntity"."deviceId" AS "AssetEntity_deviceId",
  "AssetEntity"."type" AS "AssetEntity_type",
  "AssetEntity"."status" AS "AssetEntity_status",
  "AssetEntity"."originalPath" AS "AssetEntity_originalPath",
  "AssetEntity"."thumbhash" AS "AssetEntity_thumbhash",
  "AssetEntity"."encodedVideoPath" AS "AssetEntity_encodedVideoPath",
  "AssetEntity"."createdAt" AS "AssetEntity_createdAt",
  "AssetEntity"."updatedAt" AS "AssetEntity_updatedAt",
  "AssetEntity"."deletedAt" AS "AssetEntity_deletedAt",
  "AssetEntity"."fileCreatedAt" AS "AssetEntity_fileCreatedAt",
  "AssetEntity"."localDateTime" AS "AssetEntity_localDateTime",
  "AssetEntity"."fileModifiedAt" AS "AssetEntity_fileModifiedAt",
  "AssetEntity"."isFavorite" AS "AssetEntity_isFavorite",
  "AssetEntity"."isArchived" AS "AssetEntity_isArchived",
  "AssetEntity"."isExternal" AS "AssetEntity_isExternal",
  "AssetEntity"."isOffline" AS "AssetEntity_isOffline",
  "AssetEntity"."checksum" AS "AssetEntity_checksum",
  "AssetEntity"."duration" AS "AssetEntity_duration",
  "AssetEntity"."isVisible" AS "AssetEntity_isVisible",
  "AssetEntity"."livePhotoVideoId" AS "AssetEntity_livePhotoVideoId",
  "AssetEntity"."originalFileName" AS "AssetEntity_originalFileName",
  "AssetEntity"."sidecarPath" AS "AssetEntity_sidecarPath",
  "AssetEntity"."stackId" AS "AssetEntity_stackId",
  "AssetEntity"."duplicateId" AS "AssetEntity_duplicateId"
FROM
  "assets" "AssetEntity"
WHERE
  (
    (
      (
        (
          ("AssetEntity"."sidecarPath" IS NULL)
          AND ("AssetEntity"."isVisible" = $1)
        )
      )
      OR (
        (
          ("AssetEntity"."sidecarPath" = $2)
          AND ("AssetEntity"."isVisible" = $3)
        )
      )
    )
  )
  AND ("AssetEntity"."deletedAt" IS NULL)
ORDER BY
  "AssetEntity"."createdAt" ASC
LIMIT
  11

-- AssetRepository.getRandom
SELECT
  "asset"."id" AS "asset_id",
  "asset"."deviceAssetId" AS "asset_deviceAssetId",
  "asset"."ownerId" AS "asset_ownerId",
  "asset"."libraryId" AS "asset_libraryId",
  "asset"."deviceId" AS "asset_deviceId",
  "asset"."type" AS "asset_type",
  "asset"."status" AS "asset_status",
  "asset"."originalPath" AS "asset_originalPath",
  "asset"."thumbhash" AS "asset_thumbhash",
  "asset"."encodedVideoPath" AS "asset_encodedVideoPath",
  "asset"."createdAt" AS "asset_createdAt",
  "asset"."updatedAt" AS "asset_updatedAt",
  "asset"."deletedAt" AS "asset_deletedAt",
  "asset"."fileCreatedAt" AS "asset_fileCreatedAt",
  "asset"."localDateTime" AS "asset_localDateTime",
  "asset"."fileModifiedAt" AS "asset_fileModifiedAt",
  "asset"."isFavorite" AS "asset_isFavorite",
  "asset"."isArchived" AS "asset_isArchived",
  "asset"."isExternal" AS "asset_isExternal",
  "asset"."isOffline" AS "asset_isOffline",
  "asset"."checksum" AS "asset_checksum",
  "asset"."duration" AS "asset_duration",
  "asset"."isVisible" AS "asset_isVisible",
  "asset"."livePhotoVideoId" AS "asset_livePhotoVideoId",
  "asset"."originalFileName" AS "asset_originalFileName",
  "asset"."sidecarPath" AS "asset_sidecarPath",
  "asset"."stackId" AS "asset_stackId",
  "asset"."duplicateId" AS "asset_duplicateId",
  "exifInfo"."assetId" AS "exifInfo_assetId",
  "exifInfo"."description" AS "exifInfo_description",
  "exifInfo"."exifImageWidth" AS "exifInfo_exifImageWidth",
  "exifInfo"."exifImageHeight" AS "exifInfo_exifImageHeight",
  "exifInfo"."fileSizeInByte" AS "exifInfo_fileSizeInByte",
  "exifInfo"."orientation" AS "exifInfo_orientation",
  "exifInfo"."dateTimeOriginal" AS "exifInfo_dateTimeOriginal",
  "exifInfo"."modifyDate" AS "exifInfo_modifyDate",
  "exifInfo"."timeZone" AS "exifInfo_timeZone",
  "exifInfo"."latitude" AS "exifInfo_latitude",
  "exifInfo"."longitude" AS "exifInfo_longitude",
  "exifInfo"."projectionType" AS "exifInfo_projectionType",
  "exifInfo"."city" AS "exifInfo_city",
  "exifInfo"."livePhotoCID" AS "exifInfo_livePhotoCID",
  "exifInfo"."autoStackId" AS "exifInfo_autoStackId",
  "exifInfo"."state" AS "exifInfo_state",
  "exifInfo"."country" AS "exifInfo_country",
  "exifInfo"."make" AS "exifInfo_make",
  "exifInfo"."model" AS "exifInfo_model",
  "exifInfo"."lensModel" AS "exifInfo_lensModel",
  "exifInfo"."fNumber" AS "exifInfo_fNumber",
  "exifInfo"."focalLength" AS "exifInfo_focalLength",
  "exifInfo"."iso" AS "exifInfo_iso",
  "exifInfo"."exposureTime" AS "exifInfo_exposureTime",
  "exifInfo"."profileDescription" AS "exifInfo_profileDescription",
  "exifInfo"."colorspace" AS "exifInfo_colorspace",
  "exifInfo"."bitsPerSample" AS "exifInfo_bitsPerSample",
  "exifInfo"."rating" AS "exifInfo_rating",
  "exifInfo"."fps" AS "exifInfo_fps",
  "stack"."id" AS "stack_id",
  "stack"."ownerId" AS "stack_ownerId",
  "stack"."primaryAssetId" AS "stack_primaryAssetId",
  "stackedAssets"."id" AS "stackedAssets_id",
  "stackedAssets"."deviceAssetId" AS "stackedAssets_deviceAssetId",
  "stackedAssets"."ownerId" AS "stackedAssets_ownerId",
  "stackedAssets"."libraryId" AS "stackedAssets_libraryId",
  "stackedAssets"."deviceId" AS "stackedAssets_deviceId",
  "stackedAssets"."type" AS "stackedAssets_type",
  "stackedAssets"."status" AS "stackedAssets_status",
  "stackedAssets"."originalPath" AS "stackedAssets_originalPath",
  "stackedAssets"."thumbhash" AS "stackedAssets_thumbhash",
  "stackedAssets"."encodedVideoPath" AS "stackedAssets_encodedVideoPath",
  "stackedAssets"."createdAt" AS "stackedAssets_createdAt",
  "stackedAssets"."updatedAt" AS "stackedAssets_updatedAt",
  "stackedAssets"."deletedAt" AS "stackedAssets_deletedAt",
  "stackedAssets"."fileCreatedAt" AS "stackedAssets_fileCreatedAt",
  "stackedAssets"."localDateTime" AS "stackedAssets_localDateTime",
  "stackedAssets"."fileModifiedAt" AS "stackedAssets_fileModifiedAt",
  "stackedAssets"."isFavorite" AS "stackedAssets_isFavorite",
  "stackedAssets"."isArchived" AS "stackedAssets_isArchived",
  "stackedAssets"."isExternal" AS "stackedAssets_isExternal",
  "stackedAssets"."isOffline" AS "stackedAssets_isOffline",
  "stackedAssets"."checksum" AS "stackedAssets_checksum",
  "stackedAssets"."duration" AS "stackedAssets_duration",
  "stackedAssets"."isVisible" AS "stackedAssets_isVisible",
  "stackedAssets"."livePhotoVideoId" AS "stackedAssets_livePhotoVideoId",
  "stackedAssets"."originalFileName" AS "stackedAssets_originalFileName",
  "stackedAssets"."sidecarPath" AS "stackedAssets_sidecarPath",
  "stackedAssets"."stackId" AS "stackedAssets_stackId",
  "stackedAssets"."duplicateId" AS "stackedAssets_duplicateId"
FROM
  "assets" "asset"
  LEFT JOIN "exif" "exifInfo" ON "exifInfo"."assetId" = "asset"."id"
  LEFT JOIN "asset_stack" "stack" ON "stack"."id" = "asset"."stackId"
  LEFT JOIN "assets" "stackedAssets" ON "stackedAssets"."stackId" = "stack"."id"
  AND ("stackedAssets"."deletedAt" IS NULL)
WHERE
  (
    "asset"."isVisible" = true
    AND "asset"."ownerId" IN ($1)
  )
  AND ("asset"."deletedAt" IS NULL)
ORDER BY
  RANDOM() ASC
LIMIT
  50

-- AssetRepository.getTimeBuckets
SELECT
  COUNT("asset"."id")::int AS "count",
  (
    date_trunc(
      'month',
      (asset."localDateTime" at time zone 'UTC')
    ) at time zone 'UTC'
  )::timestamptz AS "timeBucket"
FROM
  "assets" "asset"
  LEFT JOIN "exif" "exifInfo" ON "exifInfo"."assetId" = "asset"."id"
  LEFT JOIN "asset_stack" "stack" ON "stack"."id" = "asset"."stackId"
  LEFT JOIN "assets" "stackedAssets" ON "stackedAssets"."stackId" = "stack"."id"
  AND ("stackedAssets"."deletedAt" IS NULL)
WHERE
  ("asset"."isVisible" = true)
  AND ("asset"."deletedAt" IS NULL)
GROUP BY
  (
    date_trunc(
      'month',
      (asset."localDateTime" at time zone 'UTC')
    ) at time zone 'UTC'
  )::timestamptz
ORDER BY
  (
    date_trunc(
      'month',
      (asset."localDateTime" at time zone 'UTC')
    ) at time zone 'UTC'
  )::timestamptz DESC

-- AssetRepository.getTimeBucket
SELECT
  "asset"."id" AS "asset_id",
  "asset"."deviceAssetId" AS "asset_deviceAssetId",
  "asset"."ownerId" AS "asset_ownerId",
  "asset"."libraryId" AS "asset_libraryId",
  "asset"."deviceId" AS "asset_deviceId",
  "asset"."type" AS "asset_type",
  "asset"."status" AS "asset_status",
  "asset"."originalPath" AS "asset_originalPath",
  "asset"."thumbhash" AS "asset_thumbhash",
  "asset"."encodedVideoPath" AS "asset_encodedVideoPath",
  "asset"."createdAt" AS "asset_createdAt",
  "asset"."updatedAt" AS "asset_updatedAt",
  "asset"."deletedAt" AS "asset_deletedAt",
  "asset"."fileCreatedAt" AS "asset_fileCreatedAt",
  "asset"."localDateTime" AS "asset_localDateTime",
  "asset"."fileModifiedAt" AS "asset_fileModifiedAt",
  "asset"."isFavorite" AS "asset_isFavorite",
  "asset"."isArchived" AS "asset_isArchived",
  "asset"."isExternal" AS "asset_isExternal",
  "asset"."isOffline" AS "asset_isOffline",
  "asset"."checksum" AS "asset_checksum",
  "asset"."duration" AS "asset_duration",
  "asset"."isVisible" AS "asset_isVisible",
  "asset"."livePhotoVideoId" AS "asset_livePhotoVideoId",
  "asset"."originalFileName" AS "asset_originalFileName",
  "asset"."sidecarPath" AS "asset_sidecarPath",
  "asset"."stackId" AS "asset_stackId",
  "asset"."duplicateId" AS "asset_duplicateId",
  "exifInfo"."assetId" AS "exifInfo_assetId",
  "exifInfo"."description" AS "exifInfo_description",
  "exifInfo"."exifImageWidth" AS "exifInfo_exifImageWidth",
  "exifInfo"."exifImageHeight" AS "exifInfo_exifImageHeight",
  "exifInfo"."fileSizeInByte" AS "exifInfo_fileSizeInByte",
  "exifInfo"."orientation" AS "exifInfo_orientation",
  "exifInfo"."dateTimeOriginal" AS "exifInfo_dateTimeOriginal",
  "exifInfo"."modifyDate" AS "exifInfo_modifyDate",
  "exifInfo"."timeZone" AS "exifInfo_timeZone",
  "exifInfo"."latitude" AS "exifInfo_latitude",
  "exifInfo"."longitude" AS "exifInfo_longitude",
  "exifInfo"."projectionType" AS "exifInfo_projectionType",
  "exifInfo"."city" AS "exifInfo_city",
  "exifInfo"."livePhotoCID" AS "exifInfo_livePhotoCID",
  "exifInfo"."autoStackId" AS "exifInfo_autoStackId",
  "exifInfo"."state" AS "exifInfo_state",
  "exifInfo"."country" AS "exifInfo_country",
  "exifInfo"."make" AS "exifInfo_make",
  "exifInfo"."model" AS "exifInfo_model",
  "exifInfo"."lensModel" AS "exifInfo_lensModel",
  "exifInfo"."fNumber" AS "exifInfo_fNumber",
  "exifInfo"."focalLength" AS "exifInfo_focalLength",
  "exifInfo"."iso" AS "exifInfo_iso",
  "exifInfo"."exposureTime" AS "exifInfo_exposureTime",
  "exifInfo"."profileDescription" AS "exifInfo_profileDescription",
  "exifInfo"."colorspace" AS "exifInfo_colorspace",
  "exifInfo"."bitsPerSample" AS "exifInfo_bitsPerSample",
  "exifInfo"."rating" AS "exifInfo_rating",
  "exifInfo"."fps" AS "exifInfo_fps",
  "stack"."id" AS "stack_id",
  "stack"."ownerId" AS "stack_ownerId",
  "stack"."primaryAssetId" AS "stack_primaryAssetId",
  "stackedAssets"."id" AS "stackedAssets_id",
  "stackedAssets"."deviceAssetId" AS "stackedAssets_deviceAssetId",
  "stackedAssets"."ownerId" AS "stackedAssets_ownerId",
  "stackedAssets"."libraryId" AS "stackedAssets_libraryId",
  "stackedAssets"."deviceId" AS "stackedAssets_deviceId",
  "stackedAssets"."type" AS "stackedAssets_type",
  "stackedAssets"."status" AS "stackedAssets_status",
  "stackedAssets"."originalPath" AS "stackedAssets_originalPath",
  "stackedAssets"."thumbhash" AS "stackedAssets_thumbhash",
  "stackedAssets"."encodedVideoPath" AS "stackedAssets_encodedVideoPath",
  "stackedAssets"."createdAt" AS "stackedAssets_createdAt",
  "stackedAssets"."updatedAt" AS "stackedAssets_updatedAt",
  "stackedAssets"."deletedAt" AS "stackedAssets_deletedAt",
  "stackedAssets"."fileCreatedAt" AS "stackedAssets_fileCreatedAt",
  "stackedAssets"."localDateTime" AS "stackedAssets_localDateTime",
  "stackedAssets"."fileModifiedAt" AS "stackedAssets_fileModifiedAt",
  "stackedAssets"."isFavorite" AS "stackedAssets_isFavorite",
  "stackedAssets"."isArchived" AS "stackedAssets_isArchived",
  "stackedAssets"."isExternal" AS "stackedAssets_isExternal",
  "stackedAssets"."isOffline" AS "stackedAssets_isOffline",
  "stackedAssets"."checksum" AS "stackedAssets_checksum",
  "stackedAssets"."duration" AS "stackedAssets_duration",
  "stackedAssets"."isVisible" AS "stackedAssets_isVisible",
  "stackedAssets"."livePhotoVideoId" AS "stackedAssets_livePhotoVideoId",
  "stackedAssets"."originalFileName" AS "stackedAssets_originalFileName",
  "stackedAssets"."sidecarPath" AS "stackedAssets_sidecarPath",
  "stackedAssets"."stackId" AS "stackedAssets_stackId",
  "stackedAssets"."duplicateId" AS "stackedAssets_duplicateId"
FROM
  "assets" "asset"
  LEFT JOIN "exif" "exifInfo" ON "exifInfo"."assetId" = "asset"."id"
  LEFT JOIN "asset_stack" "stack" ON "stack"."id" = "asset"."stackId"
  LEFT JOIN "assets" "stackedAssets" ON "stackedAssets"."stackId" = "stack"."id"
  AND ("stackedAssets"."deletedAt" IS NULL)
WHERE
  (
    "asset"."isVisible" = true
    AND (
      date_trunc(
        'month',
        (asset."localDateTime" at time zone 'UTC')
      ) at time zone 'UTC'
    )::timestamptz = $1
  )
  AND ("asset"."deletedAt" IS NULL)
ORDER BY
  (
    date_trunc(
      'month',
      (asset."localDateTime" at time zone 'UTC')
    ) at time zone 'UTC'
  )::timestamptz DESC,
  "asset"."fileCreatedAt" DESC

-- AssetRepository.getDuplicates
SELECT
  "asset"."id" AS "asset_id",
  "asset"."deviceAssetId" AS "asset_deviceAssetId",
  "asset"."ownerId" AS "asset_ownerId",
  "asset"."libraryId" AS "asset_libraryId",
  "asset"."deviceId" AS "asset_deviceId",
  "asset"."type" AS "asset_type",
  "asset"."status" AS "asset_status",
  "asset"."originalPath" AS "asset_originalPath",
  "asset"."thumbhash" AS "asset_thumbhash",
  "asset"."encodedVideoPath" AS "asset_encodedVideoPath",
  "asset"."createdAt" AS "asset_createdAt",
  "asset"."updatedAt" AS "asset_updatedAt",
  "asset"."deletedAt" AS "asset_deletedAt",
  "asset"."fileCreatedAt" AS "asset_fileCreatedAt",
  "asset"."localDateTime" AS "asset_localDateTime",
  "asset"."fileModifiedAt" AS "asset_fileModifiedAt",
  "asset"."isFavorite" AS "asset_isFavorite",
  "asset"."isArchived" AS "asset_isArchived",
  "asset"."isExternal" AS "asset_isExternal",
  "asset"."isOffline" AS "asset_isOffline",
  "asset"."checksum" AS "asset_checksum",
  "asset"."duration" AS "asset_duration",
  "asset"."isVisible" AS "asset_isVisible",
  "asset"."livePhotoVideoId" AS "asset_livePhotoVideoId",
  "asset"."originalFileName" AS "asset_originalFileName",
  "asset"."sidecarPath" AS "asset_sidecarPath",
  "asset"."stackId" AS "asset_stackId",
  "asset"."duplicateId" AS "asset_duplicateId",
  "exifInfo"."assetId" AS "exifInfo_assetId",
  "exifInfo"."description" AS "exifInfo_description",
  "exifInfo"."exifImageWidth" AS "exifInfo_exifImageWidth",
  "exifInfo"."exifImageHeight" AS "exifInfo_exifImageHeight",
  "exifInfo"."fileSizeInByte" AS "exifInfo_fileSizeInByte",
  "exifInfo"."orientation" AS "exifInfo_orientation",
  "exifInfo"."dateTimeOriginal" AS "exifInfo_dateTimeOriginal",
  "exifInfo"."modifyDate" AS "exifInfo_modifyDate",
  "exifInfo"."timeZone" AS "exifInfo_timeZone",
  "exifInfo"."latitude" AS "exifInfo_latitude",
  "exifInfo"."longitude" AS "exifInfo_longitude",
  "exifInfo"."projectionType" AS "exifInfo_projectionType",
  "exifInfo"."city" AS "exifInfo_city",
  "exifInfo"."livePhotoCID" AS "exifInfo_livePhotoCID",
  "exifInfo"."autoStackId" AS "exifInfo_autoStackId",
  "exifInfo"."state" AS "exifInfo_state",
  "exifInfo"."country" AS "exifInfo_country",
  "exifInfo"."make" AS "exifInfo_make",
  "exifInfo"."model" AS "exifInfo_model",
  "exifInfo"."lensModel" AS "exifInfo_lensModel",
  "exifInfo"."fNumber" AS "exifInfo_fNumber",
  "exifInfo"."focalLength" AS "exifInfo_focalLength",
  "exifInfo"."iso" AS "exifInfo_iso",
  "exifInfo"."exposureTime" AS "exifInfo_exposureTime",
  "exifInfo"."profileDescription" AS "exifInfo_profileDescription",
  "exifInfo"."colorspace" AS "exifInfo_colorspace",
  "exifInfo"."bitsPerSample" AS "exifInfo_bitsPerSample",
  "exifInfo"."rating" AS "exifInfo_rating",
  "exifInfo"."fps" AS "exifInfo_fps",
  "stack"."id" AS "stack_id",
  "stack"."ownerId" AS "stack_ownerId",
  "stack"."primaryAssetId" AS "stack_primaryAssetId",
  "stackedAssets"."id" AS "stackedAssets_id",
  "stackedAssets"."deviceAssetId" AS "stackedAssets_deviceAssetId",
  "stackedAssets"."ownerId" AS "stackedAssets_ownerId",
  "stackedAssets"."libraryId" AS "stackedAssets_libraryId",
  "stackedAssets"."deviceId" AS "stackedAssets_deviceId",
  "stackedAssets"."type" AS "stackedAssets_type",
  "stackedAssets"."status" AS "stackedAssets_status",
  "stackedAssets"."originalPath" AS "stackedAssets_originalPath",
  "stackedAssets"."thumbhash" AS "stackedAssets_thumbhash",
  "stackedAssets"."encodedVideoPath" AS "stackedAssets_encodedVideoPath",
  "stackedAssets"."createdAt" AS "stackedAssets_createdAt",
  "stackedAssets"."updatedAt" AS "stackedAssets_updatedAt",
  "stackedAssets"."deletedAt" AS "stackedAssets_deletedAt",
  "stackedAssets"."fileCreatedAt" AS "stackedAssets_fileCreatedAt",
  "stackedAssets"."localDateTime" AS "stackedAssets_localDateTime",
  "stackedAssets"."fileModifiedAt" AS "stackedAssets_fileModifiedAt",
  "stackedAssets"."isFavorite" AS "stackedAssets_isFavorite",
  "stackedAssets"."isArchived" AS "stackedAssets_isArchived",
  "stackedAssets"."isExternal" AS "stackedAssets_isExternal",
  "stackedAssets"."isOffline" AS "stackedAssets_isOffline",
  "stackedAssets"."checksum" AS "stackedAssets_checksum",
  "stackedAssets"."duration" AS "stackedAssets_duration",
  "stackedAssets"."isVisible" AS "stackedAssets_isVisible",
  "stackedAssets"."livePhotoVideoId" AS "stackedAssets_livePhotoVideoId",
  "stackedAssets"."originalFileName" AS "stackedAssets_originalFileName",
  "stackedAssets"."sidecarPath" AS "stackedAssets_sidecarPath",
  "stackedAssets"."stackId" AS "stackedAssets_stackId",
  "stackedAssets"."duplicateId" AS "stackedAssets_duplicateId"
FROM
  "assets" "asset"
  LEFT JOIN "exif" "exifInfo" ON "exifInfo"."assetId" = "asset"."id"
  LEFT JOIN "asset_stack" "stack" ON "stack"."id" = "asset"."stackId"
  LEFT JOIN "assets" "stackedAssets" ON "stackedAssets"."stackId" = "stack"."id"
  AND ("stackedAssets"."deletedAt" IS NULL)
WHERE
  (
    "asset"."isVisible" = true
    AND "asset"."ownerId" IN ($1, $2)
    AND "asset"."duplicateId" IS NOT NULL
  )
  AND ("asset"."deletedAt" IS NULL)
ORDER BY
  "asset"."duplicateId" ASC

-- AssetRepository.getAssetIdByCity
WITH
  "cities" AS (
    SELECT
      city
    FROM
      "exif" "e"
    GROUP BY
      city
    HAVING
      count(city) >= $1
  )
SELECT DISTINCT
  ON (c.city) "asset"."id" AS "data",
  c.city AS "value"
FROM
  "assets" "asset"
  INNER JOIN "exif" "e" ON "asset"."id" = e."assetId"
  INNER JOIN "cities" "c" ON c.city = "e"."city"
WHERE
  (
    "asset"."isVisible" = true
    AND "asset"."type" = $2
    AND "asset"."ownerId" IN ($3)
    AND "asset"."isArchived" = $4
  )
  AND ("asset"."deletedAt" IS NULL)
LIMIT
  12

-- AssetRepository.getAssetIdByTag
WITH
  "random_tags" AS (
    SELECT
      unnest(tags) AS "tag"
    FROM
      "smart_info" "si"
    GROUP BY
      tag
    HAVING
      count(*) >= $1
  )
SELECT DISTINCT
  ON (unnest("si"."tags")) "asset"."id" AS "data",
  unnest("si"."tags") AS "value"
FROM
  "assets" "asset"
  INNER JOIN "smart_info" "si" ON "asset"."id" = si."assetId"
  INNER JOIN "random_tags" "t" ON "si"."tags" @> ARRAY[t.tag]
WHERE
  (
    "asset"."isVisible" = true
    AND "asset"."type" = $2
    AND "asset"."ownerId" IN ($3)
    AND "asset"."isArchived" = $4
  )
  AND ("asset"."deletedAt" IS NULL)
LIMIT
  12

-- AssetRepository.getAllForUserFullSync
SELECT
  "asset"."id" AS "asset_id",
  "asset"."deviceAssetId" AS "asset_deviceAssetId",
  "asset"."ownerId" AS "asset_ownerId",
  "asset"."libraryId" AS "asset_libraryId",
  "asset"."deviceId" AS "asset_deviceId",
  "asset"."type" AS "asset_type",
  "asset"."status" AS "asset_status",
  "asset"."originalPath" AS "asset_originalPath",
  "asset"."thumbhash" AS "asset_thumbhash",
  "asset"."encodedVideoPath" AS "asset_encodedVideoPath",
  "asset"."createdAt" AS "asset_createdAt",
  "asset"."updatedAt" AS "asset_updatedAt",
  "asset"."deletedAt" AS "asset_deletedAt",
  "asset"."fileCreatedAt" AS "asset_fileCreatedAt",
  "asset"."localDateTime" AS "asset_localDateTime",
  "asset"."fileModifiedAt" AS "asset_fileModifiedAt",
  "asset"."isFavorite" AS "asset_isFavorite",
  "asset"."isArchived" AS "asset_isArchived",
  "asset"."isExternal" AS "asset_isExternal",
  "asset"."isOffline" AS "asset_isOffline",
  "asset"."checksum" AS "asset_checksum",
  "asset"."duration" AS "asset_duration",
  "asset"."isVisible" AS "asset_isVisible",
  "asset"."livePhotoVideoId" AS "asset_livePhotoVideoId",
  "asset"."originalFileName" AS "asset_originalFileName",
  "asset"."sidecarPath" AS "asset_sidecarPath",
  "asset"."stackId" AS "asset_stackId",
  "asset"."duplicateId" AS "asset_duplicateId",
  "exifInfo"."assetId" AS "exifInfo_assetId",
  "exifInfo"."description" AS "exifInfo_description",
  "exifInfo"."exifImageWidth" AS "exifInfo_exifImageWidth",
  "exifInfo"."exifImageHeight" AS "exifInfo_exifImageHeight",
  "exifInfo"."fileSizeInByte" AS "exifInfo_fileSizeInByte",
  "exifInfo"."orientation" AS "exifInfo_orientation",
  "exifInfo"."dateTimeOriginal" AS "exifInfo_dateTimeOriginal",
  "exifInfo"."modifyDate" AS "exifInfo_modifyDate",
  "exifInfo"."timeZone" AS "exifInfo_timeZone",
  "exifInfo"."latitude" AS "exifInfo_latitude",
  "exifInfo"."longitude" AS "exifInfo_longitude",
  "exifInfo"."projectionType" AS "exifInfo_projectionType",
  "exifInfo"."city" AS "exifInfo_city",
  "exifInfo"."livePhotoCID" AS "exifInfo_livePhotoCID",
  "exifInfo"."autoStackId" AS "exifInfo_autoStackId",
  "exifInfo"."state" AS "exifInfo_state",
  "exifInfo"."country" AS "exifInfo_country",
  "exifInfo"."make" AS "exifInfo_make",
  "exifInfo"."model" AS "exifInfo_model",
  "exifInfo"."lensModel" AS "exifInfo_lensModel",
  "exifInfo"."fNumber" AS "exifInfo_fNumber",
  "exifInfo"."focalLength" AS "exifInfo_focalLength",
  "exifInfo"."iso" AS "exifInfo_iso",
  "exifInfo"."exposureTime" AS "exifInfo_exposureTime",
  "exifInfo"."profileDescription" AS "exifInfo_profileDescription",
  "exifInfo"."colorspace" AS "exifInfo_colorspace",
  "exifInfo"."bitsPerSample" AS "exifInfo_bitsPerSample",
  "exifInfo"."rating" AS "exifInfo_rating",
  "exifInfo"."fps" AS "exifInfo_fps",
  "stack"."id" AS "stack_id",
  "stack"."ownerId" AS "stack_ownerId",
  "stack"."primaryAssetId" AS "stack_primaryAssetId"
FROM
  "assets" "asset"
  LEFT JOIN "exif" "exifInfo" ON "exifInfo"."assetId" = "asset"."id"
  LEFT JOIN "asset_stack" "stack" ON "stack"."id" = "asset"."stackId"
WHERE
  "asset"."isVisible" = true
  AND "asset"."ownerId" IN ($1)
  AND "asset"."id" > $2
  AND "asset"."updatedAt" <= $3
ORDER BY
  "asset"."id" ASC
LIMIT
  10

-- AssetRepository.getChangedDeltaSync
SELECT
  "asset"."id" AS "asset_id",
  "asset"."deviceAssetId" AS "asset_deviceAssetId",
  "asset"."ownerId" AS "asset_ownerId",
  "asset"."libraryId" AS "asset_libraryId",
  "asset"."deviceId" AS "asset_deviceId",
  "asset"."type" AS "asset_type",
  "asset"."status" AS "asset_status",
  "asset"."originalPath" AS "asset_originalPath",
  "asset"."thumbhash" AS "asset_thumbhash",
  "asset"."encodedVideoPath" AS "asset_encodedVideoPath",
  "asset"."createdAt" AS "asset_createdAt",
  "asset"."updatedAt" AS "asset_updatedAt",
  "asset"."deletedAt" AS "asset_deletedAt",
  "asset"."fileCreatedAt" AS "asset_fileCreatedAt",
  "asset"."localDateTime" AS "asset_localDateTime",
  "asset"."fileModifiedAt" AS "asset_fileModifiedAt",
  "asset"."isFavorite" AS "asset_isFavorite",
  "asset"."isArchived" AS "asset_isArchived",
  "asset"."isExternal" AS "asset_isExternal",
  "asset"."isOffline" AS "asset_isOffline",
  "asset"."checksum" AS "asset_checksum",
  "asset"."duration" AS "asset_duration",
  "asset"."isVisible" AS "asset_isVisible",
  "asset"."livePhotoVideoId" AS "asset_livePhotoVideoId",
  "asset"."originalFileName" AS "asset_originalFileName",
  "asset"."sidecarPath" AS "asset_sidecarPath",
  "asset"."stackId" AS "asset_stackId",
  "asset"."duplicateId" AS "asset_duplicateId",
  "exifInfo"."assetId" AS "exifInfo_assetId",
  "exifInfo"."description" AS "exifInfo_description",
  "exifInfo"."exifImageWidth" AS "exifInfo_exifImageWidth",
  "exifInfo"."exifImageHeight" AS "exifInfo_exifImageHeight",
  "exifInfo"."fileSizeInByte" AS "exifInfo_fileSizeInByte",
  "exifInfo"."orientation" AS "exifInfo_orientation",
  "exifInfo"."dateTimeOriginal" AS "exifInfo_dateTimeOriginal",
  "exifInfo"."modifyDate" AS "exifInfo_modifyDate",
  "exifInfo"."timeZone" AS "exifInfo_timeZone",
  "exifInfo"."latitude" AS "exifInfo_latitude",
  "exifInfo"."longitude" AS "exifInfo_longitude",
  "exifInfo"."projectionType" AS "exifInfo_projectionType",
  "exifInfo"."city" AS "exifInfo_city",
  "exifInfo"."livePhotoCID" AS "exifInfo_livePhotoCID",
  "exifInfo"."autoStackId" AS "exifInfo_autoStackId",
  "exifInfo"."state" AS "exifInfo_state",
  "exifInfo"."country" AS "exifInfo_country",
  "exifInfo"."make" AS "exifInfo_make",
  "exifInfo"."model" AS "exifInfo_model",
  "exifInfo"."lensModel" AS "exifInfo_lensModel",
  "exifInfo"."fNumber" AS "exifInfo_fNumber",
  "exifInfo"."focalLength" AS "exifInfo_focalLength",
  "exifInfo"."iso" AS "exifInfo_iso",
  "exifInfo"."exposureTime" AS "exifInfo_exposureTime",
  "exifInfo"."profileDescription" AS "exifInfo_profileDescription",
  "exifInfo"."colorspace" AS "exifInfo_colorspace",
  "exifInfo"."bitsPerSample" AS "exifInfo_bitsPerSample",
  "exifInfo"."rating" AS "exifInfo_rating",
  "exifInfo"."fps" AS "exifInfo_fps",
  "stack"."id" AS "stack_id",
  "stack"."ownerId" AS "stack_ownerId",
  "stack"."primaryAssetId" AS "stack_primaryAssetId"
FROM
  "assets" "asset"
  LEFT JOIN "exif" "exifInfo" ON "exifInfo"."assetId" = "asset"."id"
  LEFT JOIN "asset_stack" "stack" ON "stack"."id" = "asset"."stackId"
WHERE
  "asset"."isVisible" = true
  AND "asset"."ownerId" IN ($1)
  AND "asset"."updatedAt" > $2

-- AssetRepository.upsertFile
INSERT INTO
  "asset_files" (
    "id",
    "assetId",
    "createdAt",
    "updatedAt",
    "type",
    "path"
  )
VALUES
  (DEFAULT, $1, DEFAULT, DEFAULT, $2, $3)
ON CONFLICT ("assetId", "type") DO
UPDATE
SET
  "assetId" = EXCLUDED."assetId",
  "type" = EXCLUDED."type",
  "path" = EXCLUDED."path",
  "updatedAt" = DEFAULT
RETURNING
  "id",
  "createdAt",
  "updatedAt"

-- AssetRepository.upsertFiles
INSERT INTO
  "asset_files" (
    "id",
    "assetId",
    "createdAt",
    "updatedAt",
    "type",
    "path"
  )
VALUES
  (DEFAULT, $1, DEFAULT, DEFAULT, $2, $3)
ON CONFLICT ("assetId", "type") DO
UPDATE
SET
  "assetId" = EXCLUDED."assetId",
  "type" = EXCLUDED."type",
  "path" = EXCLUDED."path",
  "updatedAt" = DEFAULT
RETURNING
  "id",
  "createdAt",
  "updatedAt"
