diff --git a/api/.sqlx/query-ef0155c2926ea69baf0738c6317064adee44c3627443478d3a94a45b1748db25.json b/api/.sqlx/query-30b9ed6f2599f58359be85dbe805dc017cd8a8fae02189ee046485b66bc69f19.json similarity index 69% rename from api/.sqlx/query-ef0155c2926ea69baf0738c6317064adee44c3627443478d3a94a45b1748db25.json rename to api/.sqlx/query-30b9ed6f2599f58359be85dbe805dc017cd8a8fae02189ee046485b66bc69f19.json index 8a3f0cab6..b04f503ee 100644 --- a/api/.sqlx/query-ef0155c2926ea69baf0738c6317064adee44c3627443478d3a94a45b1748db25.json +++ b/api/.sqlx/query-30b9ed6f2599f58359be85dbe805dc017cd8a8fae02189ee046485b66bc69f19.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT packages.scope \"package_scope: ScopeName\", packages.name \"package_name: PackageName\", packages.description \"package_description\", packages.github_repository_id \"package_github_repository_id\", packages.runtime_compat as \"package_runtime_compat: RuntimeCompat\", packages.readme_source as \"package_readme_source: ReadmeSource\", packages.when_featured \"package_when_featured\", packages.is_archived \"package_is_archived\", packages.updated_at \"package_updated_at\", packages.created_at \"package_created_at\",\n (SELECT COUNT(created_at) FROM package_versions WHERE scope = packages.scope AND name = packages.name) as \"package_version_count!\",\n (SELECT version FROM package_versions WHERE scope = packages.scope AND name = packages.name AND version NOT LIKE '%-%' AND is_yanked = false ORDER BY version DESC LIMIT 1) as \"package_latest_version\",\n (SELECT meta FROM package_versions WHERE scope = packages.scope AND name = packages.name AND version NOT LIKE '%-%' AND is_yanked = false ORDER BY version DESC LIMIT 1) as \"package_version_meta: PackageVersionMeta\",\n github_repositories.id \"github_repository_id?\", github_repositories.owner \"github_repository_owner?\", github_repositories.name \"github_repository_name?\", github_repositories.updated_at \"github_repository_updated_at?\", github_repositories.created_at \"github_repository_created_at?\"\n FROM packages\n LEFT JOIN github_repositories ON packages.github_repository_id = github_repositories.id\n WHERE (SELECT version FROM package_versions WHERE scope = packages.scope AND name = packages.name AND is_yanked = false AND version IS NOT NULL ORDER BY version DESC LIMIT 1) IS NOT NULL AND NOT packages.is_archived\n ORDER BY packages.created_at DESC\n LIMIT 10", + "query": "SELECT packages.scope \"package_scope: ScopeName\", packages.name \"package_name: PackageName\", packages.description \"package_description\", packages.github_repository_id \"package_github_repository_id\", packages.runtime_compat as \"package_runtime_compat: RuntimeCompat\", packages.readme_source as \"package_readme_source: ReadmeSource\", packages.when_featured \"package_when_featured\", packages.is_archived \"package_is_archived\", packages.updated_at \"package_updated_at\", packages.created_at \"package_created_at\",\n (SELECT COUNT(created_at) FROM package_versions WHERE scope = packages.scope AND name = packages.name) as \"package_version_count!\",\n latest.version as \"package_latest_version?\",\n latest.meta as \"package_version_meta?: PackageVersionMeta\",\n github_repositories.id \"github_repository_id?\", github_repositories.owner \"github_repository_owner?\", github_repositories.name \"github_repository_name?\", github_repositories.updated_at \"github_repository_updated_at?\", github_repositories.created_at \"github_repository_created_at?\"\n FROM packages\n LEFT JOIN github_repositories ON packages.github_repository_id = github_repositories.id\n LEFT JOIN LATERAL (\n SELECT version, meta FROM package_versions\n WHERE scope = packages.scope AND name = packages.name AND version NOT LIKE '%-%' AND is_yanked = false\n ORDER BY version DESC LIMIT 1\n ) latest ON true\n WHERE EXISTS (\n SELECT 1 FROM package_versions\n WHERE scope = packages.scope AND name = packages.name AND is_yanked = false\n ) AND NOT packages.is_archived\n ORDER BY packages.created_at DESC\n LIMIT 10", "describe": { "columns": [ { @@ -70,12 +70,12 @@ }, { "ordinal": 11, - "name": "package_latest_version", + "name": "package_latest_version?", "type_info": "Text" }, { "ordinal": 12, - "name": "package_version_meta: PackageVersionMeta", + "name": "package_version_meta?: PackageVersionMeta", "type_info": "Jsonb" }, { @@ -119,8 +119,8 @@ false, false, null, - null, - null, + false, + false, false, false, false, @@ -128,5 +128,5 @@ false ] }, - "hash": "ef0155c2926ea69baf0738c6317064adee44c3627443478d3a94a45b1748db25" + "hash": "30b9ed6f2599f58359be85dbe805dc017cd8a8fae02189ee046485b66bc69f19" } diff --git a/api/.sqlx/query-ad4dad0f6bf1d42a787cbb3fbc0854131f1d2d293cbb4faa8f69ae7f91c8ecb9.json b/api/.sqlx/query-e6b8c334e0d73d20c5031c4486ea56ee60fdba567ef29b90ef16b4d9b9f1830a.json similarity index 71% rename from api/.sqlx/query-ad4dad0f6bf1d42a787cbb3fbc0854131f1d2d293cbb4faa8f69ae7f91c8ecb9.json rename to api/.sqlx/query-e6b8c334e0d73d20c5031c4486ea56ee60fdba567ef29b90ef16b4d9b9f1830a.json index 834d1032a..515c0259f 100644 --- a/api/.sqlx/query-ad4dad0f6bf1d42a787cbb3fbc0854131f1d2d293cbb4faa8f69ae7f91c8ecb9.json +++ b/api/.sqlx/query-e6b8c334e0d73d20c5031c4486ea56ee60fdba567ef29b90ef16b4d9b9f1830a.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT packages.scope \"package_scope: ScopeName\", packages.name \"package_name: PackageName\", packages.description \"package_description\", packages.github_repository_id \"package_github_repository_id\", packages.runtime_compat as \"package_runtime_compat: RuntimeCompat\", packages.readme_source as \"package_readme_source: ReadmeSource\", packages.when_featured \"package_when_featured\", packages.is_archived \"package_is_archived\", packages.updated_at \"package_updated_at\", packages.created_at \"package_created_at\",\n (SELECT COUNT(created_at) FROM package_versions WHERE scope = packages.scope AND name = packages.name) as \"package_version_count!\",\n (SELECT version FROM package_versions WHERE scope = packages.scope AND name = packages.name AND version NOT LIKE '%-%' AND is_yanked = false ORDER BY version DESC LIMIT 1) as \"package_latest_version\",\n (SELECT meta FROM package_versions WHERE scope = packages.scope AND name = packages.name AND version NOT LIKE '%-%' AND is_yanked = false ORDER BY version DESC LIMIT 1) as \"package_version_meta: PackageVersionMeta\",\n github_repositories.id \"github_repository_id?\", github_repositories.owner \"github_repository_owner?\", github_repositories.name \"github_repository_name?\", github_repositories.updated_at \"github_repository_updated_at?\", github_repositories.created_at \"github_repository_created_at?\"\n FROM packages\n LEFT JOIN github_repositories ON packages.github_repository_id = github_repositories.id\n WHERE packages.when_featured IS NOT NULL AND NOT packages.is_archived\n ORDER BY packages.when_featured DESC\n LIMIT 10", + "query": "SELECT packages.scope \"package_scope: ScopeName\", packages.name \"package_name: PackageName\", packages.description \"package_description\", packages.github_repository_id \"package_github_repository_id\", packages.runtime_compat as \"package_runtime_compat: RuntimeCompat\", packages.readme_source as \"package_readme_source: ReadmeSource\", packages.when_featured \"package_when_featured\", packages.is_archived \"package_is_archived\", packages.updated_at \"package_updated_at\", packages.created_at \"package_created_at\",\n (SELECT COUNT(created_at) FROM package_versions WHERE scope = packages.scope AND name = packages.name) as \"package_version_count!\",\n latest.version as \"package_latest_version?\",\n latest.meta as \"package_version_meta?: PackageVersionMeta\",\n github_repositories.id \"github_repository_id?\", github_repositories.owner \"github_repository_owner?\", github_repositories.name \"github_repository_name?\", github_repositories.updated_at \"github_repository_updated_at?\", github_repositories.created_at \"github_repository_created_at?\"\n FROM packages\n LEFT JOIN github_repositories ON packages.github_repository_id = github_repositories.id\n LEFT JOIN LATERAL (\n SELECT version, meta FROM package_versions\n WHERE scope = packages.scope AND name = packages.name AND version NOT LIKE '%-%' AND is_yanked = false\n ORDER BY version DESC LIMIT 1\n ) latest ON true\n WHERE packages.when_featured IS NOT NULL AND NOT packages.is_archived\n ORDER BY packages.when_featured DESC\n LIMIT 10", "describe": { "columns": [ { @@ -70,12 +70,12 @@ }, { "ordinal": 11, - "name": "package_latest_version", + "name": "package_latest_version?", "type_info": "Text" }, { "ordinal": 12, - "name": "package_version_meta: PackageVersionMeta", + "name": "package_version_meta?: PackageVersionMeta", "type_info": "Jsonb" }, { @@ -119,8 +119,8 @@ false, false, null, - null, - null, + false, + false, false, false, false, @@ -128,5 +128,5 @@ false ] }, - "hash": "ad4dad0f6bf1d42a787cbb3fbc0854131f1d2d293cbb4faa8f69ae7f91c8ecb9" + "hash": "e6b8c334e0d73d20c5031c4486ea56ee60fdba567ef29b90ef16b4d9b9f1830a" } diff --git a/api/migrations/20260303000000_package_versions_created_at_index.sql b/api/migrations/20260303000000_package_versions_created_at_index.sql new file mode 100644 index 000000000..0d62f0786 --- /dev/null +++ b/api/migrations/20260303000000_package_versions_created_at_index.sql @@ -0,0 +1,3 @@ +-- Index for "recently updated" version listings (package_stats updated query) +-- Used in: ORDER BY package_versions.created_at DESC LIMIT 10 +CREATE INDEX idx_package_versions_created_at ON package_versions (created_at DESC); diff --git a/api/src/api/mod.rs b/api/src/api/mod.rs index 1bac906f5..2c0c1e44f 100644 --- a/api/src/api/mod.rs +++ b/api/src/api/mod.rs @@ -51,7 +51,7 @@ pub fn api_router() -> Router
{ .get("/packages", util::json(global_list_handler)) .get( "/stats", - util::cache(CacheDuration::ONE_MINUTE, util::json(global_stats_handler)), + util::cache(CacheDuration::TEN_MINUTES, util::json(global_stats_handler)), ) .get( // todo: remove once CLI uses the new endpoint diff --git a/api/src/db/database.rs b/api/src/db/database.rs index 3fedea1c5..c1a759de6 100644 --- a/api/src/db/database.rs +++ b/api/src/db/database.rs @@ -1677,15 +1677,23 @@ impl Database { Vec