Skip to content

Commit 5f08ffc

Browse files
committed
feat: implement dataset codecs inside sharding codecs
* what to do when transpose it outside a shard codec is unclear
1 parent 18355c6 commit 5f08ffc

3 files changed

Lines changed: 55 additions & 5 deletions

File tree

src/main/java/org/janelia/saalfeldlab/n5/DatasetAttributes.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,8 @@ protected DatasetAccess<?> createDatasetAccess() {
210210

211211
BlockCodecInfo currentBlockCodecInfo = blockCodecInfo;
212212
DataCodecInfo[] currentDataCodecInfos = dataCodecInfos;
213+
214+
DatasetCodecInfo[] datasetCodecInfos = this.datasetCodecInfos;
213215

214216
final NestedGrid grid = new NestedGrid(blockSizes, dimensions);
215217
final BlockCodec<?>[] blockCodecs = new BlockCodec[m];
@@ -219,16 +221,33 @@ protected DatasetAccess<?> createDatasetAccess() {
219221
final ShardCodecInfo info = (ShardCodecInfo) currentBlockCodecInfo;
220222
currentBlockCodecInfo = info.getInnerBlockCodecInfo();
221223
currentDataCodecInfos = info.getInnerDataCodecInfos();
224+
if (info.getInnerDataCodecInfos() != null) {
225+
if (datasetCodecInfos != null && datasetCodecInfos.length > 0) {
226+
throw new N5Exception.N5JsonParseException("Found DatasetCodecs both inside and outside of shards. Not handled");
227+
}
228+
else
229+
datasetCodecInfos = info.getInnerDatasetCodecInfos();
230+
}
222231
}
223232
}
224233

234+
// add dataset codecs
235+
blockCodecs[0] = blockCodecWithDatasetCodecs(this, blockCodecs[0], datasetCodecInfos);
236+
237+
return new DefaultDatasetAccess<>(grid, blockCodecs);
238+
}
239+
240+
@SuppressWarnings("unchecked")
241+
private static BlockCodec<?> blockCodecWithDatasetCodecs(final DatasetAttributes attributes, final BlockCodec<?> blockCodec,
242+
final DatasetCodecInfo[] datasetCodecInfos) {
243+
244+
BlockCodec<?> result = blockCodec;
225245
if (datasetCodecInfos != null) {
226246
for (final DatasetCodecInfo info : datasetCodecInfos) {
227-
blockCodecs[0] = DatasetCodec.concatenate(info.create(this), (BlockCodec) blockCodecs[0]);
247+
result = DatasetCodec.concatenate(info.create(attributes), (BlockCodec)result);
228248
}
229249
}
230-
231-
return new DefaultDatasetAccess<>(grid, blockCodecs);
250+
return result;
232251
}
233252

234253
private static int nestingDepth(BlockCodecInfo info) {

src/main/java/org/janelia/saalfeldlab/n5/shard/DefaultShardCodecInfo.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public String getType() {
6565
@NameConfig.Parameter(value = "index_codecs")
6666
private CodecInfo[] indexCodecs;
6767

68-
private transient DatasetCodecInfo[] innerDatasetCodecInfo;
68+
private transient DatasetCodecInfo[] innerDatasetCodecInfos;
6969

7070
private transient BlockCodecInfo innerBlockCodecInfo;
7171

@@ -82,13 +82,15 @@ public String getType() {
8282

8383
public DefaultShardCodecInfo(
8484
final int[] innerBlockSize,
85+
final DatasetCodecInfo[] innerDatasetCodecInfos,
8586
final BlockCodecInfo innerBlockCodecInfo,
8687
final DataCodecInfo[] innerDataCodecInfos,
8788
final BlockCodecInfo indexBlockCodecInfo,
8889
final DataCodecInfo[] indexDataCodecInfos,
8990
final IndexLocation indexLocation) {
9091

9192
this.innerBlockSize = innerBlockSize;
93+
this.innerDatasetCodecInfos = innerDatasetCodecInfos;
9294
this.innerBlockCodecInfo = innerBlockCodecInfo;
9395
this.innerDataCodecInfos = innerDataCodecInfos;
9496
this.indexBlockCodecInfo = indexBlockCodecInfo;
@@ -98,6 +100,23 @@ public DefaultShardCodecInfo(
98100
codecs = concatenateCodecs(innerBlockCodecInfo, innerDataCodecInfos);
99101
indexCodecs = concatenateCodecs(indexBlockCodecInfo, indexDataCodecInfos);
100102
}
103+
104+
public DefaultShardCodecInfo(
105+
final int[] innerBlockSize,
106+
final BlockCodecInfo innerBlockCodecInfo,
107+
final DataCodecInfo[] innerDataCodecInfos,
108+
final BlockCodecInfo indexBlockCodecInfo,
109+
final DataCodecInfo[] indexDataCodecInfos,
110+
final IndexLocation indexLocation) {
111+
112+
this(innerBlockSize,
113+
null,
114+
innerBlockCodecInfo,
115+
innerDataCodecInfos,
116+
indexBlockCodecInfo,
117+
indexDataCodecInfos,
118+
indexLocation);
119+
}
101120

102121
private void build() {
103122

@@ -111,7 +130,7 @@ private void build() {
111130
// codecs and indexCodecs
112131

113132
final CodecParser parser = new CodecParser(codecs);
114-
innerDatasetCodecInfo = parser.datasetCodecInfos;
133+
innerDatasetCodecInfos = parser.datasetCodecInfos;
115134
innerBlockCodecInfo = parser.blockCodecInfo;
116135
innerDataCodecInfos = parser.dataCodecInfos;
117136

@@ -130,6 +149,11 @@ public int[] getInnerBlockSize() {
130149
return innerBlockSize;
131150
}
132151

152+
@Override
153+
public DatasetCodecInfo[] getInnerDatasetCodecInfos() {
154+
return innerDatasetCodecInfos;
155+
}
156+
133157
@Override
134158
public BlockCodecInfo getInnerBlockCodecInfo() {
135159
return innerBlockCodecInfo;

src/main/java/org/janelia/saalfeldlab/n5/shard/ShardCodecInfo.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.janelia.saalfeldlab.n5.DataType;
3232
import org.janelia.saalfeldlab.n5.codec.BlockCodecInfo;
3333
import org.janelia.saalfeldlab.n5.codec.DataCodecInfo;
34+
import org.janelia.saalfeldlab.n5.codec.DatasetCodecInfo;
3435
import org.janelia.saalfeldlab.n5.shard.ShardIndex.IndexLocation;
3536

3637
public interface ShardCodecInfo extends BlockCodecInfo {
@@ -42,6 +43,12 @@ public interface ShardCodecInfo extends BlockCodecInfo {
4243
*/
4344
int[] getInnerBlockSize();
4445

46+
/**
47+
*
48+
* @return the collection of DatasetCodecInfo applied to data blocks for this shard
49+
*/
50+
DatasetCodecInfo[] getInnerDatasetCodecInfos();
51+
4552
/**
4653
* BlockCodecInfo for shard elements (either nested shard or DataBlock)
4754
*

0 commit comments

Comments
 (0)