in components/suggest/src/yelp.rs [275:340]
fn find_subject<'a>(
&self,
query_words: &'a [&'a str],
) -> Result<Option<(String, bool, &'a [&'a str])>> {
if query_words.is_empty() {
return Ok(None);
}
let mut query_string = query_words.join(" ");
// This checks if keyword is a substring of the query.
if let Some(keyword_lowercase) = self.conn.try_query_one::<String, _>(
"SELECT keyword
FROM yelp_subjects
WHERE :query BETWEEN keyword AND keyword || ' ' || x'FFFF'
ORDER BY LENGTH(keyword) ASC, keyword ASC
LIMIT 1",
named_params! {
":query": query_string.to_lowercase(),
},
true,
)? {
// Preserve the query as the user typed it including its case.
return Ok(query_string.get(0..keyword_lowercase.len()).map(|keyword| {
let count = keyword.split_whitespace().count();
(
keyword.to_string(),
true,
query_words.get(count..).unwrap_or_default(),
)
}));
};
if query_string.len() < SUBJECT_PREFIX_MATCH_THRESHOLD {
return Ok(None);
}
// Oppositely, this checks if the query is a substring of keyword.
if let Some(keyword_lowercase) = self.conn.try_query_one::<String, _>(
"SELECT keyword
FROM yelp_subjects
WHERE keyword BETWEEN :query AND :query || x'FFFF'
ORDER BY LENGTH(keyword) ASC, keyword ASC
LIMIT 1",
named_params! {
":query": query_string.to_lowercase(),
},
true,
)? {
// Preserve the query as the user typed it including its case.
return Ok(keyword_lowercase
.get(query_string.len()..)
.map(|keyword_rest| {
query_string.push_str(keyword_rest);
let count =
std::cmp::min(query_words.len(), query_string.split_whitespace().count());
(
query_string,
false,
query_words.get(count..).unwrap_or_default(),
)
}));
};
Ok(None)
}