You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2026/03/22 18:01:30 UTC
(couchdb) 08/11: convert api field classes to record
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 <rn...@apache.org>
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);
}
}