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, Vec, )> { - let newest = sqlx::query!( + let newest_fut = sqlx::query!( r#"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", (SELECT COUNT(created_at) FROM package_versions WHERE scope = packages.scope AND name = packages.name) as "package_version_count!", - (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", - (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", + latest.version as "package_latest_version?", + latest.meta as "package_version_meta?: PackageVersionMeta", 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?" FROM packages LEFT JOIN github_repositories ON packages.github_repository_id = github_repositories.id - 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 + LEFT JOIN LATERAL ( + SELECT version, 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 + ) latest ON true + WHERE EXISTS ( + SELECT 1 FROM package_versions + WHERE scope = packages.scope AND name = packages.name AND is_yanked = false + ) AND NOT packages.is_archived ORDER BY packages.created_at DESC LIMIT 10"#, ) @@ -1718,10 +1726,9 @@ impl Database { let meta = r.package_version_meta.unwrap_or_default(); (package, github_repository, meta) }) - .fetch_all(&self.pool) - .await?; + .fetch_all(&self.pool); - let updated = sqlx::query_as!( + let updated_fut = sqlx::query_as!( PackageVersion, r#"SELECT package_versions.scope as "scope: ScopeName", package_versions.name as "name: PackageName", package_versions.version as "version: Version", package_versions.user_id, package_versions.readme_path as "readme_path: PackagePath", package_versions.exports as "exports: ExportsMap", package_versions.is_yanked, package_versions.uses_npm, package_versions.meta as "meta: PackageVersionMeta", package_versions.updated_at, package_versions.created_at, package_versions.rekor_log_id, package_versions.license FROM package_versions @@ -1730,17 +1737,21 @@ impl Database { ORDER BY package_versions.created_at DESC LIMIT 10"#, ) - .fetch_all(&self.pool) - .await?; + .fetch_all(&self.pool); - let featured = sqlx::query!( + let featured_fut = sqlx::query!( r#"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", (SELECT COUNT(created_at) FROM package_versions WHERE scope = packages.scope AND name = packages.name) as "package_version_count!", - (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", - (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", + latest.version as "package_latest_version?", + latest.meta as "package_version_meta?: PackageVersionMeta", 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?" FROM packages LEFT JOIN github_repositories ON packages.github_repository_id = github_repositories.id + LEFT JOIN LATERAL ( + SELECT version, 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 + ) latest ON true WHERE packages.when_featured IS NOT NULL AND NOT packages.is_archived ORDER BY packages.when_featured DESC LIMIT 10"#, @@ -1774,8 +1785,10 @@ impl Database { let meta = r.package_version_meta.unwrap_or_default(); (package, github_repository, meta) }) - .fetch_all(&self.pool) - .await?; + .fetch_all(&self.pool); + + let (newest, updated, featured) = + tokio::try_join!(newest_fut, updated_fut, featured_fut)?; Ok((newest, updated, featured)) } diff --git a/api/src/util.rs b/api/src/util.rs index 54c090a4d..4033adc14 100644 --- a/api/src/util.rs +++ b/api/src/util.rs @@ -114,6 +114,7 @@ where pub struct CacheDuration(pub usize); impl CacheDuration { pub const ONE_MINUTE: CacheDuration = CacheDuration(60); + pub const TEN_MINUTES: CacheDuration = CacheDuration(60 * 10); pub const ONE_DAY: CacheDuration = CacheDuration(60 * 60 * 24); pub const FOREVER: CacheDuration = CacheDuration(60 * 60 * 24 * 365); }