diff --git a/.code-samples.meilisearch.yaml b/.code-samples.meilisearch.yaml index 84cb2abb..271e7969 100644 --- a/.code-samples.meilisearch.yaml +++ b/.code-samples.meilisearch.yaml @@ -847,3 +847,8 @@ update_localized_attribute_settings_1: |- ); reset_localized_attribute_settings_1: |- client.index("INDEX_NAME").resetLocalizedAttributesSettings(); +export_post_1: |- + Map indexes = new HashMap<>(); + indexes.put("*", ExportIndexFilter.builder().overrideSettings(true).build()); + ExportRequest request = ExportRequest.builder().url("TARGET_INSTANCE_URL").indexes(indexes).build(); + client.export(request); diff --git a/src/main/java/com/meilisearch/sdk/Client.java b/src/main/java/com/meilisearch/sdk/Client.java index ba081013..3a871eb8 100644 --- a/src/main/java/com/meilisearch/sdk/Client.java +++ b/src/main/java/com/meilisearch/sdk/Client.java @@ -218,6 +218,18 @@ public TaskInfo createSnapshot() throws MeilisearchException { return config.httpClient.post("/snapshots", "", TaskInfo.class); } + /** + * Triggers the export of documents between Meilisearch instances. + * + * @param request Export request parameters + * @return Meilisearch API response as TaskInfo + * @throws MeilisearchException if an error occurs + * @see API specification + */ + public TaskInfo export(ExportRequest request) throws MeilisearchException { + return config.httpClient.post("/export", request, TaskInfo.class); + } + /** * Gets the status and availability of a Meilisearch instance * diff --git a/src/main/java/com/meilisearch/sdk/ExportIndexFilter.java b/src/main/java/com/meilisearch/sdk/ExportIndexFilter.java new file mode 100644 index 00000000..cf0caafa --- /dev/null +++ b/src/main/java/com/meilisearch/sdk/ExportIndexFilter.java @@ -0,0 +1,32 @@ +package com.meilisearch.sdk; + +import lombok.*; +import org.json.JSONObject; + +@Builder +@AllArgsConstructor(access = AccessLevel.PACKAGE) +@NoArgsConstructor(access = AccessLevel.PACKAGE) +@Getter +@Setter +public class ExportIndexFilter { + private String filter; + @Builder.Default private boolean overrideSettings = false; + + /** + * Method that returns the JSON String of the ExportIndexFilter + * + * @return JSON String of the ExportIndexFilter query + */ + @Override + public String toString() { + JSONObject jsonObject = new JSONObject(); + if (this.filter != null) { + jsonObject.put("filter", this.filter); + } + if (this.overrideSettings) { + jsonObject.put("overrideSettings", true); + } + + return jsonObject.toString(); + } +} diff --git a/src/main/java/com/meilisearch/sdk/ExportRequest.java b/src/main/java/com/meilisearch/sdk/ExportRequest.java new file mode 100644 index 00000000..dfd56d28 --- /dev/null +++ b/src/main/java/com/meilisearch/sdk/ExportRequest.java @@ -0,0 +1,33 @@ +package com.meilisearch.sdk; + +import java.util.Map; +import lombok.*; +import org.json.JSONObject; + +@Builder +@AllArgsConstructor(access = AccessLevel.PACKAGE) +@NoArgsConstructor(access = AccessLevel.PACKAGE) +@Getter +@Setter +public class ExportRequest { + private String url; + private String apiKey; + private String payloadSize; + private Map indexes; + + /** + * Method that returns the JSON String of the ExportRequest + * + * @return JSON String of the ExportRequest query + */ + @Override + public String toString() { + JSONObject jsonObject = + new JSONObject() + .put("url", this.url) + .putOpt("apiKey", this.apiKey) + .putOpt("payloadSize", this.payloadSize) + .putOpt("indexes", this.indexes); + return jsonObject.toString(); + } +} diff --git a/src/test/java/com/meilisearch/integration/ClientTest.java b/src/test/java/com/meilisearch/integration/ClientTest.java index 52d5e97a..b8dad858 100644 --- a/src/test/java/com/meilisearch/integration/ClientTest.java +++ b/src/test/java/com/meilisearch/integration/ClientTest.java @@ -7,6 +7,8 @@ import com.google.gson.*; import com.meilisearch.integration.classes.AbstractIT; import com.meilisearch.integration.classes.TestData; +import com.meilisearch.sdk.ExportIndexFilter; +import com.meilisearch.sdk.ExportRequest; import com.meilisearch.sdk.Index; import com.meilisearch.sdk.exceptions.MeilisearchApiException; import com.meilisearch.sdk.exceptions.MeilisearchException; @@ -14,6 +16,8 @@ import com.meilisearch.sdk.utils.Movie; import java.lang.reflect.InaccessibleObjectException; import java.lang.reflect.Modifier; +import java.util.HashMap; +import java.util.Map; import org.junit.jupiter.api.*; @Tag("integration") @@ -309,6 +313,22 @@ public void testCreateSnapshot() throws Exception { assertThat(snapshot.getType(), is(equalTo("snapshotCreation"))); } + /** Test call to initiate export */ + @Test + public void testExport() throws Exception { + Map indexes = new HashMap<>(); + indexes.put("*", ExportIndexFilter.builder().filter("genres = action").build()); + + ExportRequest payload = + ExportRequest.builder().url(getMeilisearchHost()).indexes(indexes).build(); + TaskInfo task = client.export(payload); + client.waitForTask(task.getTaskUid()); + Task exportTask = client.getTask(task.getTaskUid()); + + assertThat(task.getStatus(), is(equalTo(TaskStatus.ENQUEUED))); + assertThat(exportTask.getType(), is(equalTo("export"))); + } + /** * Test the exclusion of transient fields. * diff --git a/src/test/java/com/meilisearch/sdk/ExportRequestTest.java b/src/test/java/com/meilisearch/sdk/ExportRequestTest.java new file mode 100644 index 00000000..266b446a --- /dev/null +++ b/src/test/java/com/meilisearch/sdk/ExportRequestTest.java @@ -0,0 +1,93 @@ +package com.meilisearch.sdk; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; + +import java.util.HashMap; +import java.util.Map; +import org.json.JSONObject; +import org.junit.jupiter.api.Test; + +public class ExportRequestTest { + + @Test + void toStringSimpleExportIndexFilter() { + ExportIndexFilter filter = ExportIndexFilter.builder().build(); + JSONObject json = new JSONObject(filter.toString()); + assertThat(json.has("overrideSettings"), is(false)); + assertThat(json.has("filter"), is(false)); + } + + @Test + void toStringExportIndexFilterWithOverride() { + ExportIndexFilter filter = ExportIndexFilter.builder().overrideSettings(true).build(); + JSONObject json = new JSONObject(filter.toString()); + assertThat(json.getBoolean("overrideSettings"), is(true)); + assertThat(json.has("filter"), is(false)); + } + + @Test + void toStringExportIndexFilterWithFilter() { + ExportIndexFilter filter = ExportIndexFilter.builder().filter("status = 'active'").build(); + JSONObject json = new JSONObject(filter.toString()); + assertThat(json.getString("filter"), is(equalTo("status = 'active'"))); + assertThat(json.has("overrideSettings"), is(false)); + } + + @Test + void toStringSimpleExportRequest() { + ExportRequest request = + ExportRequest.builder().url("http://localhost:7711").payloadSize("123 MiB").build(); + JSONObject json = new JSONObject(request.toString()); + assertThat(json.getString("url"), is(equalTo("http://localhost:7711"))); + assertThat(json.getString("payloadSize"), is(equalTo("123 MiB"))); + assertThat(json.has("apiKey"), is(false)); + assertThat(json.has("indexes"), is(false)); + } + + @Test + void toStringExportRequestWithIndexes() { + Map indexes = new HashMap<>(); + indexes.put("*", ExportIndexFilter.builder().overrideSettings(true).build()); + + ExportRequest request = + ExportRequest.builder() + .url("http://localhost:7711") + .payloadSize("123 MiB") + .indexes(indexes) + .build(); + + JSONObject json = new JSONObject(request.toString()); + + assertThat(json.getString("url"), is(equalTo("http://localhost:7711"))); + assertThat(json.getString("payloadSize"), is(equalTo("123 MiB"))); + assertThat(json.has("apiKey"), is(false)); + JSONObject indexesJson = json.getJSONObject("indexes"); + JSONObject starIndex = indexesJson.getJSONObject("*"); + assertThat(starIndex.has("filter"), is(false)); + assertThat(starIndex.getBoolean("overrideSettings"), is(true)); + } + + @Test + void gettersExportRequest() { + Map indexes = new HashMap<>(); + indexes.put( + "myindex", + ExportIndexFilter.builder().filter("id > 10").overrideSettings(false).build()); + + ExportRequest request = + ExportRequest.builder() + .url("http://localhost:7711") + .apiKey("mykey") + .payloadSize("50 MiB") + .indexes(indexes) + .build(); + + assertThat(request.getUrl(), is(equalTo("http://localhost:7711"))); + assertThat(request.getApiKey(), is(equalTo("mykey"))); + assertThat(request.getPayloadSize(), is(equalTo("50 MiB"))); + assertThat(request.getIndexes().get("myindex").getFilter(), is(equalTo("id > 10"))); + assertThat(request.getIndexes().get("myindex").isOverrideSettings(), is(false)); + } +}