Skip to content

Commit 73bc848

Browse files
bors[bot]bidoubiwa
andauthored
Merge #455
455: Add the csv_delimiter r=bidoubiwa a=bidoubiwa As per the specification: meilisearch/specifications#223 You can now specify a `csv_delimiter` when using `add_or_replace_unchecked_payload` and `add_or_update_unchecked_payload`. If your payload is in `csv`, it is used to know how the values are separated. Co-authored-by: Charlotte Vermandel <[email protected]>
2 parents e31d875 + bd3d99f commit 73bc848

File tree

1 file changed

+53
-17
lines changed

1 file changed

+53
-17
lines changed

src/indexes.rs

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,7 @@ impl Index {
587587
/// { "id": 2, "body": "catto" }"#.as_bytes(),
588588
/// "application/x-ndjson",
589589
/// Some("id"),
590+
/// None
590591
/// ).await.unwrap();
591592
/// // Meilisearch may take some time to execute the request so we are going to wait till it's completed
592593
/// client.wait_for_task(task, None, None).await.unwrap();
@@ -604,15 +605,16 @@ impl Index {
604605
payload: T,
605606
content_type: &str,
606607
primary_key: Option<&str>,
608+
csv_delimiter: Option<&str>,
607609
) -> Result<TaskInfo, Error> {
608-
let url = if let Some(primary_key) = primary_key {
609-
format!(
610-
"{}/indexes/{}/documents?primaryKey={}",
611-
self.client.host, self.uid, primary_key
612-
)
613-
} else {
614-
format!("{}/indexes/{}/documents", self.client.host, self.uid)
615-
};
610+
let mut url = format!("{}/indexes/{}/documents?", self.client.host, self.uid);
611+
if let Some(primary_key) = primary_key {
612+
url = format!("{}primaryKey={}&", url, primary_key)
613+
}
614+
615+
if let Some(csv_delimiter) = csv_delimiter {
616+
url = format!("{}csvDelimiter={}", url, csv_delimiter)
617+
}
616618
stream_request::<(), T, TaskInfo>(
617619
&url,
618620
&self.client.api_key,
@@ -736,13 +738,14 @@ impl Index {
736738
/// # let MEILISEARCH_API_KEY = option_env!("MEILISEARCH_API_KEY").unwrap_or("masterKey");
737739
/// # futures::executor::block_on(async move {
738740
/// let client = Client::new(MEILISEARCH_URL, MEILISEARCH_API_KEY);
739-
/// let movie_index = client.index("add_or_replace_unchecked_payload");
741+
/// let movie_index = client.index("add_or_update_unchecked_payload");
740742
///
741743
/// let task = movie_index.add_or_update_unchecked_payload(
742744
/// r#"{ "id": 1, "body": "doggo" }
743745
/// { "id": 2, "body": "catto" }"#.as_bytes(),
744746
/// "application/x-ndjson",
745747
/// Some("id"),
748+
/// None
746749
/// ).await.unwrap();
747750
/// // Meilisearch may take some time to execute the request so we are going to wait till it's completed
748751
/// client.wait_for_task(task, None, None).await.unwrap();
@@ -760,15 +763,18 @@ impl Index {
760763
payload: T,
761764
content_type: &str,
762765
primary_key: Option<&str>,
766+
csv_delimiter: Option<&str>,
763767
) -> Result<TaskInfo, Error> {
764-
let url = if let Some(primary_key) = primary_key {
765-
format!(
766-
"{}/indexes/{}/documents?primaryKey={}",
767-
self.client.host, self.uid, primary_key
768-
)
769-
} else {
770-
format!("{}/indexes/{}/documents", self.client.host, self.uid)
771-
};
768+
let mut url = format!("{}/indexes/{}/documents?", self.client.host, self.uid);
769+
770+
if let Some(primary_key) = primary_key {
771+
url = format!("{}primaryKey={}&", url, primary_key)
772+
}
773+
774+
if let Some(csv_delimiter) = csv_delimiter {
775+
url = format!("{}csvDelimiter={}", url, csv_delimiter)
776+
}
777+
772778
stream_request::<(), T, TaskInfo>(
773779
&url,
774780
&self.client.api_key,
@@ -1779,6 +1785,36 @@ mod tests {
17791785
assert_eq!(res.offset, 2);
17801786
}
17811787

1788+
#[meilisearch_test]
1789+
async fn test_add_documents_in_csv_with_custom_delimiter(
1790+
client: Client,
1791+
index: Index,
1792+
) -> Result<(), Error> {
1793+
#[derive(Serialize, Deserialize, Debug)]
1794+
struct Movie {
1795+
name: String,
1796+
description: String,
1797+
}
1798+
1799+
let task = index
1800+
.add_or_replace_unchecked_payload(
1801+
r#"name;description
1802+
wonderwoman;She's incredible"#
1803+
.as_bytes(),
1804+
"text/csv",
1805+
Some("name"),
1806+
Some(";"),
1807+
)
1808+
.await
1809+
.unwrap();
1810+
1811+
client.wait_for_task(task, None, None).await.unwrap();
1812+
let movies = index.get_documents::<Movie>().await.unwrap();
1813+
1814+
assert_eq!(movies.results.len(), 1);
1815+
Ok(())
1816+
}
1817+
17821818
#[meilisearch_test]
17831819
async fn test_get_one_task(client: Client, index: Index) -> Result<(), Error> {
17841820
let task = index

0 commit comments

Comments
 (0)