Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/main/java/com/meilisearch/sdk/model/Settings.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.meilisearch.sdk.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.HashMap;
import lombok.AccessLevel;
import lombok.Getter;
Expand Down Expand Up @@ -42,20 +44,24 @@ public class Settings {
public Settings() {}

/** Granular filterable attributes accessor. */
@JsonProperty("filterableAttributes")
public FilterableAttributesConfig[] getFilterableAttributesConfig() {
return filterableAttributes;
}

@JsonProperty("filterableAttributes")
public Settings setFilterableAttributesConfig(FilterableAttributesConfig[] configs) {
this.filterableAttributes = configs;
return this;
}

/** Legacy String[] view of filterable attributes. */
@JsonIgnore
public String[] getFilterableAttributes() {
return FilterableAttributesLegacyAdapter.toLegacyNamesOrThrow(filterableAttributes);
}

@JsonIgnore
public Settings setFilterableAttributes(String[] filterableAttributes) {
Comment on lines +64 to 65

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

rg -n -A8 -B4 \
  '`@JsonIgnore`|setFilterableAttributes\(String\[\]|setFilterableAttributesConfig' \
  src/main/java/com/meilisearch/sdk/model/Settings.java

rg -n \
  'filterableAttributes.*\["|setFilterableAttributes\(new String' \
  src/test/java

Repository: meilisearch/meilisearch-java

Length of output: 2156


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf 'Files:\n'
git ls-files 'src/main/java/com/meilisearch/sdk/model/Settings.java' 'src/main/java/com/meilisearch/sdk/model/Filterable*.java'

printf '\nSettings.java lines 1-110:\n'
cat -n src/main/java/com/meilisearch/sdk/model/Settings.java | sed -n '1,110p'

printf '\nFilterable attribute files:\n'
git ls-files 'src/main/java/com/meilisearch/sdk/model/Filterable*.java' | sort

for f in $(git ls-files 'src/main/java/com/meilisearch/sdk/model/Filterable*.java' | sort); do
  echo "--- $f"
  cat -n "$f" | sed -n '1,220p'
done

printf '\nDeserializer/adapter usages:\n'
rg -n "Settings|FilterableAttributesLegacyAdapter|FilterableAttributesConfig|filterableAttributes" src/main/java src/test/java | head -n 200

Repository: meilisearch/meilisearch-java

Length of output: 36584


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf 'Files:\n'
git ls-files 'src/main/java/com/meilisearch/sdk/model/Settings.java' 'src/main/jsonschema' 'src/test/resources' | sed -n '1,200p'

printf '\nSettings.java lines 1-110:\n'
cat -n src/main/java/com/meilisearch/sdk/model/Settings.java | sed -n '1,110p'

printf '\nFilterable attribute files:\n'
git ls-files 'src/main/java/com/meilisearch/sdk/model/Filterable*.java' | sort

for f in $(git ls-files 'src/main/java/com/meilisearch/sdk/model/Filterable*.java' | sort); do
  echo "--- $f"
  cat -n "$f" | sed -n '1,220p'
done

printf '\nDeserializer/adapter usages:\n'
rg -n "Settings|FilterableAttributesLegacyAdapter|FilterableAttributesConfig|filterableAttributes" src/main/java src/test/java | head -n 200

Repository: meilisearch/meilisearch-java

Length of output: 36746


Preserve legacy filterableAttributes deserialization.

@JsonIgnore hides both the legacy string setter and getter, so Jackson no longer decodes legacy payloads like {"filterableAttributes":["title"]} through setFilterableAttributes(String[]). Keep deserialization working for the string legacy form in addition to granular-object config entries, and add a regression test for that legacy shape.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/main/java/com/meilisearch/sdk/model/Settings.java` around lines 64 - 65,
Remove the `@JsonIgnore` from the String[] overload
`Settings.setFilterableAttributes(String[])` so Jackson can deserialize legacy
`filterableAttributes` arrays while retaining granular-object configuration
handling. Add a regression test covering a payload such as
`{"filterableAttributes":["title"]}` and verify the resulting settings preserve
the decoded legacy values.

this.filterableAttributes =
FilterableAttributesLegacyAdapter.fromLegacyNames(filterableAttributes);
Expand Down
40 changes: 40 additions & 0 deletions src/test/java/com/meilisearch/sdk/json/JacksonJsonHandlerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -134,4 +134,44 @@ void settingsWithGranularFilterableAttributesRoundTripWithCustomMapper() throws
decoded.getFilterableAttributesConfig()[1].getAttributePatterns()[0],
is("director"));
}

@Test
void settingsWithAdvancedGranularFilterableAttributesRoundTripWithCustomMapper()
throws Exception {
ObjectMapper customMapper = new ObjectMapper();
JacksonJsonHandler handlerWithCustomMapper = new JacksonJsonHandler(customMapper);

FilterableAttributesFeatures features = new FilterableAttributesFeatures();
features.setFacetSearch(false);
features.setFilter(new FilterableAttributesFilter(true, false));

FilterableAttributesConfig advanced = new FilterableAttributesConfig();
advanced.setAttributePatterns(new String[] {"parent"});
advanced.setFeatures(features);

Settings settings = new Settings();
settings.setFilterableAttributesConfig(new FilterableAttributesConfig[] {advanced});

String json = handlerWithCustomMapper.encode(settings);

assertThat(
json,
is(
"{\"filterableAttributes\":[{\"attributePatterns\":[\"parent\"],\"features\":{\"facetSearch\":false,\"filter\":{\"equality\":true,\"comparison\":false}}}]}"));

Settings decoded = handlerWithCustomMapper.decode(json, Settings.class);

assertThat(decoded.getFilterableAttributesConfig(), is(notNullValue()));
assertThat(decoded.getFilterableAttributesConfig().length, is(1));
assertThat(
decoded.getFilterableAttributesConfig()[0].getAttributePatterns()[0], is("parent"));
assertThat(
decoded.getFilterableAttributesConfig()[0].getFeatures().getFacetSearch(), is(false));
assertThat(
decoded.getFilterableAttributesConfig()[0].getFeatures().getFilter().getEquality(),
is(true));
assertThat(
decoded.getFilterableAttributesConfig()[0].getFeatures().getFilter().getComparison(),
is(false));
}
}