Skip to content

Commit d4089ba

Browse files
KixironJoshua Nelson
authored and
Joshua Nelson
committed
Removed the content & versions column, removed the search updater service and semi-refactored CrateDetails::new
1 parent 9bd032f commit d4089ba

File tree

7 files changed

+79
-151
lines changed

7 files changed

+79
-151
lines changed

docker-entrypoint.sh

-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ while true; do
2727
done
2828
set -e
2929

30-
cratesfyi database update-search-index
3130
cratesfyi database update-release-activity
3231

3332
if ! [ -d "${CRATESFYI_PREFIX}/crates.io-index/.git" ]; then

src/bin/cratesfyi.rs

-8
Original file line numberDiff line numberDiff line change
@@ -381,9 +381,6 @@ enum DatabaseSubcommand {
381381
/// Updates monthly release activity chart
382382
UpdateReleaseActivity,
383383

384-
/// Updates search index
385-
UpdateSearchIndex,
386-
387384
/// Removes a whole crate from the database
388385
DeleteCrate {
389386
/// Name of the crate to delete
@@ -420,11 +417,6 @@ impl DatabaseSubcommand {
420417
Self::UpdateReleaseActivity => cratesfyi::utils::update_release_activity()
421418
.expect("Failed to update release activity"),
422419

423-
Self::UpdateSearchIndex => {
424-
let conn = db::connect_db().expect("failed to connect to the database");
425-
db::update_search_index(&conn).expect("Failed to update search index");
426-
}
427-
428420
Self::DeleteCrate { crate_name } => {
429421
let conn = db::connect_db().expect("failed to connect to the database");
430422
db::delete_crate(&conn, &crate_name).expect("failed to delete the crate");

src/db/add_package.rs

+7-26
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use crate::{
1313
use log::debug;
1414
use postgres::Connection;
1515
use regex::Regex;
16-
use semver::Version;
1716
use serde_json::Value;
1817
use slug::slugify;
1918

@@ -118,31 +117,13 @@ pub(crate) fn add_package_into_database(
118117
add_authors_into_database(&conn, &metadata_pkg, release_id)?;
119118
add_owners_into_database(&conn, &cratesio_data.owners, crate_id)?;
120119

121-
// Update versions
122-
{
123-
let metadata_version = Version::parse(&metadata_pkg.version)?;
124-
let mut versions: Value = conn
125-
.query("SELECT versions FROM crates WHERE id = $1", &[&crate_id])?
126-
.get(0)
127-
.get(0);
128-
if let Some(versions_array) = versions.as_array_mut() {
129-
let mut found = false;
130-
for version in versions_array.clone() {
131-
let version = Version::parse(version.as_str().unwrap())?;
132-
if version == metadata_version {
133-
found = true;
134-
}
135-
}
136-
137-
if !found {
138-
versions_array.push(Value::String(metadata_pkg.version.clone()));
139-
}
140-
}
141-
let _ = conn.query(
142-
"UPDATE crates SET versions = $1 WHERE id = $2",
143-
&[&versions, &crate_id],
144-
);
145-
}
120+
// Update the crates table with the new release
121+
conn.execute(
122+
"UPDATE crates
123+
SET latest_version_id = $2
124+
WHERE id = $1",
125+
&[&crate_id, &release_id],
126+
)?;
146127

147128
Ok(release_id)
148129
}

src/db/migrate.rs

+15
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,21 @@ pub fn migrate(version: Option<Version>, conn: &Connection) -> CratesfyiResult<(
325325
ALTER TABLE releases ALTER COLUMN doc_targets DROP NOT NULL;
326326
"
327327
),
328+
migration!(
329+
context,
330+
// version
331+
13,
332+
// description
333+
"Remove the content column and releases column",
334+
// upgrade query
335+
"ALTER TABLE crates
336+
DROP COLUMN content,
337+
DROP COLUMN versions;",
338+
// downgrade query
339+
"ALTER TABLE crates
340+
ADD COLUMN content,
341+
ADD COLUMN versions;"
342+
),
328343
];
329344

330345
for migration in migrations {

src/db/mod.rs

-37
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ pub use self::file::add_path_into_database;
77
pub use self::migrate::migrate;
88

99
use failure::Fail;
10-
use postgres::error::Error;
1110
use postgres::{Connection, TlsMode};
1211
use std::env;
1312

@@ -54,42 +53,6 @@ pub(crate) fn create_pool() -> r2d2::Pool<r2d2_postgres::PostgresConnectionManag
5453
.expect("Failed to create r2d2 pool")
5554
}
5655

57-
/// Updates content column in crates table.
58-
///
59-
/// This column will be used for searches and always contains `tsvector` of:
60-
///
61-
/// * crate name (rank A-weight)
62-
/// * latest release description (rank B-weight)
63-
/// * latest release keywords (rank B-weight)
64-
/// * latest release readme (rank C-weight)
65-
/// * latest release root rustdoc (rank C-weight)
66-
pub fn update_search_index(conn: &Connection) -> Result<u64, Error> {
67-
conn.execute(
68-
"
69-
WITH doc as (
70-
SELECT DISTINCT ON(releases.crate_id)
71-
releases.id,
72-
releases.crate_id,
73-
setweight(to_tsvector(crates.name), 'A') ||
74-
setweight(to_tsvector(coalesce(releases.description, '')), 'B') ||
75-
setweight(to_tsvector(coalesce((
76-
SELECT string_agg(value, ' ')
77-
FROM json_array_elements_text(releases.keywords)), '')), 'B')
78-
as content
79-
FROM releases
80-
INNER JOIN crates ON crates.id = releases.crate_id
81-
ORDER BY releases.crate_id, releases.release_time DESC
82-
)
83-
UPDATE crates
84-
SET latest_version_id = doc.id,
85-
content = doc.content
86-
FROM doc
87-
WHERE crates.id = doc.crate_id AND
88-
(crates.latest_version_id = 0 OR crates.latest_version_id != doc.id);",
89-
&[],
90-
)
91-
}
92-
9356
#[cfg(test)]
9457
mod test {
9558
use super::*;

src/utils/daemon.rs

-13
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
//! This daemon will start web server, track new packages and build them
44
55
use crate::{
6-
db::{connect_db, update_search_index},
76
docbuilder::RustwideBuilder,
87
utils::{github_updater, pubsubhubbub, update_release_activity},
98
DocBuilder, DocBuilderOptions,
@@ -232,18 +231,6 @@ pub fn start_daemon(background: bool) {
232231
})
233232
.unwrap();
234233

235-
// update search index every 3 hours
236-
thread::Builder::new()
237-
.name("search index updater".to_string())
238-
.spawn(move || loop {
239-
thread::sleep(Duration::from_secs(60 * 60 * 3));
240-
let conn = connect_db().expect("Failed to connect database");
241-
if let Err(e) = update_search_index(&conn) {
242-
error!("Failed to update search index: {}", e);
243-
}
244-
})
245-
.unwrap();
246-
247234
// update github stats every 6 hours
248235
thread::Builder::new()
249236
.name("github stat updater".to_string())

src/web/crate_details.rs

+57-66
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,10 @@ pub struct Release {
115115
impl CrateDetails {
116116
pub fn new(conn: &Connection, name: &str, version: &str) -> Option<CrateDetails> {
117117
// get all stuff, I love you rustfmt
118-
let query = "SELECT crates.id,
119-
releases.id,
118+
let query = "
119+
SELECT
120+
crates.id AS crate_id,
121+
releases.id AS release_id,
120122
crates.name,
121123
releases.version,
122124
releases.description,
@@ -132,7 +134,7 @@ impl CrateDetails {
132134
releases.keywords,
133135
releases.have_examples,
134136
releases.target_name,
135-
crates.versions,
137+
ARRAY(SELECT releases.version FROM releases WHERE releases.crate_id = crates.id) AS versions,
136138
crates.github_stars,
137139
crates.github_forks,
138140
crates.github_issues,
@@ -142,59 +144,48 @@ impl CrateDetails {
142144
releases.license,
143145
releases.documentation_url,
144146
releases.default_target
145-
FROM releases
146-
INNER JOIN crates ON releases.crate_id = crates.id
147-
WHERE crates.name = $1 AND releases.version = $2;";
147+
FROM releases
148+
INNER JOIN crates ON releases.crate_id = crates.id
149+
WHERE crates.name = $1 AND releases.version = $2;";
148150

149151
let rows = conn.query(query, &[&name, &version]).unwrap();
150152

151-
if rows.is_empty() {
153+
let krate = if rows.is_empty() {
152154
return None;
153-
}
155+
} else {
156+
rows.get(0)
157+
};
154158

155-
let crate_id: i32 = rows.get(0).get(0);
156-
let release_id: i32 = rows.get(0).get(1);
159+
let crate_id: i32 = krate.get("crate_id");
160+
let release_id: i32 = krate.get("release_id");
157161

158162
// sort versions with semver
159163
let releases = {
160-
let versions_from_db: Value = rows.get(0).get(17);
161-
162-
if let Some(versions_from_db) = versions_from_db.as_array() {
163-
let mut versions: Vec<semver::Version> = versions_from_db
164-
.iter()
165-
.filter_map(|version| {
166-
if let Some(version) = version.as_str() {
167-
if let Ok(sem_ver) = semver::Version::parse(&version) {
168-
return Some(sem_ver);
169-
}
170-
}
171-
172-
None
173-
})
174-
.collect();
175-
176-
versions.sort();
177-
versions.reverse();
178-
versions
179-
.iter()
180-
.map(|version| map_to_release(&conn, crate_id, version.to_string()))
181-
.collect()
182-
} else {
183-
Vec::new()
184-
}
164+
let versions: Vec<String> = krate.get("versions");
165+
let mut versions: Vec<semver::Version> = versions
166+
.iter()
167+
.filter_map(|version| semver::Version::parse(&version).ok())
168+
.collect();
169+
170+
versions.sort();
171+
versions.reverse();
172+
versions
173+
.iter()
174+
.map(|version| map_to_release(&conn, crate_id, version.to_string()))
175+
.collect()
185176
};
186177

187178
let metadata = MetaData {
188-
name: rows.get(0).get(2),
189-
version: rows.get(0).get(3),
190-
description: rows.get(0).get(4),
191-
rustdoc_status: rows.get(0).get(11),
192-
target_name: rows.get(0).get(16),
193-
default_target: rows.get(0).get(26),
179+
name: krate.get("name"),
180+
version: krate.get("version"),
181+
description: krate.get("description"),
182+
rustdoc_status: krate.get("rustdoc_status"),
183+
target_name: krate.get("target_name"),
184+
default_target: krate.get("default_target"),
194185
};
195186

196187
let doc_targets = {
197-
let data: Value = rows.get(0).get(23);
188+
let data: Value = krate.get("doc_targets");
198189
data.as_array()
199190
.map(|array| {
200191
array
@@ -206,35 +197,35 @@ impl CrateDetails {
206197
};
207198

208199
let mut crate_details = CrateDetails {
209-
name: rows.get(0).get(2),
210-
version: rows.get(0).get(3),
211-
description: rows.get(0).get(4),
200+
name: krate.get("name"),
201+
version: krate.get("version"),
202+
description: krate.get("description"),
212203
authors: Vec::new(),
213204
owners: Vec::new(),
214-
authors_json: rows.get(0).get(5),
215-
dependencies: rows.get(0).get(6),
216-
readme: rows.get(0).get(7),
217-
rustdoc: rows.get(0).get(8),
218-
release_time: rows.get(0).get(9),
219-
build_status: rows.get(0).get(10),
205+
authors_json: krate.get("authors"),
206+
dependencies: krate.get("dependencies"),
207+
readme: krate.get("readme"),
208+
rustdoc: krate.get("description_long"),
209+
release_time: krate.get("release_time"),
210+
build_status: krate.get("build_status"),
220211
last_successful_build: None,
221-
rustdoc_status: rows.get(0).get(11),
222-
repository_url: rows.get(0).get(12),
223-
homepage_url: rows.get(0).get(13),
224-
keywords: rows.get(0).get(14),
225-
have_examples: rows.get(0).get(15),
226-
target_name: rows.get(0).get(16),
212+
rustdoc_status: krate.get("rustdoc_status"),
213+
repository_url: krate.get("repository_url"),
214+
homepage_url: krate.get("homepage_url"),
215+
keywords: krate.get("keywords"),
216+
have_examples: krate.get("have_examples"),
217+
target_name: krate.get("target_name"),
227218
releases,
228219
github: false,
229-
github_stars: rows.get(0).get(18),
230-
github_forks: rows.get(0).get(19),
231-
github_issues: rows.get(0).get(20),
220+
github_stars: krate.get("github_stars"),
221+
github_forks: krate.get("github_forks"),
222+
github_issues: krate.get("github_issues"),
232223
metadata,
233-
is_library: rows.get(0).get(21),
234-
yanked: rows.get(0).get(22),
224+
is_library: krate.get("is_library"),
225+
yanked: krate.get("yanked"),
235226
doc_targets,
236-
license: rows.get(0).get(24),
237-
documentation_url: rows.get(0).get(25),
227+
license: krate.get("license"),
228+
documentation_url: krate.get("documentation_url"),
238229
};
239230

240231
if let Some(repository_url) = crate_details.repository_url.clone() {
@@ -255,7 +246,7 @@ impl CrateDetails {
255246

256247
crate_details.authors = authors
257248
.into_iter()
258-
.map(|row| (row.get(0), row.get(1)))
249+
.map(|row| (row.get("name"), row.get("slug")))
259250
.collect();
260251

261252
// get owners
@@ -271,7 +262,7 @@ impl CrateDetails {
271262

272263
crate_details.owners = owners
273264
.into_iter()
274-
.map(|row| (row.get(0), row.get(1)))
265+
.map(|row| (row.get("login"), row.get("avatar")))
275266
.collect();
276267

277268
if !crate_details.build_status {

0 commit comments

Comments
 (0)