Skip to content

Commit 47998b7

Browse files
Merge #1238
1238: Move `readme_rendered_at` off of the versions table r=sgrif This column is never used in code other than for filtering/recording purposes. We do not put it on the `Version` struct, and don't need to be sending it over the wire every time we query that table.
2 parents d9fd8b4 + 39feeb6 commit 47998b7

File tree

6 files changed

+63
-12
lines changed

6 files changed

+63
-12
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
ALTER TABLE versions ADD COLUMN readme_rendered_at TIMESTAMP;
2+
3+
UPDATE versions SET readme_rendered_at = readme_renderings.rendered_at
4+
FROM readme_renderings
5+
WHERE readme_renderings.version_id = versions.id;
6+
7+
DROP TABLE readme_renderings;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CREATE TABLE readme_renderings (
2+
version_id INTEGER NOT NULL PRIMARY KEY REFERENCES versions (id) ON DELETE CASCADE,
3+
rendered_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
4+
);
5+
6+
INSERT INTO readme_renderings (version_id, rendered_at)
7+
SELECT id, readme_rendered_at FROM versions WHERE readme_rendered_at IS NOT NULL;
8+
9+
ALTER TABLE versions DROP COLUMN readme_rendered_at;

src/bin/render-readmes.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,11 @@ fn main() {
7979

8080
let mut query = versions::table
8181
.inner_join(crates::table)
82+
.left_outer_join(readme_renderings::table)
8283
.filter(
83-
versions::readme_rendered_at
84+
readme_renderings::rendered_at
8485
.lt(older_than)
85-
.or(versions::readme_rendered_at.is_null()),
86+
.or(readme_renderings::version_id.is_null()),
8687
)
8788
.select(versions::id)
8889
.into_boxed();

src/schema.rs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,26 @@ table! {
527527
}
528528
}
529529

530+
table! {
531+
/// Representation of the `readme_renderings` table.
532+
///
533+
/// (Automatically generated by Diesel.)
534+
readme_renderings (version_id) {
535+
/// The `version_id` column of the `readme_renderings` table.
536+
///
537+
/// Its SQL type is `Int4`.
538+
///
539+
/// (Automatically generated by Diesel.)
540+
version_id -> Int4,
541+
/// The `rendered_at` column of the `readme_renderings` table.
542+
///
543+
/// Its SQL type is `Timestamp`.
544+
///
545+
/// (Automatically generated by Diesel.)
546+
rendered_at -> Timestamp,
547+
}
548+
}
549+
530550
table! {
531551
/// Representation of the `reserved_crate_names` table.
532552
///
@@ -764,12 +784,6 @@ table! {
764784
///
765785
/// (Automatically generated by Diesel.)
766786
license -> Nullable<Varchar>,
767-
/// The `readme_rendered_at` column of the `versions` table.
768-
///
769-
/// Its SQL type is `Nullable<Timestamp>`.
770-
///
771-
/// (Automatically generated by Diesel.)
772-
readme_rendered_at -> Nullable<Timestamp>,
773787
}
774788
}
775789

@@ -788,6 +802,7 @@ joinable!(dependencies -> versions (version_id));
788802
joinable!(emails -> users (user_id));
789803
joinable!(follows -> crates (crate_id));
790804
joinable!(follows -> users (user_id));
805+
joinable!(readme_renderings -> versions (version_id));
791806
joinable!(version_authors -> users (user_id));
792807
joinable!(version_authors -> versions (version_id));
793808
joinable!(version_downloads -> versions (version_id));
@@ -808,6 +823,7 @@ allow_tables_to_appear_in_same_query!(
808823
follows,
809824
keywords,
810825
metadata,
826+
readme_renderings,
811827
reserved_crate_names,
812828
teams,
813829
users,

src/tests/version.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,19 @@ fn authors() {
9393
let json = json.as_object().unwrap();
9494
assert!(json.contains_key(&"users".to_string()));
9595
}
96+
97+
#[test]
98+
fn record_rerendered_readme_time() {
99+
let (_b, app, _middle) = ::app();
100+
let version = {
101+
let conn = app.diesel_database.get().unwrap();
102+
let u = ::new_user("foo").create_or_update(&conn).unwrap();
103+
let c = ::CrateBuilder::new("foo_authors", u.id).expect_build(&conn);
104+
::new_version(c.id, "1.0.0").save(&conn, &[]).unwrap()
105+
};
106+
{
107+
let conn = app.diesel_database.get().unwrap();
108+
version.record_readme_rendering(&conn).unwrap();
109+
version.record_readme_rendering(&conn).unwrap();
110+
}
111+
}

src/version/mod.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,11 +128,14 @@ impl Version {
128128
}
129129

130130
pub fn record_readme_rendering(&self, conn: &PgConnection) -> QueryResult<usize> {
131-
use schema::versions::dsl::readme_rendered_at;
131+
use schema::readme_renderings::dsl::*;
132132
use diesel::dsl::now;
133133

134-
diesel::update(self)
135-
.set(readme_rendered_at.eq(now.nullable()))
134+
diesel::insert_into(readme_renderings)
135+
.values(version_id.eq(self.id))
136+
.on_conflict(version_id)
137+
.do_update()
138+
.set(rendered_at.eq(now))
136139
.execute(conn)
137140
}
138141
}
@@ -227,7 +230,6 @@ impl Queryable<versions::SqlType, Pg> for Version {
227230
Option<String>,
228231
bool,
229232
Option<String>,
230-
Option<NaiveDateTime>,
231233
);
232234

233235
fn build(row: Self::Row) -> Self {

0 commit comments

Comments
 (0)