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 3b6169ada8975639730ba09bd934a705d2d054cb Author: Robert Newson <[email protected]> AuthorDate: Sat Mar 21 15:22:24 2026 +0000 convert api field classes to record --- .../apache/couchdb/nouveau/api/DoubleField.java | 38 +-------------------- .../java/org/apache/couchdb/nouveau/api/Field.java | 17 ++-------- .../apache/couchdb/nouveau/api/StoredField.java | 30 ++--------------- .../apache/couchdb/nouveau/api/StringField.java | 39 ++-------------------- .../org/apache/couchdb/nouveau/api/TextField.java | 39 ++-------------------- .../apache/couchdb/nouveau/lucene/LuceneIndex.java | 18 +++++----- .../couchdb/nouveau/lucene/LuceneIndexSchema.java | 8 ++--- 7 files changed, 23 insertions(+), 166 deletions(-) diff --git a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DoubleField.java b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DoubleField.java index 79a968786..c86b67ffc 100644 --- a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DoubleField.java +++ b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/DoubleField.java @@ -13,40 +13,4 @@ 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.NotNull; - -@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) -public class DoubleField extends Field { - - @NotNull - private final Double value; - - private final boolean store; - - public DoubleField( - @JsonProperty("name") final String name, - @JsonProperty("value") final Double value, - @JsonProperty("store") final boolean store) { - super(name); - this.value = value; - this.store = store; - } - - @JsonProperty - public Double getValue() { - return value; - } - - @JsonProperty - public boolean isStore() { - return store; - } - - @Override - public String toString() { - return "DoubleField [name=" + name + ", value=" + value + ", store=" + store + "]"; - } -} +public record DoubleField(String name, double value, boolean store) implements Field {} diff --git a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/Field.java b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/Field.java index 8b8f109d2..7d00675f8 100644 --- a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/Field.java +++ b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/Field.java @@ -13,14 +13,10 @@ package org.apache.couchdb.nouveau.api; -import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; import jakarta.validation.constraints.Pattern; -@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "@type") @JsonSubTypes({ @JsonSubTypes.Type(value = DoubleField.class, name = "double"), @@ -28,17 +24,8 @@ import jakarta.validation.constraints.Pattern; @JsonSubTypes.Type(value = StringField.class, name = "string"), @JsonSubTypes.Type(value = TextField.class, name = "text"), }) -public abstract class Field { +public interface Field { @Pattern(regexp = "^\\$?[a-zA-Z][a-zA-Z0-9_]*$") - protected final String name; - - protected Field(final String name) { - this.name = name; - } - - @JsonProperty - public String getName() { - return name; - } + String name(); } diff --git a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/StoredField.java b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/StoredField.java index 697fc4f93..318c0f138 100644 --- a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/StoredField.java +++ b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/StoredField.java @@ -13,33 +13,9 @@ 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 io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; -@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) -public final class StoredField extends Field { - - @NotNull - @Schema(oneOf = {String.class, Double.class, byte[].class}) - private final Object value; - - public StoredField(@JsonProperty("name") final String name, @JsonProperty("value") final Object value) { - super(name); - if (!(value instanceof String || value instanceof Number || value instanceof byte[])) { - throw new IllegalArgumentException(value + " must be a string, number or byte array"); - } - this.value = value; - } - - public Object getValue() { - return value; - } - - @Override - public String toString() { - return "StoredField [name=" + name + ", value=" + value + "]"; - } -} +public record StoredField( + String name, @NotNull @Schema(oneOf = {String.class, Double.class, byte[].class}) Object value) + implements Field {} diff --git a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/StringField.java b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/StringField.java index 32f38063c..d116efa7b 100644 --- a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/StringField.java +++ b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/StringField.java @@ -13,41 +13,6 @@ 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.NotNull; -import java.util.Objects; +import jakarta.validation.constraints.NotEmpty; -@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) -public final class StringField extends Field { - - @NotNull - private final String value; - - private final boolean store; - - public StringField( - @JsonProperty("name") final String name, - @JsonProperty("value") final String value, - @JsonProperty("store") final boolean store) { - super(name); - this.value = Objects.requireNonNull(value); - this.store = store; - } - - @JsonProperty - public String getValue() { - return value; - } - - @JsonProperty - public boolean isStore() { - return store; - } - - @Override - public String toString() { - return "StringField [name=" + name + ", value=" + value + ", store=" + store + "]"; - } -} +public record StringField(String name, @NotEmpty String value, boolean store) implements Field {} diff --git a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/TextField.java b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/TextField.java index a82231a2d..ed1ab844e 100644 --- a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/TextField.java +++ b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/api/TextField.java @@ -13,41 +13,6 @@ 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.NotNull; -import java.util.Objects; +import jakarta.validation.constraints.NotEmpty; -@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) -public final class TextField extends Field { - - @NotNull - private final String value; - - private final boolean store; - - public TextField( - @JsonProperty("name") final String name, - @JsonProperty("value") final String value, - @JsonProperty("store") final boolean store) { - super(name); - this.value = Objects.requireNonNull(value); - this.store = store; - } - - @JsonProperty - public String getValue() { - return value; - } - - @JsonProperty - public boolean isStore() { - return store; - } - - @Override - public String toString() { - return "TextField [name=" + name + ", value=" + value + ", store=" + store + "]"; - } -} +public record TextField(String name, @NotEmpty String value, boolean store) implements Field {} 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 e8eb46ccc..1f6a735ff 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 @@ -418,34 +418,34 @@ public class LuceneIndex extends Index { for (Field field : request.fields()) { // Underscore-prefix is reserved. - if (field.getName().startsWith("_")) { + if (field.name().startsWith("_")) { continue; } if (field instanceof TextField) { var f = (TextField) field; result.add(new org.apache.lucene.document.TextField( - f.getName(), f.getValue(), f.isStore() ? Store.YES : Store.NO)); + f.name(), f.value(), f.store() ? Store.YES : Store.NO)); } else if (field instanceof StringField) { var f = (StringField) field; result.add(new org.apache.lucene.document.KeywordField( - f.getName(), f.getValue(), f.isStore() ? Store.YES : Store.NO)); + f.name(), f.value(), f.store() ? Store.YES : Store.NO)); } else if (field instanceof DoubleField) { var f = (DoubleField) field; result.add(new org.apache.lucene.document.DoubleField( - f.getName(), f.getValue(), f.isStore() ? Store.YES : Store.NO)); + f.name(), f.value(), f.store() ? Store.YES : Store.NO)); } else if (field instanceof StoredField) { var f = (StoredField) field; - var val = f.getValue(); + var val = f.value(); if (val instanceof String) { - result.add(new org.apache.lucene.document.StoredField(f.getName(), (String) val)); + result.add(new org.apache.lucene.document.StoredField(f.name(), (String) val)); } else if (val instanceof Number) { - result.add(new org.apache.lucene.document.StoredField(f.getName(), ((Number) val).doubleValue())); + result.add(new org.apache.lucene.document.StoredField(f.name(), ((Number) val).doubleValue())); } else if (val instanceof byte[]) { try { final CharBuffer buf = utf8Decoder.decode(ByteBuffer.wrap((byte[]) val)); - result.add(new org.apache.lucene.document.StoredField(f.getName(), buf.toString())); + result.add(new org.apache.lucene.document.StoredField(f.name(), buf.toString())); } catch (final CharacterCodingException e) { - result.add(new org.apache.lucene.document.StoredField(f.getName(), (byte[]) val)); + result.add(new org.apache.lucene.document.StoredField(f.name(), (byte[]) val)); } } else { throw new WebApplicationException(field + " is not valid", Status.BAD_REQUEST); diff --git a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene/LuceneIndexSchema.java b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene/LuceneIndexSchema.java index ef335bf5a..bf4351292 100644 --- a/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene/LuceneIndexSchema.java +++ b/extra/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene/LuceneIndexSchema.java @@ -78,7 +78,7 @@ final class LuceneIndexSchema { public void update(final Collection<Field> fields) { Objects.requireNonNull(fields); for (var field : fields) { - map.putIfAbsent(field.getName(), Type.fromField(field)); + map.putIfAbsent(field.name(), Type.fromField(field)); assertType(field); } } @@ -90,13 +90,13 @@ final class LuceneIndexSchema { public void assertType(final Field field) { Objects.requireNonNull(field); var expectedType = Type.fromField(field); - var actualType = map.get(field.getName()); + var actualType = map.get(field.name()); if (actualType == null) { - throw new WebApplicationException("Unknown field " + field.getName(), Status.BAD_REQUEST); + throw new WebApplicationException("Unknown field " + field.name(), Status.BAD_REQUEST); } if (expectedType != actualType) { throw new WebApplicationException( - String.format("field %s is of type %s not %s", field.getName(), expectedType, actualType), + String.format("field %s is of type %s not %s", field.name(), expectedType, actualType), Status.BAD_REQUEST); } }
