-
Notifications
You must be signed in to change notification settings - Fork 222
Description
Most page navigations don't result in opening the crate menu. We could load that menu using JS, either immediately after page load or on click / hover.
That would simplify #1560 because a page's HTML wouldn't depend on the list of crate versions and yanked versions.
It would also, I believe, result in an improvement in performance, reducing database load and wall clock time to load rustdoc pages.
Right now, every page load invokes this JOIN query across releases, crates, doc_coverage, and repositories:
docs.rs/src/web/crate_details.rs
Lines 90 to 129 in 19b354a
| let query = " | |
| SELECT | |
| crates.id AS crate_id, | |
| releases.id AS release_id, | |
| crates.name, | |
| releases.version, | |
| releases.description, | |
| releases.dependencies, | |
| releases.readme, | |
| releases.description_long, | |
| releases.release_time, | |
| releases.build_status, | |
| releases.rustdoc_status, | |
| releases.archive_storage, | |
| releases.repository_url, | |
| releases.homepage_url, | |
| releases.keywords, | |
| releases.have_examples, | |
| releases.target_name, | |
| repositories.host as repo_host, | |
| repositories.stars as repo_stars, | |
| repositories.forks as repo_forks, | |
| repositories.issues as repo_issues, | |
| repositories.name as repo_name, | |
| releases.is_library, | |
| releases.yanked, | |
| releases.doc_targets, | |
| releases.license, | |
| releases.documentation_url, | |
| releases.default_target, | |
| releases.doc_rustc_version, | |
| doc_coverage.total_items, | |
| doc_coverage.documented_items, | |
| doc_coverage.total_items_needing_examples, | |
| doc_coverage.items_with_examples | |
| FROM releases | |
| INNER JOIN crates ON releases.crate_id = crates.id | |
| LEFT JOIN doc_coverage ON doc_coverage.release_id = releases.id | |
| LEFT JOIN repositories ON releases.repository_id = repositories.id | |
| WHERE crates.name = $1 AND releases.version = $2;"; |
releases and crates.
Each page load also does a query across owners and owner_rels, which doesn't need to be done at page load time:
docs.rs/src/web/crate_details.rs
Lines 207 to 213 in 19b354a
| let owners = conn.query( | |
| "SELECT login, avatar | |
| FROM owners | |
| INNER JOIN owner_rels ON owner_rels.oid = owners.id | |
| WHERE cid = $1", | |
| &[&crate_id], | |
| )?; |
This query in releases_for_crate, across the releases table (with no LIMIT) could also be avoided at page load time:
docs.rs/src/web/crate_details.rs
Lines 247 to 260 in 19b354a
| let mut releases: Vec<Release> = conn | |
| .query( | |
| "SELECT | |
| id, | |
| version, | |
| build_status, | |
| yanked, | |
| is_library, | |
| rustdoc_status | |
| FROM releases | |
| WHERE | |
| releases.crate_id = $1", | |
| &[&crate_id], | |
| )? |
So I think the net result would be replacing three queries (two of them using JOINs) with a single, simple query with a single result.