Skip to content

load crate menu contents on demand #1772

Open
@jsha

Description

@jsha

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:

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;";
. If the initial page load doesn't need doc_coverage and repository info, we can reduce this to a JOIN across 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:

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:

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-frontendArea: Web frontendC-enhancementCategory: This is a new featureE-mediumEffort: This requires a fair amount of work

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions