This is an automated email from the ASF dual-hosted git repository.

rnewson pushed a commit to branch nouveau-update-bundle
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit a95d3585c830f05298363dec6109323cfcf5dc78
Author: Robert Newson <[email protected]>
AuthorDate: Sat Mar 21 15:05:51 2026 +0000

    convert IndexDefinition to record
---
 .../couchdb/nouveau/api/IndexDefinition.java       | 92 +++-------------------
 .../apache/couchdb/nouveau/core/IndexManager.java  |  2 +-
 .../couchdb/nouveau/health/IndexHealthCheck.java   |  7 +-
 .../nouveau/lucene/LuceneAnalyzerFactory.java      |  6 +-
 .../couchdb/nouveau/resources/IndexResource.java   |  3 +-
 .../couchdb/nouveau/api/IndexDefinitionTest.java   |  5 +-
 .../couchdb/nouveau/core/IndexManagerTest.java     | 23 +++---
 .../nouveau/health/IndexHealthCheckTest.java       |  5 +-
 .../nouveau/lucene/LuceneAnalyzerFactoryTest.java  | 10 ++-
 .../couchdb/nouveau/lucene/LuceneIndexTest.java    |  3 +-
 10 files changed, 47 insertions(+), 109 deletions(-)

diff --git 
a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java
 
b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java
index 11e14082b..5b800a3ea 100644
--- 
a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java
+++ 
b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java
@@ -14,105 +14,35 @@
 package org.apache.couchdb.nouveau.api;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.PropertyNamingStrategies;
 import com.fasterxml.jackson.databind.annotation.JsonNaming;
 import jakarta.validation.constraints.Max;
 import jakarta.validation.constraints.Min;
 import jakarta.validation.constraints.NotEmpty;
 import java.util.Map;
+import java.util.Optional;
+import java.util.OptionalInt;
 
 @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
-public class IndexDefinition {
+public record IndexDefinition(
+        @Min(LEGACY_LUCENE_VERSION) @Max(LATEST_LUCENE_VERSION) OptionalInt 
luceneVersion,
+        @NotEmpty String defaultAnalyzer,
+        Optional<Map<@NotEmpty String, @NotEmpty String>> fieldAnalyzers) {
 
     public static final int LEGACY_LUCENE_VERSION = 9;
     public static final int LATEST_LUCENE_VERSION = 10;
 
-    @Min(LEGACY_LUCENE_VERSION)
-    @Max(LATEST_LUCENE_VERSION)
-    private int luceneVersion = LEGACY_LUCENE_VERSION; // Legacy version if 
not set.
-
-    @NotEmpty
-    private String defaultAnalyzer;
-
-    private Map<@NotEmpty String, @NotEmpty String> fieldAnalyzers;
-
     public IndexDefinition() {
-        // Jackson deserialization
+        this(OptionalInt.of(LATEST_LUCENE_VERSION), "standard", 
Optional.empty());
     }
 
-    public IndexDefinition(
-            final int luceneVersion, final String defaultAnalyzer, final 
Map<String, String> fieldAnalyzers) {
-        this.luceneVersion = luceneVersion;
-        this.defaultAnalyzer = defaultAnalyzer;
-        this.fieldAnalyzers = fieldAnalyzers;
-    }
-
-    @JsonProperty
-    public int getLuceneVersion() {
-        return luceneVersion;
+    @JsonIgnore
+    public int luceneVersionAsInt() {
+        return luceneVersion.orElse(LEGACY_LUCENE_VERSION);
     }
 
     @JsonIgnore
     public boolean isLatestVersion() {
-        return luceneVersion == LATEST_LUCENE_VERSION;
-    }
-
-    public void setLuceneVersion(int luceneVersion) {
-        this.luceneVersion = luceneVersion;
-    }
-
-    @JsonProperty
-    public String getDefaultAnalyzer() {
-        return defaultAnalyzer;
-    }
-
-    public void setDefaultAnalyzer(String defaultAnalyzer) {
-        this.defaultAnalyzer = defaultAnalyzer;
-    }
-
-    @JsonProperty
-    public Map<String, String> getFieldAnalyzers() {
-        return fieldAnalyzers;
-    }
-
-    public void setFieldAnalyzers(Map<String, String> fieldAnalyzers) {
-        this.fieldAnalyzers = fieldAnalyzers;
-    }
-
-    public boolean hasFieldAnalyzers() {
-        return fieldAnalyzers != null && !fieldAnalyzers.isEmpty();
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + luceneVersion;
-        result = prime * result + ((defaultAnalyzer == null) ? 0 : 
defaultAnalyzer.hashCode());
-        result = prime * result + ((fieldAnalyzers == null) ? 0 : 
fieldAnalyzers.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) return true;
-        if (obj == null) return false;
-        if (getClass() != obj.getClass()) return false;
-        IndexDefinition other = (IndexDefinition) obj;
-        if (luceneVersion != other.luceneVersion) return false;
-        if (defaultAnalyzer == null) {
-            if (other.defaultAnalyzer != null) return false;
-        } else if (!defaultAnalyzer.equals(other.defaultAnalyzer)) return 
false;
-        if (fieldAnalyzers == null) {
-            if (other.fieldAnalyzers != null) return false;
-        } else if (!fieldAnalyzers.equals(other.fieldAnalyzers)) return false;
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return "IndexDefinition [luceneVersion=" + luceneVersion + ", 
defaultAnalyzer=" + defaultAnalyzer
-                + ", fieldAnalyzers=" + fieldAnalyzers + "]";
+        return luceneVersion.getAsInt() == LATEST_LUCENE_VERSION;
     }
 }
diff --git 
a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java 
b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java
index 4067716ee..6120f8703 100644
--- 
a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java
+++ 
b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java
@@ -393,7 +393,7 @@ public final class IndexManager implements Managed {
         final Path path = indexPath(name);
         final IndexDefinition indexDefinition = loadIndexDefinition(name);
         final Analyzer analyzer = 
LuceneAnalyzerFactory.fromDefinition(indexDefinition);
-        final int luceneVersion = indexDefinition.getLuceneVersion();
+        final int luceneVersion = indexDefinition.luceneVersionAsInt();
         final Directory dir = new 
DirectIODirectory(FSDirectory.open(path.resolve(Integer.toString(luceneVersion))));
         final IndexWriterConfig config = new IndexWriterConfig(analyzer);
         if (luceneVersion != IndexDefinition.LATEST_LUCENE_VERSION) {
diff --git 
a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/health/IndexHealthCheck.java
 
b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/health/IndexHealthCheck.java
index 0a70b2b6c..81bca3094 100644
--- 
a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/health/IndexHealthCheck.java
+++ 
b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/health/IndexHealthCheck.java
@@ -17,6 +17,8 @@ import com.codahale.metrics.health.HealthCheck;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
+import java.util.OptionalInt;
 import org.apache.couchdb.nouveau.api.BulkUpdateRequest;
 import org.apache.couchdb.nouveau.api.DocumentUpdate;
 import org.apache.couchdb.nouveau.api.DocumentUpdateRequest;
@@ -42,7 +44,10 @@ public final class IndexHealthCheck extends HealthCheck {
             // Ignored, index might not exist yet.
         }
 
-        indexResource.createIndex(name, new 
IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, "standard", null));
+        indexResource.createIndex(
+                name,
+                new IndexDefinition(
+                        OptionalInt.of(IndexDefinition.LATEST_LUCENE_VERSION), 
"standard", Optional.empty()));
         try {
             indexResource.update(
                     name,
diff --git 
a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene/LuceneAnalyzerFactory.java
 
b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene/LuceneAnalyzerFactory.java
index b95230cec..89c268f40 100644
--- 
a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene/LuceneAnalyzerFactory.java
+++ 
b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene/LuceneAnalyzerFactory.java
@@ -65,13 +65,13 @@ public final class LuceneAnalyzerFactory {
     private LuceneAnalyzerFactory() {}
 
     public static Analyzer fromDefinition(final IndexDefinition 
indexDefinition) {
-        final Analyzer defaultAnalyzer = 
newAnalyzer(indexDefinition.getDefaultAnalyzer());
-        if (!indexDefinition.hasFieldAnalyzers()) {
+        final Analyzer defaultAnalyzer = 
newAnalyzer(indexDefinition.defaultAnalyzer());
+        if (indexDefinition.fieldAnalyzers().isEmpty()) {
             return defaultAnalyzer;
         }
         final Map<String, Analyzer> fieldAnalyzers = new HashMap<String, 
Analyzer>();
         for (Map.Entry<String, String> entry :
-                indexDefinition.getFieldAnalyzers().entrySet()) {
+                indexDefinition.fieldAnalyzers().get().entrySet()) {
             fieldAnalyzers.put(entry.getKey(), newAnalyzer(entry.getValue()));
         }
         return new PerFieldAnalyzerWrapper(defaultAnalyzer, fieldAnalyzers);
diff --git 
a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/resources/IndexResource.java
 
b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/resources/IndexResource.java
index 756230590..18539fbed 100644
--- 
a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/resources/IndexResource.java
+++ 
b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/resources/IndexResource.java
@@ -62,7 +62,8 @@ public final class IndexResource {
             throws IOException {
         if (!indexDefinition.isLatestVersion()) {
             throw new WebApplicationException(
-                    "Cannot create a new version " + 
indexDefinition.getLuceneVersion() + " index", Status.BAD_REQUEST);
+                    "Cannot create a new version " + 
indexDefinition.luceneVersionAsInt() + " index",
+                    Status.BAD_REQUEST);
         }
         indexManager.create(name, indexDefinition);
         return Ok.INSTANCE;
diff --git 
a/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/api/IndexDefinitionTest.java
 
b/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/api/IndexDefinitionTest.java
index 2e1e7ee03..d0b73da41 100644
--- 
a/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/api/IndexDefinitionTest.java
+++ 
b/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/api/IndexDefinitionTest.java
@@ -26,17 +26,18 @@ public class IndexDefinitionTest {
     @BeforeAll
     public static void setup() {
         mapper = new ObjectMapper();
+        mapper.findAndRegisterModules();
     }
 
     @Test
     public void legacyLuceneVersionIfMissing() throws Exception {
         var indexDefinition = mapper.readValue("{}", IndexDefinition.class);
-        
assertThat(indexDefinition.getLuceneVersion()).isEqualTo(IndexDefinition.LEGACY_LUCENE_VERSION);
+        
assertThat(indexDefinition.luceneVersionAsInt()).isEqualTo(IndexDefinition.LEGACY_LUCENE_VERSION);
     }
 
     @Test
     public void luceneVersionIsDeserializedIfPresent() throws Exception {
         var indexDefinition = mapper.readValue("{\"lucene_version\":10}", 
IndexDefinition.class);
-        assertThat(indexDefinition.getLuceneVersion()).isEqualTo(10);
+        assertThat(indexDefinition.luceneVersionAsInt()).isEqualTo(10);
     }
 }
diff --git 
a/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/core/IndexManagerTest.java
 
b/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/core/IndexManagerTest.java
index 7a122e67c..e1d867bd2 100644
--- 
a/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/core/IndexManagerTest.java
+++ 
b/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/core/IndexManagerTest.java
@@ -43,9 +43,12 @@ public class IndexManagerTest {
         executorService = Executors.newScheduledThreadPool(2);
         rootDir = path;
 
+        var mapper = new ObjectMapper();
+        mapper.findAndRegisterModules();
+
         manager = new IndexManager();
         manager.setRootDir(path);
-        manager.setObjectMapper(new ObjectMapper());
+        manager.setObjectMapper(mapper);
         manager.setCommitIntervalSeconds(10);
         manager.setScheduledExecutorService(executorService);
         manager.setSearcherFactory(new 
ParallelSearcherFactory(ForkJoinPool.commonPool()));
@@ -61,8 +64,7 @@ public class IndexManagerTest {
 
     @Test
     public void managerReturnsUsableIndex() throws Exception {
-        final IndexDefinition indexDefinition =
-                new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, 
"standard", null);
+        final IndexDefinition indexDefinition = new IndexDefinition();
         manager.create("foo", indexDefinition);
         var searchRequest = new SearchRequest();
         searchRequest.setQuery("*:*");
@@ -72,8 +74,7 @@ public class IndexManagerTest {
 
     @Test
     public void managerReopensAClosedIndex() throws Exception {
-        final IndexDefinition indexDefinition =
-                new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, 
"standard", null);
+        final IndexDefinition indexDefinition = new IndexDefinition();
 
         manager.create("bar", indexDefinition);
 
@@ -90,8 +91,7 @@ public class IndexManagerTest {
 
     @Test
     public void deleteAllRemovesIndexByName() throws Exception {
-        final IndexDefinition indexDefinition =
-                new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, 
"standard", null);
+        final IndexDefinition indexDefinition = new IndexDefinition();
 
         assertThat(countIndexes()).isEqualTo(0);
         manager.create("bar", indexDefinition);
@@ -102,8 +102,7 @@ public class IndexManagerTest {
 
     @Test
     public void deleteAllRemovesIndexByPath() throws Exception {
-        final IndexDefinition indexDefinition =
-                new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, 
"standard", null);
+        final IndexDefinition indexDefinition = new IndexDefinition();
 
         assertThat(countIndexes()).isEqualTo(0);
         manager.create("foo/bar", indexDefinition);
@@ -114,8 +113,7 @@ public class IndexManagerTest {
 
     @Test
     public void deleteAllRemovesIndexByGlob() throws Exception {
-        final IndexDefinition indexDefinition =
-                new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, 
"standard", null);
+        final IndexDefinition indexDefinition = new IndexDefinition();
 
         assertThat(countIndexes()).isEqualTo(0);
         manager.create("foo/bar", indexDefinition);
@@ -126,8 +124,7 @@ public class IndexManagerTest {
 
     @Test
     public void deleteAllRemovesIndexByGlobExceptExclusions() throws Exception 
{
-        final IndexDefinition indexDefinition =
-                new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, 
"standard", null);
+        final IndexDefinition indexDefinition = new IndexDefinition();
 
         assertThat(countIndexes()).isEqualTo(0);
         manager.create("foo/bar", indexDefinition);
diff --git 
a/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/health/IndexHealthCheckTest.java
 
b/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/health/IndexHealthCheckTest.java
index 0c777fbab..8e1e02b05 100644
--- 
a/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/health/IndexHealthCheckTest.java
+++ 
b/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/health/IndexHealthCheckTest.java
@@ -28,11 +28,14 @@ public class IndexHealthCheckTest {
 
     @Test
     public void testIndexHealthCheck(@TempDir final Path tempDir) throws 
Exception {
+        var mapper = new ObjectMapper();
+        mapper.findAndRegisterModules();
+
         var manager = new IndexManager();
         manager.setCommitIntervalSeconds(30);
         manager.setIdleSeconds(60);
         manager.setMaxIndexesOpen(1);
-        manager.setObjectMapper(new ObjectMapper());
+        manager.setObjectMapper(mapper);
         manager.setRootDir(tempDir);
         
manager.setScheduledExecutorService(Executors.newScheduledThreadPool(2));
         manager.setSearcherFactory(new SearcherFactory());
diff --git 
a/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene/LuceneAnalyzerFactoryTest.java
 
b/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene/LuceneAnalyzerFactoryTest.java
index 383cf34dc..ec10f156f 100644
--- 
a/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene/LuceneAnalyzerFactoryTest.java
+++ 
b/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene/LuceneAnalyzerFactoryTest.java
@@ -19,6 +19,8 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 import jakarta.ws.rs.WebApplicationException;
 import java.lang.reflect.Method;
 import java.util.Map;
+import java.util.Optional;
+import java.util.OptionalInt;
 import org.apache.couchdb.nouveau.api.IndexDefinition;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.ar.ArabicAnalyzer;
@@ -257,9 +259,9 @@ public class LuceneAnalyzerFactoryTest {
     @Test
     public void testFieldAnalyzers() throws Exception {
         final IndexDefinition indexDefinition = new IndexDefinition(
-                IndexDefinition.LATEST_LUCENE_VERSION,
+                OptionalInt.of(IndexDefinition.LATEST_LUCENE_VERSION),
                 "standard",
-                Map.of("english", "english", "thai", "thai", "email", 
"email"));
+                Optional.of(Map.of("english", "english", "thai", "thai", 
"email", "email")));
         final Analyzer analyzer = 
LuceneAnalyzerFactory.fromDefinition(indexDefinition);
         assertThat(analyzer).isInstanceOf(PerFieldAnalyzerWrapper.class);
         final Method m = 
PerFieldAnalyzerWrapper.class.getDeclaredMethod("getWrappedAnalyzer", 
String.class);
@@ -277,8 +279,8 @@ public class LuceneAnalyzerFactoryTest {
 
     private void assertAnalyzer(final String name, final Class<? extends 
Analyzer> clazz) throws Exception {
         
assertThat(LuceneAnalyzerFactory.newAnalyzer(name)).isInstanceOf(clazz);
-        assertThat(LuceneAnalyzerFactory.fromDefinition(
-                        new 
IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, name, null)))
+        assertThat(LuceneAnalyzerFactory.fromDefinition(new IndexDefinition(
+                        OptionalInt.of(IndexDefinition.LATEST_LUCENE_VERSION), 
name, Optional.empty())))
                 .isInstanceOf(clazz);
     }
 }
diff --git 
a/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene/LuceneIndexTest.java
 
b/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene/LuceneIndexTest.java
index abc0af1cf..83ee15268 100644
--- 
a/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene/LuceneIndexTest.java
+++ 
b/extra/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene/LuceneIndexTest.java
@@ -48,8 +48,7 @@ import org.junit.jupiter.api.io.TempDir;
 public class LuceneIndexTest {
 
     protected final Index setup(final Path path) throws IOException {
-        final IndexDefinition indexDefinition =
-                new IndexDefinition(IndexDefinition.LATEST_LUCENE_VERSION, 
"standard", null);
+        final IndexDefinition indexDefinition = new IndexDefinition();
         final Analyzer analyzer = 
LuceneAnalyzerFactory.fromDefinition(indexDefinition);
         final Directory dir = new DirectIODirectory(FSDirectory.open(path));
         final IndexWriterConfig config = new IndexWriterConfig(analyzer);

Reply via email to