Merge pull request #747 from MarinPostma/facets-settings-subroutes

Facets settings subroutes
This commit is contained in:
Clément Renault 2020-06-03 13:45:40 +02:00 committed by GitHub
commit b2877b3549
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 117 additions and 11 deletions

View File

@ -25,7 +25,10 @@ pub fn services(cfg: &mut web::ServiceConfig) {
.service(update_displayed) .service(update_displayed)
.service(delete_displayed) .service(delete_displayed)
.service(get_accept_new_fields) .service(get_accept_new_fields)
.service(update_accept_new_fields); .service(update_accept_new_fields)
.service(get_attributes_for_faceting)
.service(delete_attributes_for_faceting)
.service(update_attributes_for_faceting);
} }
#[post("/indexes/{index_uid}/settings", wrap = "Authentication::Private")] #[post("/indexes/{index_uid}/settings", wrap = "Authentication::Private")]
@ -92,15 +95,17 @@ async fn get_all(
let attributes_for_faceting = match (&schema, &index.main.attributes_for_faceting(&reader)?) { let attributes_for_faceting = match (&schema, &index.main.attributes_for_faceting(&reader)?) {
(Some(schema), Some(attrs)) => { (Some(schema), Some(attrs)) => {
Some(attrs attrs
.iter() .iter()
.filter_map(|&id| schema .name(id)) .filter_map(|&id| schema.name(id))
.map(str::to_string) .map(str::to_string)
.collect()) .collect()
} }
_ => None, _ => vec![],
}; };
println!("{:?}", attributes_for_faceting);
let searchable_attributes = schema.clone().map(|s| { let searchable_attributes = schema.clone().map(|s| {
s.indexed_name() s.indexed_name()
.iter() .iter()
@ -125,7 +130,7 @@ async fn get_all(
stop_words: Some(Some(stop_words)), stop_words: Some(Some(stop_words)),
synonyms: Some(Some(synonyms)), synonyms: Some(Some(synonyms)),
accept_new_fields: Some(accept_new_fields), accept_new_fields: Some(accept_new_fields),
attributes_for_faceting: Some(attributes_for_faceting), attributes_for_faceting: Some(Some(attributes_for_faceting)),
}; };
Ok(HttpResponse::Ok().json(settings)) Ok(HttpResponse::Ok().json(settings))
@ -481,3 +486,85 @@ async fn update_accept_new_fields(
Ok(HttpResponse::Accepted().json(IndexUpdateResponse::with_id(update_id))) Ok(HttpResponse::Accepted().json(IndexUpdateResponse::with_id(update_id)))
} }
#[get(
"/indexes/{index_uid}/settings/attributes-for-faceting",
wrap = "Authentication::Private"
)]
async fn get_attributes_for_faceting(
data: web::Data<Data>,
path: web::Path<IndexParam>,
) -> Result<HttpResponse, ResponseError> {
let index = data
.db
.open_index(&path.index_uid)
.ok_or(Error::index_not_found(&path.index_uid))?;
let attributes_for_faceting = data
.db
.main_read::<_, _, ResponseError>(|reader| {
let schema = index.main.schema(reader)?;
let attrs = index.main.attributes_for_faceting(reader)?;
let attr_names = match (&schema, &attrs) {
(Some(schema), Some(attrs)) => {
attrs
.iter()
.filter_map(|&id| schema.name(id))
.map(str::to_string)
.collect()
}
_ => vec![]
};
Ok(attr_names)
})?;
Ok(HttpResponse::Ok().json(attributes_for_faceting))
}
#[post(
"/indexes/{index_uid}/settings/attributes-for-faceting",
wrap = "Authentication::Private"
)]
async fn update_attributes_for_faceting(
data: web::Data<Data>,
path: web::Path<IndexParam>,
body: web::Json<Option<Vec<String>>>,
) -> Result<HttpResponse, ResponseError> {
let index = data
.db
.open_index(&path.index_uid)
.ok_or(Error::index_not_found(&path.index_uid))?;
let settings = Settings {
attributes_for_faceting: Some(body.into_inner()),
..Settings::default()
};
let settings = settings.into_update().map_err(Error::bad_request)?;
let update_id = data.db.update_write(|w| index.settings_update(w, settings))?;
Ok(HttpResponse::Accepted().json(IndexUpdateResponse::with_id(update_id)))
}
#[delete(
"/indexes/{index_uid}/settings/attributes-for-faceting",
wrap = "Authentication::Private"
)]
async fn delete_attributes_for_faceting(
data: web::Data<Data>,
path: web::Path<IndexParam>,
) -> Result<HttpResponse, ResponseError> {
let index = data
.db
.open_index(&path.index_uid)
.ok_or(Error::index_not_found(&path.index_uid))?;
let settings = SettingsUpdate {
attributes_for_faceting: UpdateState::Clear,
..SettingsUpdate::default()
};
let update_id = data.db.update_write(|w| index.settings_update(w, settings))?;
Ok(HttpResponse::Accepted().json(IndexUpdateResponse::with_id(update_id)))
}

View File

@ -120,7 +120,7 @@ async fn write_all_and_delete() {
], ],
"stopWords": [], "stopWords": [],
"synonyms": {}, "synonyms": {},
"attributesForFaceting": null, "attributesForFaceting": [],
"acceptNewFields": true, "acceptNewFields": true,
}); });
@ -282,7 +282,7 @@ async fn test_default_settings() {
"displayedAttributes": [], "displayedAttributes": [],
"stopWords": [], "stopWords": [],
"synonyms": {}, "synonyms": {},
"attributesForFaceting": null, "attributesForFaceting": [],
"acceptNewFields": true, "acceptNewFields": true,
}); });
@ -320,7 +320,7 @@ async fn test_default_settings_2() {
], ],
"stopWords": [], "stopWords": [],
"synonyms": {}, "synonyms": {},
"attributesForFaceting": null, "attributesForFaceting": [],
"acceptNewFields": true, "acceptNewFields": true,
}); });
@ -428,7 +428,7 @@ async fn write_setting_and_update_partial() {
"wolverine": ["xmen", "logan"], "wolverine": ["xmen", "logan"],
"logan": ["wolverine"], "logan": ["wolverine"],
}, },
"attributesForFaceting": null, "attributesForFaceting": [],
"acceptNewFields": false, "acceptNewFields": false,
}); });
@ -436,3 +436,22 @@ async fn write_setting_and_update_partial() {
assert_json_eq!(expected, response, ordered: false); assert_json_eq!(expected, response, ordered: false);
} }
#[actix_rt::test]
async fn attributes_for_faceting_settings() {
let mut server = common::Server::test_server().await;
// initial attributes array should be empty
let (response, _status_code) = server.get_request("/indexes/test/settings/attributes-for-faceting").await;
assert_eq!(response, json!([]));
// add an attribute and test for its presence
let (_response, _status_code) = server.post_request_async(
"/indexes/test/settings/attributes-for-faceting",
json!(["foobar"])).await;
let (response, _status_code) = server.get_request("/indexes/test/settings/attributes-for-faceting").await;
assert_eq!(response, json!(["foobar"]));
// remove all attributes and test for emptiness
let (_response, _status_code) = server.delete_request_async(
"/indexes/test/settings/attributes-for-faceting").await;
let (response, _status_code) = server.get_request("/indexes/test/settings/attributes-for-faceting").await;
assert_eq!(response, json!([]));
}

View File

@ -341,7 +341,7 @@ async fn accept_new_fields_does_not_take_into_account_the_primary_key() {
"displayedAttributes": ["title"], "displayedAttributes": ["title"],
"stopWords": [], "stopWords": [],
"synonyms": {}, "synonyms": {},
"attributesForFaceting": null, "attributesForFaceting": [],
"acceptNewFields": false, "acceptNewFields": false,
}); });