From 3ea049d643db534071fab4f576c39d34f2f856c6 Mon Sep 17 00:00:00 2001 From: Robert Newson Date: Tue, 25 Apr 2023 09:41:43 +0100 Subject: allow PUT to existing index if definition identical --- .../couchdb/nouveau/api/IndexDefinition.java | 31 ++++++++++++++++++++++ .../apache/couchdb/nouveau/core/IndexManager.java | 10 +++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/nouveau/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java b/nouveau/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java index 7d3919c41..3e0f08d64 100644 --- a/nouveau/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java +++ b/nouveau/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java @@ -61,6 +61,37 @@ public class IndexDefinition { return fieldAnalyzers != null && !fieldAnalyzers.isEmpty(); } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + 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 (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 [defaultAnalyzer=" + defaultAnalyzer diff --git a/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java b/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java index ddc7c3f7f..f662780bb 100644 --- a/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java +++ b/nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java @@ -125,8 +125,13 @@ public final class IndexManager implements Managed { } } - public void create(final String name, IndexDefinition indexDefinition) throws IOException { + public void create(final String name, IndexDefinition newIndexDefinition) throws IOException { if (exists(name)) { + final IndexDefinition currentIndexDefinition = loadIndexDefinition(name); + if (newIndexDefinition.equals(currentIndexDefinition)) { + // Idempotent success. + return; + } throw new WebApplicationException("Index already exists", Status.EXPECTATION_FAILED); } // Validate index definiton @@ -134,11 +139,12 @@ public final class IndexManager implements Managed { // Persist definition final Path path = indexDefinitionPath(name); + if (Files.exists(path)) { throw new FileAlreadyExistsException(name + " already exists"); } Files.createDirectories(path.getParent()); - objectMapper.writeValue(path.toFile(), indexDefinition); + objectMapper.writeValue(path.toFile(), newIndexDefinition); } public boolean exists(final String name) { -- cgit v1.2.1