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 84bdcfb5211f02c7fc03e1cdb7b0c9b3a8db5e49 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);
