rename identifier into primaryKey; fix #514

This commit is contained in:
qdequele 2020-03-09 18:40:49 +01:00
parent 8ffa80883a
commit c984d8d5a5
No known key found for this signature in database
GPG key ID: B3F0A000EBF11745
24 changed files with 142 additions and 142 deletions

View file

@ -13,7 +13,7 @@ pub trait RequestExt {
fn is_allowed(&self, acl: ACL) -> SResult<()>;
fn url_param(&self, name: &str) -> SResult<String>;
fn index(&self) -> SResult<Index>;
fn identifier(&self) -> SResult<String>;
fn document_id(&self) -> SResult<String>;
}
impl RequestExt for Request<Data> {
@ -55,7 +55,7 @@ impl RequestExt for Request<Data> {
fn url_param(&self, name: &str) -> SResult<String> {
let param = self
.param::<String>(name)
.map_err(|_| ResponseError::bad_parameter("identifier", name))?;
.map_err(|e| ResponseError::bad_parameter(name, e))?;
Ok(param)
}
@ -69,10 +69,10 @@ impl RequestExt for Request<Data> {
Ok(index)
}
fn identifier(&self) -> SResult<String> {
fn document_id(&self) -> SResult<String> {
let name = self
.param::<String>("identifier")
.map_err(|_| ResponseError::bad_parameter("identifier", "identifier"))?;
.param::<String>("documentId")
.map_err(|_| ResponseError::bad_parameter("documentId", "primaryKey"))?;
Ok(name)
}

View file

@ -15,18 +15,18 @@ pub async fn get_document(ctx: Request<Data>) -> SResult<Response> {
let index = ctx.index()?;
let identifier = ctx.identifier()?;
let document_id = meilisearch_core::serde::compute_document_id(identifier.clone());
let original_document_id = ctx.document_id()?;
let document_id = meilisearch_core::serde::compute_document_id(original_document_id.clone());
let db = &ctx.state().db;
let reader = db.main_read_txn()?;
let response = index
.document::<IndexMap<String, Value>>(&reader, None, document_id)?
.ok_or(ResponseError::document_not_found(&identifier))?;
.ok_or(ResponseError::document_not_found(&original_document_id))?;
if response.is_empty() {
return Err(ResponseError::document_not_found(identifier));
return Err(ResponseError::document_not_found(&original_document_id));
}
Ok(tide::Response::new(200).body_json(&response)?)
@ -42,8 +42,8 @@ pub async fn delete_document(ctx: Request<Data>) -> SResult<Response> {
ctx.is_allowed(Private)?;
let index = ctx.index()?;
let identifier = ctx.identifier()?;
let document_id = meilisearch_core::serde::compute_document_id(identifier);
let document_id = ctx.document_id()?;
let document_id = meilisearch_core::serde::compute_document_id(document_id);
let db = &ctx.state().db;
let mut update_writer = db.update_write_txn()?;
let mut documents_deletion = index.documents_deletion();
@ -108,7 +108,7 @@ pub async fn get_all_documents(ctx: Request<Data>) -> SResult<Response> {
Ok(tide::Response::new(200).body_json(&response_body)?)
}
fn find_identifier(document: &IndexMap<String, Value>) -> Option<String> {
fn find_primary_key(document: &IndexMap<String, Value>) -> Option<String> {
for key in document.keys() {
if key.to_lowercase().contains("id") {
return Some(key.to_string());
@ -120,7 +120,7 @@ fn find_identifier(document: &IndexMap<String, Value>) -> Option<String> {
#[derive(Default, Deserialize)]
#[serde(deny_unknown_fields)]
struct UpdateDocumentsQuery {
identifier: Option<String>,
document_id: Option<String>,
}
async fn update_multiple_documents(mut ctx: Request<Data>, is_partial: bool) -> SResult<Response> {
@ -137,16 +137,16 @@ async fn update_multiple_documents(mut ctx: Request<Data>, is_partial: bool) ->
let reader = db.main_read_txn()?;
let mut schema = index.main.schema(&reader)?.ok_or(ResponseError::internal("schema not found"))?;
if schema.identifier().is_none() {
let id = match query.identifier {
if schema.primary_key().is_none() {
let id = match query.document_id {
Some(id) => id,
None => match data.first().and_then(|docs| find_identifier(docs)) {
None => match data.first().and_then(|docs| find_primary_key(docs)) {
Some(id) => id,
None => return Err(ResponseError::bad_request("Could not infer a schema")),
},
};
if schema.set_identifier(&id).is_ok() {
if schema.set_primary_key(&id).is_ok() {
let mut writer = db.main_write_txn()?;
index.main.put_schema(&mut writer, &schema)?;
writer.commit()?;
@ -190,10 +190,10 @@ pub async fn delete_multiple_documents(mut ctx: Request<Data>) -> SResult<Respon
let mut documents_deletion = index.documents_deletion();
for identifier in data {
if let Some(identifier) = meilisearch_core::serde::value_to_string(&identifier) {
for document_id in data {
if let Some(document_id) = meilisearch_core::serde::value_to_string(&document_id) {
documents_deletion
.delete_document_by_id(meilisearch_core::serde::compute_document_id(identifier));
.delete_document_by_id(meilisearch_core::serde::compute_document_id(document_id));
}
}

View file

@ -39,9 +39,9 @@ pub async fn list_indexes(ctx: Request<Data>) -> SResult<Response> {
let created_at = index.main.created_at(&reader)?.into_internal_error()?;
let updated_at = index.main.updated_at(&reader)?.into_internal_error()?;
let identifier = match index.main.schema(&reader) {
Ok(Some(schema)) => match schema.identifier() {
Some(identifier) => Some(identifier.to_owned()),
let primary_key = match index.main.schema(&reader) {
Ok(Some(schema)) => match schema.primary_key() {
Some(primary_key) => Some(primary_key.to_owned()),
None => None
},
_ => None,
@ -52,7 +52,7 @@ pub async fn list_indexes(ctx: Request<Data>) -> SResult<Response> {
uid: index_uid,
created_at,
updated_at,
identifier,
primary_key,
};
response_body.push(index_response);
}
@ -73,7 +73,7 @@ struct IndexResponse {
uid: String,
created_at: DateTime<Utc>,
updated_at: DateTime<Utc>,
identifier: Option<String>,
primary_key: Option<String>,
}
pub async fn get_index(ctx: Request<Data>) -> SResult<Response> {
@ -89,9 +89,9 @@ pub async fn get_index(ctx: Request<Data>) -> SResult<Response> {
let created_at = index.main.created_at(&reader)?.into_internal_error()?;
let updated_at = index.main.updated_at(&reader)?.into_internal_error()?;
let identifier = match index.main.schema(&reader) {
Ok(Some(schema)) => match schema.identifier() {
Some(identifier) => Some(identifier.to_owned()),
let primary_key = match index.main.schema(&reader) {
Ok(Some(schema)) => match schema.primary_key() {
Some(primary_key) => Some(primary_key.to_owned()),
None => None
},
_ => None,
@ -102,7 +102,7 @@ pub async fn get_index(ctx: Request<Data>) -> SResult<Response> {
uid,
created_at,
updated_at,
identifier,
primary_key,
};
Ok(tide::Response::new(200).body_json(&response_body)?)
@ -113,7 +113,7 @@ pub async fn get_index(ctx: Request<Data>) -> SResult<Response> {
struct IndexCreateRequest {
name: Option<String>,
uid: Option<String>,
identifier: Option<String>,
primary_key: Option<String>,
}
#[derive(Debug, Serialize)]
@ -123,7 +123,7 @@ struct IndexCreateResponse {
uid: String,
created_at: DateTime<Utc>,
updated_at: DateTime<Utc>,
identifier: Option<String>,
primary_key: Option<String>,
}
pub async fn create_index(mut ctx: Request<Data>) -> SResult<Response> {
@ -175,9 +175,9 @@ pub async fn create_index(mut ctx: Request<Data>) -> SResult<Response> {
.updated_at(&writer)?
.into_internal_error()?;
if let Some(id) = body.identifier.clone() {
if let Some(id) = body.primary_key.clone() {
if let Some(mut schema) = created_index.main.schema(&mut writer)? {
if let Ok(_) = schema.set_identifier(&id) {
if let Ok(_) = schema.set_primary_key(&id) {
created_index.main.put_schema(&mut writer, &schema)?;
}
}
@ -190,7 +190,7 @@ pub async fn create_index(mut ctx: Request<Data>) -> SResult<Response> {
uid,
created_at,
updated_at,
identifier: body.identifier,
primary_key: body.primary_key,
};
Ok(tide::Response::new(201).body_json(&response_body)?)
@ -200,7 +200,7 @@ pub async fn create_index(mut ctx: Request<Data>) -> SResult<Response> {
#[serde(rename_all = "camelCase", deny_unknown_fields)]
struct UpdateIndexRequest {
name: Option<String>,
identifier: Option<String>,
primary_key: Option<String>,
}
#[derive(Debug, Serialize)]
@ -210,7 +210,7 @@ struct UpdateIndexResponse {
uid: String,
created_at: DateTime<Utc>,
updated_at: DateTime<Utc>,
identifier: Option<String>,
primary_key: Option<String>,
}
pub async fn update_index(mut ctx: Request<Data>) -> SResult<Response> {
@ -231,14 +231,14 @@ pub async fn update_index(mut ctx: Request<Data>) -> SResult<Response> {
index.main.put_name(&mut writer, &name)?;
}
if let Some(id) = body.identifier.clone() {
if let Some(id) = body.primary_key.clone() {
if let Some(mut schema) = index.main.schema(&mut writer)? {
match schema.identifier() {
match schema.primary_key() {
Some(_) => {
return Err(ResponseError::bad_request("The index identifier cannot be updated"));
return Err(ResponseError::bad_request("The index primary key cannot be updated"));
},
None => {
if let Ok(_) = schema.set_identifier(&id) {
if let Ok(_) = schema.set_primary_key(&id) {
index.main.put_schema(&mut writer, &schema)?;
}
}
@ -254,11 +254,11 @@ pub async fn update_index(mut ctx: Request<Data>) -> SResult<Response> {
let created_at = index.main.created_at(&reader)?.into_internal_error()?;
let updated_at = index.main.updated_at(&reader)?.into_internal_error()?;
let identifier = match index.main.schema(&reader) {
let primary_key = match index.main.schema(&reader) {
Ok(Some(schema)) => {
match schema.identifier() {
Some(identifier) => {
Some(identifier.to_owned())
match schema.primary_key() {
Some(primary_key) => {
Some(primary_key.to_owned())
},
None => None
}
@ -272,7 +272,7 @@ pub async fn update_index(mut ctx: Request<Data>) -> SResult<Response> {
uid: index_uid,
created_at,
updated_at,
identifier,
primary_key,
};
Ok(tide::Response::new(200).body_json(&response_body)?)

View file

@ -61,7 +61,7 @@ pub fn load_routes(app: &mut tide::Server<Data>) {
.put(|ctx| into_response(document::add_or_update_multiple_documents(ctx)))
.delete(|ctx| into_response(document::clear_all_documents(ctx)));
app.at("/indexes/:index/documents/:identifier")
app.at("/indexes/:index/documents/:document_id")
.get(|ctx| into_response(document::get_document(ctx)))
.delete(|ctx| into_response(document::delete_document(ctx)));

View file

@ -81,7 +81,7 @@ pub async fn get_all(ctx: Request<Data>) -> SResult<Response> {
pub struct UpdateSettings {
pub ranking_rules: Option<Vec<String>>,
pub distinct_attribute: Option<String>,
pub identifier: Option<String>,
pub primary_key: Option<String>,
pub searchable_attributes: Option<Vec<String>>,
pub displayed_attributes: Option<HashSet<String>>,
pub stop_words: Option<BTreeSet<String>>,
@ -124,7 +124,7 @@ pub async fn delete_all(ctx: Request<Data>) -> SResult<Response> {
let settings = SettingsUpdate {
ranking_rules: UpdateState::Clear,
distinct_attribute: UpdateState::Clear,
identifier: UpdateState::Clear,
primary_key: UpdateState::Clear,
searchable_attributes: UpdateState::Clear,
displayed_attributes: UpdateState::Clear,
stop_words: UpdateState::Clear,

View file

@ -285,8 +285,8 @@ impl Server {
self.delete_request_async(&url)
}
pub fn get_identifier(&mut self) -> (Value, StatusCode) {
let url = format!("/indexes/{}/settings/identifier", self.uid);
pub fn get_primary_key(&mut self) -> (Value, StatusCode) {
let url = format!("/indexes/{}/settings/primary_key", self.uid);
self.get_request(&url)
}
@ -394,7 +394,7 @@ impl Server {
pub fn populate_movies(&mut self) {
let body = json!({
"uid": "movies",
"identifier": "id",
"primaryKey": "id",
});
self.create_index(body);

View file

@ -417,14 +417,14 @@ fn create_index_failed() {
// Resolve issue https://github.com/meilisearch/MeiliSearch/issues/492
#[test]
fn create_index_with_identifier_and_index() {
fn create_index_with_primary_key_and_index() {
let mut server = common::Server::with_uid("movies");
// 1 - Create the index
let body = json!({
"uid": "movies",
"identifier": "id",
"primaryKey": "id",
});
let (_response, status_code) = server.create_index(body);
@ -512,84 +512,84 @@ fn create_index_with_invalid_uid() {
assert_eq!(message, "Index must have a valid uid; Index uid can be of type integer or string only composed of alphanumeric characters, hyphens (-) and underscores (_).");
}
// Test that it's possible to add identifier if it's not already set on index creation
// Test that it's possible to add primary_key if it's not already set on index creation
#[test]
fn create_index_and_add_indentifier_after() {
let mut server = common::Server::with_uid("movies");
// 1 - Create the index with no identifier
// 1 - Create the index with no primary_key
let body = json!({
"uid": "movies",
});
let (response, status_code) = server.create_index(body);
assert_eq!(status_code, 201);
assert_eq!(response["identifier"], json!(null));
assert_eq!(response["primaryKey"], json!(null));
// 2 - Update the index and add an identifier.
// 2 - Update the index and add an primary_key.
let body = json!({
"identifier": "id",
"primaryKey": "id",
});
let (response, status_code) = server.update_index(body);
assert_eq!(status_code, 200);
eprintln!("response: {:#?}", response);
assert_eq!(response["identifier"].as_str().unwrap(), "id");
assert_eq!(response["primaryKey"].as_str().unwrap(), "id");
// 3 - Get index to verify if the identifier is good
// 3 - Get index to verify if the primary_key is good
let (response, status_code) = server.get_index();
assert_eq!(status_code, 200);
assert_eq!(response["identifier"].as_str().unwrap(), "id");
assert_eq!(response["primaryKey"].as_str().unwrap(), "id");
}
// Test that it's impossible to change the identifier
// Test that it's impossible to change the primary_key
#[test]
fn create_index_and_update_indentifier_after() {
let mut server = common::Server::with_uid("movies");
// 1 - Create the index with no identifier
// 1 - Create the index with no primary_key
let body = json!({
"uid": "movies",
"identifier": "id",
"primaryKey": "id",
});
let (response, status_code) = server.create_index(body);
assert_eq!(status_code, 201);
assert_eq!(response["identifier"].as_str().unwrap(), "id");
assert_eq!(response["primaryKey"].as_str().unwrap(), "id");
// 2 - Update the index and add an identifier.
// 2 - Update the index and add an primary_key.
let body = json!({
"identifier": "skuid",
"primaryKey": "skuid",
});
let (_response, status_code) = server.update_index(body);
assert_eq!(status_code, 400);
// 3 - Get index to verify if the identifier still the first one
// 3 - Get index to verify if the primary_key still the first one
let (response, status_code) = server.get_index();
assert_eq!(status_code, 200);
assert_eq!(response["identifier"].as_str().unwrap(), "id");
assert_eq!(response["primaryKey"].as_str().unwrap(), "id");
}
// Test that schema inference work well
#[test]
fn create_index_without_identifier_and_add_document() {
fn create_index_without_primary_key_and_add_document() {
let mut server = common::Server::with_uid("movies");
// 1 - Create the index with no identifier
// 1 - Create the index with no primary_key
let body = json!({
"uid": "movies",
});
let (response, status_code) = server.create_index(body);
assert_eq!(status_code, 201);
assert_eq!(response["identifier"], json!(null));
assert_eq!(response["primaryKey"], json!(null));
// 2 - Add a document
@ -600,27 +600,27 @@ fn create_index_without_identifier_and_add_document() {
server.add_or_update_multiple_documents(body);
// 3 - Get index to verify if the identifier is good
// 3 - Get index to verify if the primary_key is good
let (response, status_code) = server.get_index();
assert_eq!(status_code, 200);
assert_eq!(response["identifier"].as_str().unwrap(), "id");
assert_eq!(response["primaryKey"].as_str().unwrap(), "id");
}
// Test search with no identifier
// Test search with no primary_key
#[test]
fn create_index_without_identifier_and_search() {
fn create_index_without_primary_key_and_search() {
let mut server = common::Server::with_uid("movies");
// 1 - Create the index with no identifier
// 1 - Create the index with no primary_key
let body = json!({
"uid": "movies",
});
let (response, status_code) = server.create_index(body);
assert_eq!(status_code, 201);
assert_eq!(response["identifier"], json!(null));
assert_eq!(response["primaryKey"], json!(null));
// 2 - Search

View file

@ -644,7 +644,7 @@ fn search_with_settings_basic() {
"desc(vote_average)"
],
"distinctAttribute": null,
"identifier": "id",
"primaryKey": "id",
"searchableAttributes": [
"title",
"tagline",
@ -751,7 +751,7 @@ fn search_with_settings_stop_words() {
"desc(vote_average)"
],
"distinctAttribute": null,
"identifier": "id",
"primaryKey": "id",
"searchableAttributes": [
"title",
"tagline",
@ -858,7 +858,7 @@ fn search_with_settings_synonyms() {
"desc(vote_average)"
],
"distinctAttribute": null,
"identifier": "id",
"primaryKey": "id",
"searchableAttributes": [
"title",
"tagline",
@ -970,7 +970,7 @@ fn search_with_settings_ranking_rules() {
"desc(popularity)"
],
"distinctAttribute": null,
"identifier": "id",
"primaryKey": "id",
"searchableAttributes": [
"title",
"tagline",
@ -1077,7 +1077,7 @@ fn search_with_settings_searchable_attributes() {
"desc(vote_average)"
],
"distinctAttribute": null,
"identifier": "id",
"primaryKey": "id",
"searchableAttributes": [
"tagline",
"overview",
@ -1183,7 +1183,7 @@ fn search_with_settings_displayed_attributes() {
"desc(vote_average)"
],
"distinctAttribute": null,
"identifier": "id",
"primaryKey": "id",
"searchableAttributes": [
"title",
"tagline",
@ -1254,7 +1254,7 @@ fn search_with_settings_searchable_attributes_2() {
"desc(vote_average)"
],
"distinctAttribute": null,
"identifier": "id",
"primaryKey": "id",
"searchableAttributes": [
"tagline",
"overview",

View file

@ -291,7 +291,7 @@ fn test_default_settings_2() {
let mut server = common::Server::with_uid("movies");
let body = json!({
"uid": "movies",
"identifier": "id",
"primaryKey": "id",
});
server.create_index(body);

View file

@ -8,7 +8,7 @@ fn index_new_fields_default() {
let mut server = common::Server::with_uid("movies");
let body = json!({
"uid": "movies",
"identifier": "id",
"primaryKey": "id",
});
server.create_index(body);
@ -60,7 +60,7 @@ fn index_new_fields_true() {
let mut server = common::Server::with_uid("movies");
let body = json!({
"uid": "movies",
"identifier": "id",
"primaryKey": "id",
});
server.create_index(body);
@ -116,7 +116,7 @@ fn index_new_fields_false() {
let mut server = common::Server::with_uid("movies");
let body = json!({
"uid": "movies",
"identifier": "id",
"primaryKey": "id",
});
server.create_index(body);
@ -169,7 +169,7 @@ fn index_new_fields_true_then_false() {
let mut server = common::Server::with_uid("movies");
let body = json!({
"uid": "movies",
"identifier": "id",
"primaryKey": "id",
});
server.create_index(body);
@ -228,7 +228,7 @@ fn index_new_fields_false_then_true() {
let mut server = common::Server::with_uid("movies");
let body = json!({
"uid": "movies",
"identifier": "id",
"primaryKey": "id",
});
server.create_index(body);

View file

@ -111,7 +111,7 @@ fn send_undefined_rule() {
let mut server = common::Server::with_uid("movies");
let body = json!({
"uid": "movies",
"identifier": "id",
"primaryKey": "id",
});
server.create_index(body);
@ -128,7 +128,7 @@ fn send_malformed_custom_rule() {
let mut server = common::Server::with_uid("movies");
let body = json!({
"uid": "movies",
"identifier": "id",
"primaryKey": "id",
});
server.create_index(body);

View file

@ -8,7 +8,7 @@ fn update_stop_words() {
let mut server = common::Server::with_uid("movies");
let body = json!({
"uid": "movies",
"identifier": "id",
"primaryKey": "id",
});
server.create_index(body);