Skip to content

Recently updated sort #1264

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jul 21, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/controllers/category/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ export default Controller.extend(PaginationMixin, {
return 'All-Time Downloads';
} else if (this.sort === 'alpha') {
return 'Alphabetical';
} else if (this.get('sort') === 'recent-updates') {
return 'Recent Updates';
} else {
return 'Recent Downloads';
}
Expand Down
2 changes: 2 additions & 0 deletions app/controllers/crates.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ export default Controller.extend(PaginationMixin, {
return 'All-Time Downloads';
} else if (this.sort === 'recent-downloads') {
return 'Recent Downloads';
} else if (this.get('sort') === 'recent-updates') {
return 'Recent Updates';
} else {
return 'Alphabetical';
}
Expand Down
2 changes: 2 additions & 0 deletions app/controllers/keyword/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ export default Controller.extend(PaginationMixin, {
return 'All-Time Downloads';
} else if (this.sort === 'alpha') {
return 'Alphabetical';
} else if (this.get('sort') === 'recent-updates') {
return 'Recent Updates';
} else {
return 'Recent Downloads';
}
Expand Down
2 changes: 2 additions & 0 deletions app/controllers/me/crates.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ export default Controller.extend(PaginationMixin, {
return 'All-Time Downloads';
} else if (this.sort === 'recent-downloads') {
return 'Recent Downloads';
} else if (this.get('sort') === 'recent-updates') {
return 'Recent Updates';
} else {
return 'Alphabetical';
}
Expand Down
2 changes: 2 additions & 0 deletions app/controllers/search.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ export default Controller.extend(PaginationMixin, {
return 'All-Time Downloads';
} else if (this.sort === 'recent-downloads') {
return 'Recent Downloads';
} else if (this.get('sort') === 'recent-updates') {
return 'Recent Updates';
} else {
return 'Relevance';
}
Expand Down
2 changes: 2 additions & 0 deletions app/controllers/team.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ export default Controller.extend(PaginationMixin, {
return 'All-Time Downloads';
} else if (this.sort === 'recent-downloads') {
return 'Recent Downloads';
} else if (this.get('sort') === 'recent-updates') {
return 'Recent Updates';
} else {
return 'Alphabetical';
}
Expand Down
2 changes: 2 additions & 0 deletions app/controllers/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ export default Controller.extend(PaginationMixin, {
return 'All-Time Downloads';
} else if (this.sort === 'recent-downloads') {
return 'Recent Downloads';
} else if (this.get('sort') === 'recent-updates') {
return 'Recent Updates';
} else {
return 'Alphabetical';
}
Expand Down
5 changes: 5 additions & 0 deletions app/templates/category/index.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,11 @@
Recent Downloads
{{/link-to}}
</li>
<li>
{{#link-to (query-params sort="recent-updates")}}
Recent Updates
{{/link-to}}
</li>
{{/rl-dropdown}}
{{/rl-dropdown-container}}
</div>
Expand Down
5 changes: 5 additions & 0 deletions app/templates/crates.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@
Recent Downloads
{{/link-to}}
</li>
<li>
{{#link-to (query-params page=1 sort="recent-updates")}}
Recent Updates
{{/link-to}}
</li>
{{/rl-dropdown}}
{{/rl-dropdown-container}}
</div>
Expand Down
5 changes: 5 additions & 0 deletions app/templates/keyword/index.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@
Recent Downloads
{{/link-to}}
</li>
<li>
{{#link-to (query-params sort="recent-updates")}}
Recent Updates
{{/link-to}}
</li>
{{/rl-dropdown}}
{{/rl-dropdown-container}}
</div>
Expand Down
5 changes: 5 additions & 0 deletions app/templates/me/crates.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@
Recent Downloads
{{/link-to}}
</li>
<li>
{{#link-to (query-params sort="recent-updates")}}
Recent Updates
{{/link-to}}
</li>
{{/rl-dropdown}}
{{/rl-dropdown-container}}
</div>
Expand Down
5 changes: 5 additions & 0 deletions app/templates/search.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@
Recent Downloads
{{/link-to}}
</li>
<li>
{{#link-to (query-params page=1 sort="recent-updates")}}
Recent Updates
{{/link-to}}
</li>
{{/rl-dropdown}}
{{/rl-dropdown-container}}
</div>
Expand Down
5 changes: 5 additions & 0 deletions app/templates/team.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@
Recent Downloads
{{/link-to}}
</li>
<li>
{{#link-to (query-params sort="recent-updates")}}
Recent Updates
{{/link-to}}
</li>
{{/rl-dropdown}}
{{/rl-dropdown-container}}
</div>
Expand Down
5 changes: 5 additions & 0 deletions app/templates/user.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@
Recent Downloads
{{/link-to}}
</li>
<li>
{{#link-to (query-params sort="recent-updates")}}
Recent Updates
{{/link-to}}
</li>
{{/rl-dropdown}}
{{/rl-dropdown-container}}
</div>
Expand Down
2 changes: 2 additions & 0 deletions src/controllers/krate/search.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,8 @@ pub fn search(req: &mut dyn Request) -> CargoResult<Response> {
query = query.then_order_by(crates::downloads.desc())
} else if sort == "recent-downloads" {
query = query.then_order_by(recent_crate_downloads::downloads.desc().nulls_last())
} else if sort == "recent-updates" {
query = query.order(crates::updated_at.desc());
} else {
query = query.then_order_by(crates::name.asc())
}
Expand Down
136 changes: 130 additions & 6 deletions src/tests/krate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use std::sync::Arc;

use chrono::Utc;
use conduit::{Handler, Method};
use diesel::dsl::*;
use diesel::update;
use flate2::Compression;
use flate2::write::GzEncoder;
Expand Down Expand Up @@ -288,36 +289,152 @@ fn exact_match_first_on_queries() {
assert_eq!(json.crates[2].name, "foo_exact");
}

#[test]
fn index_sorting() {
let (_b, app, middle) = ::app();
let krate1;
let krate2;
let krate3;
let krate4;

{
let conn = app.diesel_database.get().unwrap();
let user = ::new_user("foo").create_or_update(&conn).unwrap();

krate1 = ::CrateBuilder::new("foo_sort", user.id)
.description("bar_sort baz_sort const")
.downloads(50)
.recent_downloads(50)
.expect_build(&conn);

krate2 = ::CrateBuilder::new("bar_sort", user.id)
.description("foo_sort baz_sort foo_sort baz_sort const")
.downloads(3333)
.recent_downloads(0)
.expect_build(&conn);

krate3 = ::CrateBuilder::new("baz_sort", user.id)
.description("foo_sort bar_sort foo_sort bar_sort foo_sort bar_sort const")
.downloads(100_000)
.recent_downloads(10)
.expect_build(&conn);

krate4 = ::CrateBuilder::new("other_sort", user.id)
.description("other_sort const")
.downloads(999_999)
.expect_build(&conn);

// Set the updated at column for each crate
update(&krate1)
.set(crates::updated_at.eq(now - 3.weeks()))
.execute(&*conn)
.unwrap();
update(&krate2)
.set(crates::updated_at.eq(now - 5.days()))
.execute(&*conn)
.unwrap();
update(&krate3)
.set(crates::updated_at.eq(now - 10.seconds()))
.execute(&*conn)
.unwrap();
update(&krate4)
.set(crates::updated_at.eq(now))
.execute(&*conn)
.unwrap();
}

// Sort by downloads
let mut req = ::req(app, Method::Get, "/api/v1/crates");
let mut response = ok_resp!(middle.call(req.with_query("sort=downloads")));
let json: CrateList = ::json(&mut response);
assert_eq!(json.meta.total, 4);
assert_eq!(json.crates[0].name, "other_sort");
assert_eq!(json.crates[1].name, "baz_sort");
assert_eq!(json.crates[2].name, "bar_sort");
assert_eq!(json.crates[3].name, "foo_sort");

// Sort by recent-downloads
let mut response = ok_resp!(middle.call(req.with_query("sort=recent-downloads"),));
let json: CrateList = ::json(&mut response);
assert_eq!(json.meta.total, 4);
assert_eq!(json.crates[0].name, "foo_sort");
assert_eq!(json.crates[1].name, "baz_sort");
assert_eq!(json.crates[2].name, "bar_sort");
assert_eq!(json.crates[3].name, "other_sort");

// Sort by recent-updates
let mut response = ok_resp!(middle.call(req.with_query("sort=recent-updates"),));
let json: CrateList = ::json(&mut response);
assert_eq!(json.meta.total, 4);
assert_eq!(json.crates[0].name, "other_sort");
assert_eq!(json.crates[1].name, "baz_sort");
assert_eq!(json.crates[2].name, "bar_sort");
assert_eq!(json.crates[3].name, "foo_sort");

// Test for bug with showing null results first when sorting
// by descending downloads
let mut response = ok_resp!(middle.call(req.with_query("sort=recent-downloads")));
let json: CrateList = ::json(&mut response);
assert_eq!(json.meta.total, 4);
assert_eq!(json.crates[0].name, "foo_sort");
assert_eq!(json.crates[1].name, "baz_sort");
assert_eq!(json.crates[2].name, "bar_sort");
assert_eq!(json.crates[3].name, "other_sort");
}

#[test]
fn exact_match_on_queries_with_sort() {
let (_b, app, middle) = ::app();

let krate1;
let krate2;
let krate3;
let krate4;

{
let conn = app.diesel_database.get().unwrap();
let user = ::new_user("foo").create_or_update(&conn).unwrap();

::CrateBuilder::new("foo_sort", user.id)
krate1 = ::CrateBuilder::new("foo_sort", user.id)
.description("bar_sort baz_sort const")
.downloads(50)
.recent_downloads(50)
.expect_build(&conn);

::CrateBuilder::new("bar_sort", user.id)
krate2 = ::CrateBuilder::new("bar_sort", user.id)
.description("foo_sort baz_sort foo_sort baz_sort const")
.downloads(3333)
.recent_downloads(0)
.expect_build(&conn);

::CrateBuilder::new("baz_sort", user.id)
krate3 = ::CrateBuilder::new("baz_sort", user.id)
.description("foo_sort bar_sort foo_sort bar_sort foo_sort bar_sort const")
.downloads(100_000)
.recent_downloads(10)
.expect_build(&conn);

::CrateBuilder::new("other_sort", user.id)
krate4 = ::CrateBuilder::new("other_sort", user.id)
.description("other_sort const")
.downloads(999_999)
.expect_build(&conn);

// Set the updated at column for each crate
update(&krate1)
.set(crates::updated_at.eq(now - 3.weeks()))
.execute(&*conn)
.unwrap();
update(&krate2)
.set(crates::updated_at.eq(now - 5.days()))
.execute(&*conn)
.unwrap();
update(&krate3)
.set(crates::updated_at.eq(now - 10.seconds()))
.execute(&*conn)
.unwrap();
update(&krate4)
.set(crates::updated_at.eq(now))
.execute(&*conn)
.unwrap();
}

// Sort by downloads
Expand Down Expand Up @@ -359,9 +476,16 @@ fn exact_match_on_queries_with_sort() {
assert_eq!(json.crates[1].name, "foo_sort");
assert_eq!(json.crates[2].name, "baz_sort");

// Sort by recent-updates
let mut response = ok_resp!(middle.call(req.with_query("q=bar_sort&sort=recent-updates"),));
let json: CrateList = ::json(&mut response);
assert_eq!(json.meta.total, 3);
assert_eq!(json.crates[0].name, "baz_sort");
assert_eq!(json.crates[1].name, "bar_sort");
assert_eq!(json.crates[2].name, "foo_sort");

// Test for bug with showing null results first when sorting
// by descending
// This has nothing to do with querying for exact match I'm sorry
// by descending downloads
let mut response = ok_resp!(middle.call(req.with_query("sort=recent-downloads")));
let json: CrateList = ::json(&mut response);
assert_eq!(json.meta.total, 4);
Expand Down
2 changes: 1 addition & 1 deletion tests/acceptance/search-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ module('Acceptance | search', function(hooks) {
assert.dom('[data-test-search-nav]').hasText('Displaying 1-8 of 8 total results');
assert
.dom('[data-test-search-sort]')
.hasText('Sort by Relevance Relevance All-Time Downloads Recent Downloads');
.hasText('Sort by Relevance Relevance All-Time Downloads Recent Downloads Recent Updates');
assert.dom('[data-test-crate-row="0"] [data-test-crate-link]').hasText('kinetic-rust');
assert.dom('[data-test-crate-row="0"] [data-test-version-badge]').hasAttribute('alt', '0.0.16');

Expand Down