wip es search predicates

This commit is contained in:
Brandon Thomas committed 2024-06-30 20:14:04 -04:00
1 parent 38619270ef
commit 10b8e29b56
3 files changed
+112 -27

No files matched your search

@@ -6,3 +6,8 @@
select username from users where maybe_feature_flags like '%studio%';
select username from users where can_access_studio = true;
-- Who signed up recently and has access?
select username, maybe_source
from users where can_access_studio = true
and created_at > NOW() - interval 20 minute;
@@ -1,6 +1,10 @@
use std::collections::HashSet;
use once_cell::sync::Lazy;
use serde_json::{json, Value};
use enums::by_table::media_files::media_file_class::MediaFileClass;
use enums::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums::by_table::media_files::media_file_type::MediaFileType;
use errors::AnyhowResult;
static JSON_QUERY : Lazy<Value> = Lazy::new(|| {
const QUERY_TEMPLATE : &str = include_str!("../../../../../_elasticsearch/searches/media_files/search.json");
@@ -8,45 +12,121 @@ static JSON_QUERY : Lazy<Value> = Lazy::new(|| {
let json : Value = serde_json::from_str(QUERY_TEMPLATE)
.expect("json should parse");
// Replace this with an empty list so that we can attach predicates later.
let json= jsonpath_lib::replace_with(json, "$.query.bool.must[0].bool.must", &mut |_| {
//Some(json!([]))
None
}).expect("json node should delete");
json
});
pub struct SearchArgs {
pub maybe_media_classes: Option<HashSet<MediaFileClass>>,
pub maybe_media_types: Option<HashSet<MediaFileType>>,
pub maybe_engine_categories: Option<HashSet<MediaFileEngineCategory>>,
}
pub fn search() {
pub fn search_media_files(args: SearchArgs) -> AnyhowResult<()> {
}
fn build_query(args: SearchArgs) -> AnyhowResult<Value> {
let query = JSON_QUERY.clone();
println!("{}", query);
let query = jsonpath_lib::replace_with(query, "$.query.bool.must[0].bool.must", &mut |_| {
let mut predicates = vec![
must_be_not_deleted(),
];
let mut must_node = jsonpath_lib::select(
&query,
"$.query.bool.must[0].bool.must").expect("json node should exist");
println!("{:?}", must_node);
let new_node = json!({
"match": {
"media_file_id": "1234"
if let Some(media_classes) = &args.maybe_media_classes {
predicates.push(media_classes_predicate(media_classes));
}
});
must_node.push(&new_node);
if let Some(media_types) = &args.maybe_media_types {
predicates.push(media_types_predicate(media_types));
}
println!("{:?}", must_node);
if let Some(engine_categories) = &args.maybe_engine_categories {
predicates.push(engine_categories_predicate(engine_categories));
}
println!("{}", query);
Some(json!(predicates))
})?;
println!("QUERY: {}", query);
Ok(query)
}
fn must_be_not_deleted() -> Value {
json!({
"term": {
"is_deleted": false,
}
})
}
fn media_classes_predicate(media_classes: &HashSet<MediaFileClass>) -> Value {
let predicates : Vec<Value> = media_classes.iter()
.map(|media_type| {
json!({
"term": {
"media_class": media_type.to_str(),
}
})
})
.collect();
json!({
"bool": {
"should": predicates,
}
})
}
fn media_types_predicate(media_types: &HashSet<MediaFileType>) -> Value {
let predicates : Vec<Value> = media_types.iter()
.map(|media_type| {
json!({
"term": {
"media_type": media_type.to_str(),
}
})
})
.collect();
json!({
"bool": {
"should": predicates,
}
})
}
fn engine_categories_predicate(engine_categories: &HashSet<MediaFileEngineCategory>) -> Value {
let predicates : Vec<Value> = engine_categories.iter()
.map(|engine_category| {
json!({
"term": {
"maybe_engine_category": engine_category.to_str(),
}
})
})
.collect();
json!({
"bool": {
"should": predicates,
}
})
}
#[cfg(test)]
mod tests {
use crate::searches::search_media_files::SearchArgs;
#[test]
fn test() {
super::search();
super::search_media_files(SearchArgs {
maybe_media_classes: None,
maybe_media_types: None,
maybe_engine_categories: None,
}).expect("should function");
assert_eq!(1, 2);
}
}
@@ -263,10 +263,10 @@ pub async fn create_account_handler(
})?;
// NB: Enroll new users in studio for a while.
enroll_in_studio(&new_user_data.user_token, &ip_address, &mysql_pool).await
.map_err(|e| {
warn!("error enrolling in studio: {:?}", e);
}).ok();
//enroll_in_studio(&new_user_data.user_token, &ip_address, &mysql_pool).await
// .map_err(|e| {
// warn!("error enrolling in studio: {:?}", e);
// }).ok();
let session_token = UserSessionToken::new_from_str(&session_token);