This is an automated email from the ASF dual-hosted git repository.
cgivre pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git
The following commit(s) were added to refs/heads/master by this push:
new b38ba3ee97 DRILL-8544: HDF5 Files Ignoring Config Options (#3038)
b38ba3ee97 is described below
commit b38ba3ee979b7a1c5d389038d58a52e67b24b536
Author: Charles S. Givre <[email protected]>
AuthorDate: Mon Mar 9 09:26:36 2026 -0400
DRILL-8544: HDF5 Files Ignoring Config Options (#3038)
---
.gitignore | 1 +
.../drill/exec/store/hdf5/HDF5FormatConfig.java | 26 +++++---
.../drill/exec/store/hdf5/TestHDF5Format.java | 74 ++++++++++++++++++++--
3 files changed, 86 insertions(+), 15 deletions(-)
diff --git a/.gitignore b/.gitignore
index 0304fc07c3..67e5cbbb90 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,3 +33,4 @@ target/
tools/venv/
venv/
.vscode/*
+exec/java-exec/src/main/resources/webapp/
diff --git
a/contrib/format-hdf5/src/main/java/org/apache/drill/exec/store/hdf5/HDF5FormatConfig.java
b/contrib/format-hdf5/src/main/java/org/apache/drill/exec/store/hdf5/HDF5FormatConfig.java
index c5bd202d98..664c707f4b 100644
---
a/contrib/format-hdf5/src/main/java/org/apache/drill/exec/store/hdf5/HDF5FormatConfig.java
+++
b/contrib/format-hdf5/src/main/java/org/apache/drill/exec/store/hdf5/HDF5FormatConfig.java
@@ -20,6 +20,7 @@ package org.apache.drill.exec.store.hdf5;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
@@ -32,6 +33,7 @@ import java.util.List;
import java.util.Objects;
@JsonTypeName(HDF5FormatPlugin.DEFAULT_NAME)
+@JsonInclude(Include.NON_DEFAULT)
public class HDF5FormatConfig implements FormatPluginConfig {
private final List<String> extensions;
@@ -42,24 +44,28 @@ public class HDF5FormatConfig implements FormatPluginConfig
{
public HDF5FormatConfig(
@JsonProperty("extensions") List<String> extensions,
@JsonProperty("defaultPath") String defaultPath,
- @JsonProperty("showPreview") boolean showPreview) {
+ @JsonProperty("showPreview") Boolean showPreview) {
this.extensions = extensions == null
? Collections.singletonList("h5")
: ImmutableList.copyOf(extensions);
this.defaultPath = defaultPath;
- this.showPreview = showPreview;
+ this.showPreview = showPreview != null && showPreview;
}
- @JsonInclude(JsonInclude.Include.NON_DEFAULT)
+ @JsonProperty("extensions")
public List<String> getExtensions() {
return extensions;
}
+ @JsonProperty("defaultPath")
public String getDefaultPath() {
return defaultPath;
}
- public boolean showPreview() { return showPreview; }
+ @JsonProperty("showPreview")
+ public boolean showPreview() {
+ return showPreview;
+ }
@Override
public boolean equals(Object obj) {
@@ -71,8 +77,8 @@ public class HDF5FormatConfig implements FormatPluginConfig {
}
HDF5FormatConfig other = (HDF5FormatConfig) obj;
return Objects.equals(extensions, other.getExtensions()) &&
- Objects.equals(defaultPath, other.defaultPath) &&
- Objects.equals(showPreview, other.showPreview);
+ Objects.equals(defaultPath, other.defaultPath) &&
+ Objects.equals(showPreview, other.showPreview);
}
@Override
@@ -83,9 +89,9 @@ public class HDF5FormatConfig implements FormatPluginConfig {
@Override
public String toString() {
return new PlanStringBuilder(this)
- .field("extensions", extensions)
- .field("default path", defaultPath)
- .field("show preview", showPreview)
- .toString();
+ .field("extensions", extensions)
+ .field("default path", defaultPath)
+ .field("show preview", showPreview)
+ .toString();
}
}
diff --git
a/contrib/format-hdf5/src/test/java/org/apache/drill/exec/store/hdf5/TestHDF5Format.java
b/contrib/format-hdf5/src/test/java/org/apache/drill/exec/store/hdf5/TestHDF5Format.java
index 9e1e04d9a9..49dfa93b8c 100644
---
a/contrib/format-hdf5/src/test/java/org/apache/drill/exec/store/hdf5/TestHDF5Format.java
+++
b/contrib/format-hdf5/src/test/java/org/apache/drill/exec/store/hdf5/TestHDF5Format.java
@@ -18,19 +18,21 @@
package org.apache.drill.exec.store.hdf5;
+import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.drill.categories.RowSetTest;
+import org.apache.drill.common.logical.FormatPluginConfig;
import org.apache.drill.common.types.TypeProtos;
import org.apache.drill.common.types.TypeProtos.DataMode;
import org.apache.drill.common.types.TypeProtos.MinorType;
+import org.apache.drill.exec.physical.rowSet.RowSet;
+import org.apache.drill.exec.physical.rowSet.RowSetBuilder;
+import org.apache.drill.exec.record.metadata.SchemaBuilder;
import org.apache.drill.exec.record.metadata.TupleMetadata;
import org.apache.drill.exec.rpc.RpcException;
+import org.apache.drill.test.ClusterFixture;
import org.apache.drill.test.ClusterFixtureBuilder;
import org.apache.drill.test.ClusterTest;
-import org.apache.drill.exec.physical.rowSet.RowSet;
-import org.apache.drill.exec.physical.rowSet.RowSetBuilder;
-import org.apache.drill.test.ClusterFixture;
import org.apache.drill.test.rowSet.RowSetComparison;
-import org.apache.drill.exec.record.metadata.SchemaBuilder;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -40,8 +42,9 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import static org.junit.Assert.assertEquals;
import static org.apache.drill.test.QueryTestUtil.generateCompressedFile;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
@Category(RowSetTest.class)
public class TestHDF5Format extends ClusterTest {
@@ -920,4 +923,65 @@ public class TestHDF5Format extends ClusterTest {
new RowSetComparison(expected).unorderedVerifyAndClearAll(results);
}
+
+ @Test
+ public void testSerializeAndDeserialize() throws Exception {
+ ObjectMapper mapper = new ObjectMapper();
+ HDF5FormatConfig config = new HDF5FormatConfig(
+ Arrays.asList("h5", "hdf5"),
+ "/data/group1",
+ true
+ );
+
+ String json = mapper.writeValueAsString(config);
+ assertTrue("JSON should contain type field", json.contains("\"type\""));
+ assertTrue("JSON should contain hdf5 type value",
json.contains("\"hdf5\""));
+ assertTrue("JSON should contain extensions",
json.contains("\"extensions\""));
+ assertTrue("JSON should contain h5 extension", json.contains("\"h5\""));
+ assertTrue("JSON should contain hdf5 extension",
json.contains("\"hdf5\""));
+ assertTrue("JSON should contain defaultPath",
json.contains("\"defaultPath\""));
+ assertTrue("JSON should contain /data/group1",
json.contains("/data/group1"));
+ assertTrue("JSON should contain showPreview",
json.contains("\"showPreview\""));
+ assertTrue("JSON should contain true for showPreview",
json.contains("true"));
+
+ HDF5FormatConfig deserialized = mapper.readValue(json,
HDF5FormatConfig.class);
+
+ assertEquals("Round-tripped config should equal original", config,
deserialized);
+ assertEquals("Extensions should match", config.getExtensions(),
deserialized.getExtensions());
+ assertEquals("Default path should match", config.getDefaultPath(),
deserialized.getDefaultPath());
+ assertEquals("Show preview should match", config.showPreview(),
deserialized.showPreview());
+ }
+
+ @Test
+ public void testSerializeDefaults() throws Exception {
+ ObjectMapper mapper = new ObjectMapper();
+
+ HDF5FormatConfig config = new HDF5FormatConfig(null, null, null);
+ String json = mapper.writeValueAsString(config);
+
+ // With @JsonInclude(NON_DEFAULT), default-valued fields may be omitted.
+ // The type field should always be present.
+ assertTrue("JSON should contain type field", json.contains("\"type\""));
+ assertTrue("JSON should contain hdf5 type value",
json.contains("\"hdf5\""));
+ HDF5FormatConfig deserialized = mapper.readValue(json,
HDF5FormatConfig.class);
+ assertEquals("Round-tripped default config should equal original", config,
deserialized);
+ }
+
+ @Test
+ public void testDeserializeViaBaseType() throws Exception {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.registerSubtypes(HDF5FormatConfig.class);
+
+ HDF5FormatConfig config = new HDF5FormatConfig(Arrays.asList("h5", "hdf5"),
+ "/data/group1",
+ true);
+
+ String json = mapper.writeValueAsString(config);
+
+ // Deserialize using the base interface to verify type info works
+ FormatPluginConfig deserialized = mapper.readValue(json,
FormatPluginConfig.class);
+
+ assertTrue("Deserialized should be HDF5FormatConfig", deserialized
instanceof HDF5FormatConfig);
+ assertEquals("Round-tripped config via base type should equal original",
config, deserialized);
+ }
}