summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <rnewson@apache.org>2023-04-25 09:41:43 +0100
committerRobert Newson <rnewson@apache.org>2023-04-27 10:32:15 +0100
commit3ea049d643db534071fab4f576c39d34f2f856c6 (patch)
treef93733672ac4a1464cd3d1a8f089b5098a8497f9
parent5096243ff8ae2963b446960dbe53daa8c160aeed (diff)
downloadcouchdb-3ea049d643db534071fab4f576c39d34f2f856c6.tar.gz
allow PUT to existing index if definition identical
-rw-r--r--nouveau/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java31
-rw-r--r--nouveau/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java10
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
@@ -62,6 +62,37 @@ public class IndexDefinition {
}
@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
+ ", fieldAnalyzers=" + fieldAnalyzers + "]";
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) {