From d28362895f25bea87d005ffa0ee8af86782c4960 Mon Sep 17 00:00:00 2001 From: zs <2862877643@qq.com> Date: Tue, 28 Jul 2026 16:39:58 +0800 Subject: [PATCH 1/2] feat: add filter condition to dynamic search rules --- .../sdk/model/DynamicSearchRule.java | 5 +- .../integration/DynamicSearchRulesTest.java | 48 +++++++++++++++- .../sdk/model/DynamicSearchRuleTest.java | 57 +++++++++++++++++++ 3 files changed, 105 insertions(+), 5 deletions(-) create mode 100644 src/test/java/com/meilisearch/sdk/model/DynamicSearchRuleTest.java diff --git a/src/main/java/com/meilisearch/sdk/model/DynamicSearchRule.java b/src/main/java/com/meilisearch/sdk/model/DynamicSearchRule.java index 71f94838..ffa70e8d 100644 --- a/src/main/java/com/meilisearch/sdk/model/DynamicSearchRule.java +++ b/src/main/java/com/meilisearch/sdk/model/DynamicSearchRule.java @@ -19,8 +19,9 @@ public class DynamicSearchRule implements Serializable { protected String description; protected int priority; protected boolean active; - protected List> conditions; + protected Map conditions; protected List> actions; + protected String lastUpdatedAt; public DynamicSearchRule() {} @@ -29,7 +30,7 @@ public DynamicSearchRule( String description, int priority, boolean active, - List> conditions, + Map conditions, List> actions) { this.uid = uid; this.description = description; diff --git a/src/test/java/com/meilisearch/integration/DynamicSearchRulesTest.java b/src/test/java/com/meilisearch/integration/DynamicSearchRulesTest.java index 6cf67cdc..38fc3a0e 100644 --- a/src/test/java/com/meilisearch/integration/DynamicSearchRulesTest.java +++ b/src/test/java/com/meilisearch/integration/DynamicSearchRulesTest.java @@ -6,6 +6,7 @@ import com.meilisearch.integration.classes.AbstractIT; import com.meilisearch.sdk.exceptions.MeilisearchException; +import com.meilisearch.sdk.json.GsonJsonHandler; import com.meilisearch.sdk.model.DynamicSearchRule; import com.meilisearch.sdk.model.DynamicSearchRulesQuery; import com.meilisearch.sdk.model.Results; @@ -13,6 +14,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import org.json.JSONObject; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; @@ -33,14 +35,17 @@ static void cleanMeilisearch() { } private DynamicSearchRule buildTestRule(String uid) { - Map queryCondition = Map.of("scope", "query", "isEmpty", true); + Map queryCondition = Map.of("query", Map.of("isEmpty", true)); Map action = Map.of( "selector", Map.of("indexUid", "products"), "action", Map.of("type", "pin", "position", 1)); - return new DynamicSearchRule( - uid, "Test rule", 5, true, List.of(queryCondition), List.of(action)); + return new DynamicSearchRule(uid, "Test rule", 5, true, queryCondition, List.of(action)); + } + + private Map buildFilterCondition(String color) { + return Map.of("filter", Map.of("values", Map.of("color", color, "category", "shirt"))); } @Test @@ -55,6 +60,42 @@ public void testUpdateDynamicSearchRule() throws MeilisearchException { assertThat(fetched.getDescription(), equalTo("Test rule")); assertThat(fetched.getPriority(), equalTo(5)); assertThat(fetched.isActive(), equalTo(true)); + assertThat(fetched.getLastUpdatedAt(), notNullValue()); + } + + @Test + public void testCreateAndUpdateDynamicSearchRuleWithFilterCondition() + throws MeilisearchException { + DynamicSearchRule rule = buildTestRule("test-filter"); + rule.setConditions(buildFilterCondition("red")); + + TaskInfo createTask = client.updateDynamicSearchRule("test-filter", rule); + client.waitForTask(createTask.getTaskUid()); + + DynamicSearchRule created = client.getDynamicSearchRule("test-filter"); + JSONObject createdConditions = + new JSONObject(new GsonJsonHandler().encode(created.getConditions())); + assertThat( + createdConditions + .getJSONObject("filter") + .getJSONObject("values") + .getString("color"), + equalTo("red")); + + rule.setConditions(buildFilterCondition("blue")); + TaskInfo updateTask = client.updateDynamicSearchRule("test-filter", rule); + client.waitForTask(updateTask.getTaskUid()); + + DynamicSearchRule updated = client.getDynamicSearchRule("test-filter"); + JSONObject updatedConditions = + new JSONObject(new GsonJsonHandler().encode(updated.getConditions())); + assertThat( + updatedConditions + .getJSONObject("filter") + .getJSONObject("values") + .getString("color"), + equalTo("blue")); + assertThat(updated.getLastUpdatedAt(), notNullValue()); } @Test @@ -79,6 +120,7 @@ public void testListDynamicSearchRules() throws MeilisearchException { client.listDynamicSearchRules(new DynamicSearchRulesQuery()); assertThat(results.getResults().length >= 2, equalTo(true)); + assertThat(results.getResults()[0].getLastUpdatedAt(), notNullValue()); } @Test diff --git a/src/test/java/com/meilisearch/sdk/model/DynamicSearchRuleTest.java b/src/test/java/com/meilisearch/sdk/model/DynamicSearchRuleTest.java new file mode 100644 index 00000000..ce673073 --- /dev/null +++ b/src/test/java/com/meilisearch/sdk/model/DynamicSearchRuleTest.java @@ -0,0 +1,57 @@ +package com.meilisearch.sdk.model; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; + +import com.meilisearch.sdk.json.GsonJsonHandler; +import java.util.List; +import java.util.Map; +import org.json.JSONObject; +import org.junit.jupiter.api.Test; + +class DynamicSearchRuleTest { + private final GsonJsonHandler jsonHandler = new GsonJsonHandler(); + + @Test + void serializesFilterConditionValues() { + Map conditions = + Map.of( + "filter", + Map.of( + "values", + Map.of( + "color", "red", + "category", "shirt"))); + Map action = + Map.of( + "selector", Map.of("indexUid", "products", "id", "123"), + "action", Map.of("type", "pin", "position", 1)); + + DynamicSearchRule rule = + new DynamicSearchRule( + "test-filter", "Filter rule", 1, true, conditions, List.of(action)); + + JSONObject json = new JSONObject(jsonHandler.encode(rule)); + JSONObject values = + json.getJSONObject("conditions").getJSONObject("filter").getJSONObject("values"); + + assertThat(values.getString("color"), is(equalTo("red"))); + assertThat(values.getString("category"), is(equalTo("shirt"))); + } + + @Test + void deserializesLastUpdatedAt() { + String lastUpdatedAt = "2026-07-28T08:30:00Z"; + String response = + "{\"uid\":\"test-filter\",\"description\":\"Filter rule\"," + + "\"priority\":1,\"active\":true,\"conditions\":{},\"actions\":[]," + + "\"lastUpdatedAt\":\"" + + lastUpdatedAt + + "\"}"; + + DynamicSearchRule rule = jsonHandler.decode(response, DynamicSearchRule.class); + + assertThat(rule.getLastUpdatedAt(), is(equalTo(lastUpdatedAt))); + } +} From 2c0691c7a1b710c22e663d898a03cd79f36ef685 Mon Sep 17 00:00:00 2001 From: zs <2862877643@qq.com> Date: Tue, 28 Jul 2026 23:37:37 +0800 Subject: [PATCH 2/2] fix: update dynamic search rule fields and sample - Rename dynamic search rule priority to precedence and update tests - Update the dynamic search rule code sample to use Map conditions --- .code-samples.meilisearch.yaml | 6 +++--- .../java/com/meilisearch/sdk/model/DynamicSearchRule.java | 6 +++--- .../com/meilisearch/integration/DynamicSearchRulesTest.java | 2 +- .../com/meilisearch/sdk/model/DynamicSearchRuleTest.java | 3 ++- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.code-samples.meilisearch.yaml b/.code-samples.meilisearch.yaml index ea7e4117..e3f0f8fe 100644 --- a/.code-samples.meilisearch.yaml +++ b/.code-samples.meilisearch.yaml @@ -672,9 +672,9 @@ list_dynamic_search_rules_1: |- get_dynamic_search_rule_1: |- DynamicSearchRule rule = client.getDynamicSearchRule("black-friday"); patch_dynamic_search_rule_1: |- - List> conditions = List.of( - Map.of("scope", "query", "isEmpty", true), - Map.of("scope", "time", "start", "2025-11-28T00:00:00Z", "end", "2025-11-28T23:59:59Z")); + Map conditions = Map.of( + "query", Map.of("isEmpty", true), + "time", Map.of("start", "2025-11-28T00:00:00Z", "end", "2025-11-28T23:59:59Z")); List> actions = List.of( Map.of( diff --git a/src/main/java/com/meilisearch/sdk/model/DynamicSearchRule.java b/src/main/java/com/meilisearch/sdk/model/DynamicSearchRule.java index ffa70e8d..25120d73 100644 --- a/src/main/java/com/meilisearch/sdk/model/DynamicSearchRule.java +++ b/src/main/java/com/meilisearch/sdk/model/DynamicSearchRule.java @@ -17,7 +17,7 @@ public class DynamicSearchRule implements Serializable { protected String uid; protected String description; - protected int priority; + protected int precedence; protected boolean active; protected Map conditions; protected List> actions; @@ -28,13 +28,13 @@ public DynamicSearchRule() {} public DynamicSearchRule( String uid, String description, - int priority, + int precedence, boolean active, Map conditions, List> actions) { this.uid = uid; this.description = description; - this.priority = priority; + this.precedence = precedence; this.active = active; this.conditions = conditions; this.actions = actions; diff --git a/src/test/java/com/meilisearch/integration/DynamicSearchRulesTest.java b/src/test/java/com/meilisearch/integration/DynamicSearchRulesTest.java index 38fc3a0e..b38f4c53 100644 --- a/src/test/java/com/meilisearch/integration/DynamicSearchRulesTest.java +++ b/src/test/java/com/meilisearch/integration/DynamicSearchRulesTest.java @@ -58,7 +58,7 @@ public void testUpdateDynamicSearchRule() throws MeilisearchException { DynamicSearchRule fetched = client.getDynamicSearchRule("test-rule"); assertThat(fetched.getUid(), equalTo("test-rule")); assertThat(fetched.getDescription(), equalTo("Test rule")); - assertThat(fetched.getPriority(), equalTo(5)); + assertThat(fetched.getPrecedence(), equalTo(5)); assertThat(fetched.isActive(), equalTo(true)); assertThat(fetched.getLastUpdatedAt(), notNullValue()); } diff --git a/src/test/java/com/meilisearch/sdk/model/DynamicSearchRuleTest.java b/src/test/java/com/meilisearch/sdk/model/DynamicSearchRuleTest.java index ce673073..faa58e25 100644 --- a/src/test/java/com/meilisearch/sdk/model/DynamicSearchRuleTest.java +++ b/src/test/java/com/meilisearch/sdk/model/DynamicSearchRuleTest.java @@ -45,13 +45,14 @@ void deserializesLastUpdatedAt() { String lastUpdatedAt = "2026-07-28T08:30:00Z"; String response = "{\"uid\":\"test-filter\",\"description\":\"Filter rule\"," - + "\"priority\":1,\"active\":true,\"conditions\":{},\"actions\":[]," + + "\"precedence\":1,\"active\":true,\"conditions\":{},\"actions\":[]," + "\"lastUpdatedAt\":\"" + lastUpdatedAt + "\"}"; DynamicSearchRule rule = jsonHandler.decode(response, DynamicSearchRule.class); + assertThat(rule.getPrecedence(), is(equalTo(1))); assertThat(rule.getLastUpdatedAt(), is(equalTo(lastUpdatedAt))); } }