Skip to content
This repository has been archived by the owner on Aug 7, 2021. It is now read-only.

Commit

Permalink
Allow passing some id arrays as csv to reduce url length
Browse files Browse the repository at this point in the history
  • Loading branch information
Kevin Butler authored and Ryman committed Sep 13, 2018
1 parent 7a7f3b2 commit 352c133
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 3 deletions.
11 changes: 11 additions & 0 deletions src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,17 @@ macro_rules! vec_from_params {
};
}

#[macro_export]
macro_rules! vec_from_maybe_csv_params {
($params:expr, $param:expr) => {
match $params.get($param) {
Some(val @ Value::Array(_)) => Vec::from_value(val).unwrap_or(vec![]),
Some(Value::String(csv)) => csv.split(',').flat_map(|v| v.trim().parse().ok()).collect::<Vec<_>>(),
_ => vec![],
}
};
}

/// Like `vec_from_params`, but expects `$t` (instead of `Vec<$t>`)
/// and return `Vec<$t>`. Elements that cannot be actually
/// casted to `$t` are discarded.
Expand Down
79 changes: 76 additions & 3 deletions src/resources/talent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ impl Talent {
),
<Query as VectorOfTerms<i32>>::build_terms(
"id",
&vec_from_params!(params, "bookmarked_talents"),
&vec_from_maybe_csv_params!(params, "bookmarked_talents"),
),
Talent::visibility_filters(
epoch,
Expand Down Expand Up @@ -414,11 +414,11 @@ impl Talent {
<Query as VectorOfTerms<i32>>::build_terms("blocked_companies", &company_id),
<Query as VectorOfTerms<i32>>::build_terms(
"id",
&vec_from_params!(params, "contacted_talents"),
&vec_from_maybe_csv_params!(params, "contacted_talents"),
),
<Query as VectorOfTerms<i32>>::build_terms(
"id",
&vec_from_params!(params, "ignored_talents"),
&vec_from_maybe_csv_params!(params, "ignored_talents"),
),
].into_iter()
.flat_map(|x| x)
Expand Down Expand Up @@ -1534,6 +1534,27 @@ mod tests {
assert_eq!(vec![4], results.ids());
}

// Ignoring some talents, csv parsing
{
let mut params = Map::new();
params
.assign("keywords", Value::String("database admin".to_owned()))
.unwrap();
params.assign("ignored_talents[]", Value::String("1".into())).unwrap();

let results = Talent::search(&mut client, &*index, &params);
assert_eq!(vec![4], results.ids());

let mut params = Map::new();
params
.assign("keywords", Value::String("database admin".to_owned()))
.unwrap();
params.assign("ignored_talents", Value::String("1, 4".into())).unwrap();

let results = Talent::search(&mut client, &*index, &params);
assert_eq!(Vec::<u32>::new(), results.ids());
}

// highlight
{
let mut params = Map::new();
Expand Down Expand Up @@ -1591,6 +1612,39 @@ mod tests {
let results = Talent::search(&mut client, &*index, &params);
assert_eq!(vec![4, 5, 2, 1], results.ids());
assert_eq!(4, results.total);

let mut params = Map::new();
params
.assign("bookmarked_talents[]", Value::U64(2))
.unwrap();
params
.assign("bookmarked_talents[]", Value::U64(4))
.unwrap();

let results = Talent::search(&mut client, &*index, &params);
assert_eq!(vec![4, 2], results.ids());
assert_eq!(2, results.total);
}

// filtering for given bookmarks (ids) with csv parsing
{
let mut params = Map::new();
params
.assign("bookmarked_talents", Value::String("2,4,1,3,5,6,7,8".into()))
.unwrap();

let results = Talent::search(&mut client, &*index, &params);
assert_eq!(vec![4, 5, 2, 1], results.ids());
assert_eq!(4, results.total);

let mut params = Map::new();
params
.assign("bookmarked_talents", Value::String("2,4".into()))
.unwrap();

let results = Talent::search(&mut client, &*index, &params);
assert_eq!(vec![4, 2], results.ids());
assert_eq!(2, results.total);
}

// filtering for current_location
Expand Down Expand Up @@ -1626,6 +1680,25 @@ mod tests {
assert_eq!(vec![4, 5, 1], results.ids());
}

// ignoring contacted talents - csv parsing
{
let mut params = Map::new();
params
.assign("contacted_talents", Value::String("2,4".into()))
.unwrap();

let results = Talent::search(&mut client, &*index, &params);
assert_eq!(vec![5, 1], results.ids());

let mut params = Map::new();
params
.assign("contacted_talents", Value::String("2,5,4".into()))
.unwrap();

let results = Talent::search(&mut client, &*index, &params);
assert_eq!(vec![1], results.ids());
}

// ignoring blocked companies
{
let mut params = Map::new();
Expand Down

0 comments on commit 352c133

Please sign in to comment.