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 196ec15472b643d01bfd633e35dd56890d2fbb57 Author: Robert Newson <[email protected]> AuthorDate: Sat Mar 21 10:19:55 2026 +0000 convert Document api classes to records --- .../couchdb/nouveau/api/DocumentDeleteRequest.java | 49 ++------------- .../couchdb/nouveau/api/DocumentRequest.java | 2 +- .../apache/couchdb/nouveau/api/DocumentUpdate.java | 6 +- .../couchdb/nouveau/api/DocumentUpdateRequest.java | 69 ++++++---------------- .../org/apache/couchdb/nouveau/core/Index.java | 14 ++--- .../apache/couchdb/nouveau/lucene/LuceneIndex.java | 10 ++-- .../couchdb/nouveau/resources/IndexResource.java | 8 +-- 7 files changed, 43 insertions(+), 115 deletions(-) diff --git a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentDeleteRequest.java b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentDeleteRequest.java index 36f70bf78..f306b376b 100644 --- a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentDeleteRequest.java +++ b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentDeleteRequest.java @@ -13,50 +13,11 @@ package org.apache.couchdb.nouveau.api; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; import jakarta.validation.constraints.Positive; import jakarta.validation.constraints.PositiveOrZero; -public final class DocumentDeleteRequest extends DocumentRequest { - - @PositiveOrZero - private final long matchSeq; - - @Positive - private final long seq; - - private final boolean purge; - - public DocumentDeleteRequest( - @JsonProperty("match_seq") final long matchSeq, - @JsonProperty("seq") final long seq, - @JsonProperty("purge") final boolean purge) { - if (matchSeq < 0) { - throw new IllegalArgumentException("matchSeq must be 0 or greater"); - } - - if (seq < 1) { - throw new IllegalArgumentException("seq must be 1 or greater"); - } - this.matchSeq = matchSeq; - this.seq = seq; - this.purge = purge; - } - - public long getMatchSeq() { - return matchSeq; - } - - public long getSeq() { - return seq; - } - - public boolean isPurge() { - return purge; - } - - @Override - public String toString() { - return "DocumentDeleteRequest [matchSeq=" + matchSeq + ", seq=" + seq + ", purge=" + purge + "]"; - } -} +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public record DocumentDeleteRequest(@PositiveOrZero long matchSeq, @Positive long seq, boolean purge) + implements DocumentRequest {} diff --git a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentRequest.java b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentRequest.java index 7dc8aa269..0cf87d136 100644 --- a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentRequest.java +++ b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentRequest.java @@ -21,4 +21,4 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; @JsonSubTypes.Type(value = DocumentDeleteRequest.class, name = "delete"), @JsonSubTypes.Type(value = DocumentUpdateRequest.class, name = "update"), }) -public abstract class DocumentRequest {} +public interface DocumentRequest {} diff --git a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentUpdate.java b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentUpdate.java index 141860f3a..b078e00b1 100644 --- a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentUpdate.java +++ b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentUpdate.java @@ -13,6 +13,8 @@ package org.apache.couchdb.nouveau.api; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; -public record DocumentUpdate(@JsonProperty("doc_id") String docId, @JsonProperty("update") DocumentRequest request) {} +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public record DocumentUpdate(String docId, DocumentRequest update) {} diff --git a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentUpdateRequest.java b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentUpdateRequest.java index 9cbed3ac0..205968d3a 100644 --- a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentUpdateRequest.java +++ b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DocumentUpdateRequest.java @@ -13,61 +13,26 @@ package org.apache.couchdb.nouveau.api; -import com.fasterxml.jackson.annotation.JsonProperty; -import jakarta.validation.Valid; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Positive; import jakarta.validation.constraints.PositiveOrZero; import java.util.Collection; - -public final class DocumentUpdateRequest extends DocumentRequest { - - @PositiveOrZero - private final long matchSeq; - - @Positive - private final long seq; - - private final String partition; - - @NotEmpty - @Valid - private final Collection<Field> fields; - - public DocumentUpdateRequest( - @JsonProperty("match_seq") final long matchSeq, - @JsonProperty("seq") final long seq, - @JsonProperty("partition") final String partition, - @JsonProperty("fields") final Collection<Field> fields) { - this.matchSeq = matchSeq; - this.seq = seq; - this.partition = partition; - this.fields = fields; - } - - public long getMatchSeq() { - return matchSeq; - } - - public long getSeq() { - return seq; - } - - public String getPartition() { - return partition; - } - - public boolean hasPartition() { - return partition != null; - } - - public Collection<Field> getFields() { - return fields; - } - - @Override - public String toString() { - return "DocumentUpdateRequest [matchSeq=" + matchSeq + ", seq=" + seq + ", partition=" + partition + ", fields=" - + fields + "]"; +import java.util.Optional; + +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public record DocumentUpdateRequest( + @PositiveOrZero long matchSeq, + @Positive long seq, + @NotNull Optional<String> partition, + @NotEmpty Collection<Field> fields) + implements DocumentRequest { + + public DocumentUpdateRequest { + if (partition == null) { + partition = Optional.empty(); + } } } diff --git a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/core/Index.java b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/core/Index.java index 528a885b6..e7693702c 100644 --- a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/core/Index.java +++ b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/core/Index.java @@ -55,22 +55,22 @@ public abstract class Index implements Closeable { protected abstract long doDiskSize() throws IOException; public final synchronized void update(final String docId, final DocumentUpdateRequest request) throws IOException { - assertUpdateSeqProgress(request.getMatchSeq(), request.getSeq()); + assertUpdateSeqProgress(request.matchSeq(), request.seq()); doUpdate(docId, request); - incrementUpdateSeq(request.getMatchSeq(), request.getSeq()); + incrementUpdateSeq(request.matchSeq(), request.seq()); } protected abstract void doUpdate(final String docId, final DocumentUpdateRequest request) throws IOException; public final synchronized void delete(final String docId, final DocumentDeleteRequest request) throws IOException { - if (request.isPurge()) { - assertPurgeSeqProgress(request.getMatchSeq(), request.getSeq()); + if (request.purge()) { + assertPurgeSeqProgress(request.matchSeq(), request.seq()); doDelete(docId, request); - incrementPurgeSeq(request.getMatchSeq(), request.getSeq()); + incrementPurgeSeq(request.matchSeq(), request.seq()); } else { - assertUpdateSeqProgress(request.getMatchSeq(), request.getSeq()); + assertUpdateSeqProgress(request.matchSeq(), request.seq()); doDelete(docId, request); - incrementUpdateSeq(request.getMatchSeq(), request.getSeq()); + incrementUpdateSeq(request.matchSeq(), request.seq()); } } diff --git a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene/LuceneIndex.java b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene/LuceneIndex.java index 9d28072df..e8eb46ccc 100644 --- a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene/LuceneIndex.java +++ b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene/LuceneIndex.java @@ -144,7 +144,7 @@ public class LuceneIndex extends Index { public void doUpdate(final String docId, final DocumentUpdateRequest request) throws IOException { final Term docIdTerm = docIdTerm(docId); final Document doc = toDocument(docId, request); - schema.update(request.getFields()); + schema.update(request.fields()); writer.updateDocument(docIdTerm, doc); } @@ -410,13 +410,13 @@ public class LuceneIndex extends Index { result.add(new SortedDocValuesField("_id", new BytesRef(docId))); // partition (optional) - if (request.hasPartition()) { - result.add(new org.apache.lucene.document.StringField("_partition", request.getPartition(), Store.NO)); - } + request.partition() + .ifPresent(partition -> + result.add(new org.apache.lucene.document.StringField("_partition", partition, Store.NO))); final CharsetDecoder utf8Decoder = StandardCharsets.UTF_8.newDecoder(); - for (Field field : request.getFields()) { + for (Field field : request.fields()) { // Underscore-prefix is reserved. if (field.getName().startsWith("_")) { continue; 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 ecddb6a34..756230590 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 @@ -139,11 +139,11 @@ public final class IndexResource { public Ok update(@PathParam("name") String name, @NotNull @Valid BulkUpdateRequest request) throws Exception { return indexManager.with(name, (index) -> { for (var update : request.updates()) { - if (update.request() instanceof DocumentUpdateRequest) { - index.update(update.docId(), (DocumentUpdateRequest) update.request()); + if (update.update() instanceof DocumentUpdateRequest) { + index.update(update.docId(), (DocumentUpdateRequest) update.update()); } - if (update.request() instanceof DocumentDeleteRequest) { - index.delete(update.docId(), (DocumentDeleteRequest) update.request()); + if (update.update() instanceof DocumentDeleteRequest) { + index.delete(update.docId(), (DocumentDeleteRequest) update.update()); } } return Ok.INSTANCE;
