Skip to content

Commit a786b94

Browse files
committed
add zstd to v2
1 parent 41ca7b6 commit a786b94

4 files changed

Lines changed: 90 additions & 24 deletions

File tree

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package dev.zarr.zarrjava.core.codec.core;
2+
3+
import com.github.luben.zstd.Zstd;
4+
import com.github.luben.zstd.ZstdCompressCtx;
5+
import dev.zarr.zarrjava.ZarrException;
6+
import dev.zarr.zarrjava.core.codec.BytesBytesCodec;
7+
8+
import java.nio.ByteBuffer;
9+
10+
public abstract class ZstdCodec extends BytesBytesCodec {
11+
12+
protected abstract int getLevel();
13+
14+
protected abstract boolean getChecksum();
15+
16+
@Override
17+
public ByteBuffer decode(ByteBuffer compressedBytes) throws ZarrException {
18+
byte[] compressedArray = compressedBytes.array();
19+
20+
long originalSize = Zstd.getFrameContentSize(compressedArray);
21+
if (originalSize == 0) {
22+
throw new ZarrException("Failed to get decompressed size");
23+
}
24+
25+
byte[] decompressed = Zstd.decompress(compressedArray, (int) originalSize);
26+
return ByteBuffer.wrap(decompressed);
27+
}
28+
29+
@Override
30+
public ByteBuffer encode(ByteBuffer chunkBytes) throws ZarrException {
31+
byte[] arr = chunkBytes.array();
32+
byte[] compressed;
33+
try (ZstdCompressCtx ctx = new ZstdCompressCtx()) {
34+
ctx.setLevel(getLevel());
35+
ctx.setChecksum(getChecksum());
36+
compressed = ctx.compress(arr);
37+
}
38+
return ByteBuffer.wrap(compressed);
39+
}
40+
}

src/main/java/dev/zarr/zarrjava/v2/codec/CodecRegistry.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.fasterxml.jackson.databind.jsontype.NamedType;
44
import dev.zarr.zarrjava.v2.codec.core.BloscCodec;
55
import dev.zarr.zarrjava.v2.codec.core.ZlibCodec;
6+
import dev.zarr.zarrjava.v2.codec.core.ZstdCodec;
67

78
import java.util.HashMap;
89
import java.util.Map;
@@ -14,6 +15,7 @@ public class CodecRegistry {
1415
static {
1516
addType("blosc", BloscCodec.class);
1617
addType("zlib", ZlibCodec.class);
18+
addType("zstd", ZstdCodec.class);
1719
}
1820

1921
public static void addType(String name, Class<? extends Codec> codecClass) {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package dev.zarr.zarrjava.v2.codec.core;
2+
3+
import com.fasterxml.jackson.annotation.JsonCreator;
4+
import com.fasterxml.jackson.annotation.JsonIgnore;
5+
import com.fasterxml.jackson.annotation.JsonProperty;
6+
import dev.zarr.zarrjava.ZarrException;
7+
import dev.zarr.zarrjava.core.ArrayMetadata;
8+
import dev.zarr.zarrjava.v2.codec.Codec;
9+
10+
public class ZstdCodec extends dev.zarr.zarrjava.core.codec.core.ZstdCodec implements Codec {
11+
12+
@JsonIgnore
13+
public final String id = "zstd";
14+
public final int level;
15+
public final boolean checksum;
16+
17+
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
18+
public ZstdCodec(
19+
@JsonProperty(value = "level", defaultValue = "0") int level,
20+
@JsonProperty(value = "checksum", defaultValue = "false") boolean checksum)
21+
throws ZarrException {
22+
if (level < -131072 || level > 22) {
23+
throw new ZarrException("'level' needs to be between -131072 and 22.");
24+
}
25+
this.level = level;
26+
this.checksum = checksum;
27+
}
28+
29+
@Override
30+
protected int getLevel() {
31+
return level;
32+
}
33+
34+
@Override
35+
protected boolean getChecksum() {
36+
return checksum;
37+
}
38+
39+
@Override
40+
public Codec evolveFromCoreArrayMetadata(ArrayMetadata.CoreArrayMetadata arrayMetadata) {
41+
return this;
42+
}
43+
}

src/main/java/dev/zarr/zarrjava/v3/codec/core/ZstdCodec.java

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,13 @@
33
import com.fasterxml.jackson.annotation.JsonCreator;
44
import com.fasterxml.jackson.annotation.JsonIgnore;
55
import com.fasterxml.jackson.annotation.JsonProperty;
6-
import com.github.luben.zstd.Zstd;
7-
import com.github.luben.zstd.ZstdCompressCtx;
86
import dev.zarr.zarrjava.ZarrException;
9-
import dev.zarr.zarrjava.core.codec.BytesBytesCodec;
107
import dev.zarr.zarrjava.v3.ArrayMetadata;
118
import dev.zarr.zarrjava.v3.codec.Codec;
129

1310
import javax.annotation.Nonnull;
14-
import java.nio.ByteBuffer;
1511

16-
public class ZstdCodec extends BytesBytesCodec implements Codec {
12+
public class ZstdCodec extends dev.zarr.zarrjava.core.codec.core.ZstdCodec implements Codec {
1713

1814
@JsonIgnore
1915
public final String name = "zstd";
@@ -27,28 +23,13 @@ public ZstdCodec(
2723
}
2824

2925
@Override
30-
public ByteBuffer decode(ByteBuffer compressedBytes) throws ZarrException {
31-
byte[] compressedArray = compressedBytes.array();
32-
33-
long originalSize = Zstd.getFrameContentSize(compressedArray);
34-
if (originalSize == 0) {
35-
throw new ZarrException("Failed to get decompressed size");
36-
}
37-
38-
byte[] decompressed = Zstd.decompress(compressedArray, (int) originalSize);
39-
return ByteBuffer.wrap(decompressed);
26+
protected int getLevel() {
27+
return configuration.level;
4028
}
4129

4230
@Override
43-
public ByteBuffer encode(ByteBuffer chunkBytes) throws ZarrException {
44-
byte[] arr = chunkBytes.array();
45-
byte[] compressed;
46-
try (ZstdCompressCtx ctx = new ZstdCompressCtx()) {
47-
ctx.setLevel(configuration.level);
48-
ctx.setChecksum(configuration.checksum);
49-
compressed = ctx.compress(arr);
50-
}
51-
return ByteBuffer.wrap(compressed);
31+
protected boolean getChecksum() {
32+
return configuration.checksum;
5233
}
5334

5435
@Override

0 commit comments

Comments
 (0)