Skip to content

Commit cf0207d

Browse files
committed
add CoreArrayMetadata to codec object instead of passing as argument in encode and decode
remove transpose order "F" and "C"
1 parent 842ad54 commit cf0207d

19 files changed

+231
-154
lines changed

src/main/java/dev/zarr/zarrjava/utils/Utils.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,24 @@ public static <T> T[] concatArrays(T[] array1, T[]... arrays) {
7777
}
7878
return result;
7979
}
80+
81+
public static boolean isPermutation(int[] array) {
82+
if (array.length==0){
83+
return false;
84+
}
85+
int[] arange = new int[array.length];
86+
Arrays.setAll(arange, i -> i);
87+
int[] orderSorted = array.clone();
88+
Arrays.sort(orderSorted);
89+
return Arrays.equals(orderSorted, arange);
90+
}
91+
92+
public static int[] inversePermutation(int[] origin){
93+
assert isPermutation(origin);
94+
int[] inverse = new int[origin.length];
95+
for (int i = 0; i < origin.length; i++) {
96+
inverse[origin[i]] = i;
97+
}
98+
return inverse;
99+
}
80100
}

src/main/java/dev/zarr/zarrjava/v3/Array.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ protected Array(StoreHandle storeHandle, ArrayMetadata arrayMetadata)
2727
throws IOException, ZarrException {
2828
super(storeHandle);
2929
this.metadata = arrayMetadata;
30-
this.codecPipeline = new CodecPipeline(arrayMetadata.codecs);
30+
this.codecPipeline = new CodecPipeline(arrayMetadata.codecs, arrayMetadata.coreArrayMetadata);
3131
}
3232

3333
/**
@@ -171,8 +171,7 @@ public ucar.ma2.Array read(final long[] offset, final int[] shape) throws ZarrEx
171171

172172
if (codecPipeline.supportsPartialDecode()) {
173173
final ucar.ma2.Array chunkArray = codecPipeline.decodePartial(chunkHandle,
174-
Utils.toLongArray(chunkProjection.chunkOffset), chunkProjection.shape,
175-
metadata.coreArrayMetadata);
174+
Utils.toLongArray(chunkProjection.chunkOffset), chunkProjection.shape);
176175
MultiArrayUtils.copyRegion(chunkArray, new int[metadata.ndim()], outputArray,
177176
chunkProjection.outOffset, chunkProjection.shape
178177
);
@@ -223,7 +222,7 @@ public ucar.ma2.Array readChunk(long[] chunkCoords)
223222
return metadata.allocateFillValueChunk();
224223
}
225224

226-
return codecPipeline.decode(chunkBytes, metadata.coreArrayMetadata);
225+
return codecPipeline.decode(chunkBytes);
227226
}
228227

229228
/**
@@ -299,7 +298,7 @@ public void writeChunk(long[] chunkCoords, ucar.ma2.Array chunkArray) throws Zar
299298
if (MultiArrayUtils.allValuesEqual(chunkArray, metadata.parsedFillValue)) {
300299
chunkHandle.delete();
301300
} else {
302-
ByteBuffer chunkBytes = codecPipeline.encode(chunkArray, metadata.coreArrayMetadata);
301+
ByteBuffer chunkBytes = codecPipeline.encode(chunkArray);
303302
chunkHandle.set(chunkBytes);
304303
}
305304
}
Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package dev.zarr.zarrjava.v3.codec;
22

33
import dev.zarr.zarrjava.ZarrException;
4-
import dev.zarr.zarrjava.v3.ArrayMetadata.CoreArrayMetadata;
54
import ucar.ma2.Array;
65

7-
public interface ArrayArrayCodec extends Codec {
6+
public abstract class ArrayArrayCodec extends Codec {
87

9-
Array encode(Array chunkArray, CoreArrayMetadata arrayMetadata)
8+
protected abstract Array encode(Array chunkArray)
109
throws ZarrException;
1110

12-
Array decode(Array chunkArray, CoreArrayMetadata arrayMetadata)
11+
protected abstract Array decode(Array chunkArray)
1312
throws ZarrException;
1413

1514
}

src/main/java/dev/zarr/zarrjava/v3/codec/ArrayBytesCodec.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,24 @@
22

33
import dev.zarr.zarrjava.ZarrException;
44
import dev.zarr.zarrjava.store.StoreHandle;
5-
import dev.zarr.zarrjava.v3.ArrayMetadata.CoreArrayMetadata;
65
import java.nio.ByteBuffer;
76
import ucar.ma2.Array;
87

9-
public interface ArrayBytesCodec extends Codec {
8+
public abstract class ArrayBytesCodec extends Codec {
109

11-
ByteBuffer encode(Array chunkArray, CoreArrayMetadata arrayMetadata)
10+
protected abstract ByteBuffer encode(Array chunkArray)
1211
throws ZarrException;
1312

14-
Array decode(ByteBuffer chunkBytes, CoreArrayMetadata arrayMetadata)
13+
protected abstract Array decode(ByteBuffer chunkBytes)
1514
throws ZarrException;
1615

17-
interface WithPartialDecode extends ArrayBytesCodec {
16+
public abstract static class WithPartialDecode extends ArrayBytesCodec {
1817

19-
Array decodePartial(
20-
StoreHandle handle, long[] offset, int[] shape,
21-
CoreArrayMetadata arrayMetadata
18+
public abstract Array decode(ByteBuffer shardBytes) throws ZarrException;
19+
public abstract ByteBuffer encode(Array shardArray) throws ZarrException;
20+
21+
protected abstract Array decodePartial(
22+
StoreHandle handle, long[] offset, int[] shape
2223
) throws ZarrException;
2324
}
2425
}
Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package dev.zarr.zarrjava.v3.codec;
22

33
import dev.zarr.zarrjava.ZarrException;
4-
import dev.zarr.zarrjava.v3.ArrayMetadata.CoreArrayMetadata;
4+
55
import java.nio.ByteBuffer;
66

7-
public interface BytesBytesCodec extends Codec {
7+
public abstract class BytesBytesCodec extends Codec {
88

9-
ByteBuffer encode(ByteBuffer chunkBytes, CoreArrayMetadata arrayMetadata)
10-
throws ZarrException;
9+
protected abstract ByteBuffer encode(ByteBuffer chunkBytes) throws ZarrException;
1110

12-
ByteBuffer decode(ByteBuffer chunkBytes, CoreArrayMetadata arrayMetadata)
13-
throws ZarrException;
11+
public abstract ByteBuffer decode(ByteBuffer chunkBytes) throws ZarrException;
1412

1513
}

src/main/java/dev/zarr/zarrjava/v3/codec/Codec.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,22 @@
55
import dev.zarr.zarrjava.v3.ArrayMetadata;
66

77
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "name")
8-
public interface Codec {
8+
public abstract class Codec {
99

10-
long computeEncodedSize(long inputByteLength, ArrayMetadata.CoreArrayMetadata arrayMetadata)
11-
throws ZarrException;
10+
protected ArrayMetadata.CoreArrayMetadata arrayMetadata;
11+
12+
protected ArrayMetadata.CoreArrayMetadata resolveArrayMetadata() throws ZarrException {
13+
if (arrayMetadata == null) {
14+
throw new ZarrException("arrayMetadata needs to get set in for every codec");
15+
}
16+
return this.arrayMetadata;
17+
}
18+
19+
protected abstract long computeEncodedSize(long inputByteLength, ArrayMetadata.CoreArrayMetadata arrayMetadata)
20+
throws ZarrException;
21+
22+
public void setCoreArrayMetadata(ArrayMetadata.CoreArrayMetadata arrayMetadata) throws ZarrException{
23+
this.arrayMetadata = arrayMetadata;
24+
}
1225
}
1326

src/main/java/dev/zarr/zarrjava/v3/codec/CodecBuilder.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,9 @@ public CodecBuilder withBlosc() {
6262
return withBlosc("zstd");
6363
}
6464

65-
public CodecBuilder withTranspose(String order) {
66-
try {
65+
public CodecBuilder withTranspose(int[] order) {
6766
codecs.add(new TransposeCodec(new TransposeCodec.Configuration(order)));
68-
} catch (ZarrException e) {
69-
throw new RuntimeException(e);
70-
}
71-
return this;
67+
return this;
7268
}
7369

7470
public CodecBuilder withBytes(Endian endian) {

src/main/java/dev/zarr/zarrjava/v3/codec/CodecPipeline.java

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,18 @@ public class CodecPipeline {
1212

1313
@Nonnull
1414
final Codec[] codecs;
15+
public final CoreArrayMetadata arrayMetadata;
1516

16-
public CodecPipeline(@Nonnull Codec[] codecs) throws ZarrException {
17+
public CodecPipeline(@Nonnull Codec[] codecs, CoreArrayMetadata arrayMetadata) throws ZarrException {
18+
this.arrayMetadata = arrayMetadata;
1719
long arrayBytesCodecCount = Arrays.stream(codecs).filter(c -> c instanceof ArrayBytesCodec)
1820
.count();
1921
if (arrayBytesCodecCount != 1) {
2022
throw new ZarrException(
2123
"Exactly 1 ArrayBytesCodec is required. Found " + arrayBytesCodecCount + ".");
2224
}
2325
Codec prevCodec = null;
26+
CoreArrayMetadata codecArrayMetadata = arrayMetadata;
2427
for (Codec codec : codecs) {
2528
if (prevCodec != null) {
2629
if (codec instanceof ArrayBytesCodec && prevCodec instanceof ArrayBytesCodec) {
@@ -44,6 +47,8 @@ public CodecPipeline(@Nonnull Codec[] codecs) throws ZarrException {
4447
prevCodec.getClass() + "'.");
4548
}
4649
}
50+
codec.setCoreArrayMetadata(codecArrayMetadata);
51+
codecArrayMetadata = codec.resolveArrayMetadata();
4752
prevCodec = codec;
4853
}
4954

@@ -79,15 +84,14 @@ public boolean supportsPartialDecode() {
7984
@Nonnull
8085
public Array decodePartial(
8186
@Nonnull StoreHandle storeHandle,
82-
long[] offset, int[] shape,
83-
@Nonnull CoreArrayMetadata arrayMetadata
87+
long[] offset, int[] shape
8488
) throws ZarrException {
8589
if (!supportsPartialDecode()) {
8690
throw new ZarrException(
8791
"Partial decode is not supported for these codecs. " + Arrays.toString(codecs));
8892
}
8993
Array chunkArray = ((ArrayBytesCodec.WithPartialDecode) getArrayBytesCodec()).decodePartial(
90-
storeHandle, offset, shape, arrayMetadata);
94+
storeHandle, offset, shape);
9195
if (chunkArray == null) {
9296
throw new ZarrException("chunkArray is null. This is likely a bug in one of the codecs.");
9397
}
@@ -96,8 +100,7 @@ public Array decodePartial(
96100

97101
@Nonnull
98102
public Array decode(
99-
@Nonnull ByteBuffer chunkBytes,
100-
@Nonnull CoreArrayMetadata arrayMetadata
103+
@Nonnull ByteBuffer chunkBytes
101104
) throws ZarrException {
102105
if (chunkBytes == null) {
103106
throw new ZarrException("chunkBytes is null. Ohh nooo.");
@@ -106,23 +109,23 @@ public Array decode(
106109
BytesBytesCodec[] bytesBytesCodecs = getBytesBytesCodecs();
107110
for (int i = bytesBytesCodecs.length - 1; i >= 0; --i) {
108111
BytesBytesCodec codec = bytesBytesCodecs[i];
109-
chunkBytes = codec.decode(chunkBytes, arrayMetadata);
112+
chunkBytes = codec.decode(chunkBytes);
110113
}
111114

112115
if (chunkBytes == null) {
113116
throw new ZarrException(
114117
"chunkBytes is null. This is likely a bug in one of the codecs. " + Arrays.toString(
115118
getBytesBytesCodecs()));
116119
}
117-
Array chunkArray = getArrayBytesCodec().decode(chunkBytes, arrayMetadata);
120+
Array chunkArray = getArrayBytesCodec().decode(chunkBytes);
118121
if (chunkArray == null) {
119122
throw new ZarrException("chunkArray is null. This is likely a bug in one of the codecs.");
120123
}
121124

122125
ArrayArrayCodec[] arrayArrayCodecs = getArrayArrayCodecs();
123126
for (int i = arrayArrayCodecs.length - 1; i >= 0; --i) {
124127
ArrayArrayCodec codec = arrayArrayCodecs[i];
125-
chunkArray = codec.decode(chunkArray, arrayMetadata);
128+
chunkArray = codec.decode(chunkArray);
126129
}
127130

128131
if (chunkArray == null) {
@@ -133,16 +136,16 @@ public Array decode(
133136

134137
@Nonnull
135138
public ByteBuffer encode(
136-
@Nonnull Array chunkArray, @Nonnull CoreArrayMetadata arrayMetadata
139+
@Nonnull Array chunkArray
137140
) throws ZarrException {
138141
for (ArrayArrayCodec codec : getArrayArrayCodecs()) {
139-
chunkArray = codec.encode(chunkArray, arrayMetadata);
142+
chunkArray = codec.encode(chunkArray);
140143
}
141144

142-
ByteBuffer chunkBytes = getArrayBytesCodec().encode(chunkArray, arrayMetadata);
145+
ByteBuffer chunkBytes = getArrayBytesCodec().encode(chunkArray);
143146

144147
for (BytesBytesCodec codec : getBytesBytesCodecs()) {
145-
chunkBytes = codec.encode(chunkBytes, arrayMetadata);
148+
chunkBytes = codec.encode(chunkBytes);
146149
}
147150
return chunkBytes;
148151
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import java.nio.ByteBuffer;
2121
import javax.annotation.Nonnull;
2222

23-
public class BloscCodec implements BytesBytesCodec {
23+
public class BloscCodec extends BytesBytesCodec {
2424

2525
public final String name = "blosc";
2626
@Nonnull
@@ -33,7 +33,7 @@ public BloscCodec(
3333
}
3434

3535
@Override
36-
public ByteBuffer decode(ByteBuffer chunkBytes, ArrayMetadata.CoreArrayMetadata arrayMetadata)
36+
public ByteBuffer decode(ByteBuffer chunkBytes)
3737
throws ZarrException {
3838
try {
3939
return ByteBuffer.wrap(Blosc.decompress(Utils.toArray(chunkBytes)));
@@ -43,7 +43,7 @@ public ByteBuffer decode(ByteBuffer chunkBytes, ArrayMetadata.CoreArrayMetadata
4343
}
4444

4545
@Override
46-
public ByteBuffer encode(ByteBuffer chunkBytes, ArrayMetadata.CoreArrayMetadata arrayMetadata)
46+
public ByteBuffer encode(ByteBuffer chunkBytes)
4747
throws ZarrException {
4848
try {
4949
return ByteBuffer.wrap(

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import javax.annotation.Nonnull;
1212
import ucar.ma2.Array;
1313

14-
public class BytesCodec implements ArrayBytesCodec {
14+
public class BytesCodec extends ArrayBytesCodec {
1515

1616
public final String name = "bytes";
1717
@Nonnull
@@ -29,14 +29,14 @@ public BytesCodec(Endian endian) {
2929
}
3030

3131
@Override
32-
public Array decode(ByteBuffer chunkBytes, ArrayMetadata.CoreArrayMetadata arrayMetadata) {
32+
public Array decode(ByteBuffer chunkBytes) {
3333
chunkBytes.order(configuration.endian.getByteOrder());
3434
return Array.factory(arrayMetadata.dataType.getMA2DataType(), arrayMetadata.chunkShape,
3535
chunkBytes);
3636
}
3737

3838
@Override
39-
public ByteBuffer encode(Array chunkArray, ArrayMetadata.CoreArrayMetadata arrayMetadata) {
39+
public ByteBuffer encode(Array chunkArray) {
4040
return chunkArray.getDataAsByteBuffer(configuration.endian.getByteOrder());
4141
}
4242

@@ -72,7 +72,7 @@ public ByteOrder getByteOrder() {
7272
}
7373
}
7474

75-
public static final class Configuration {
75+
public static final class Configuration{
7676

7777
@Nonnull
7878
public final BytesCodec.Endian endian;

0 commit comments

Comments
 (0)