Skip to content

Commit 18355c6

Browse files
committed
fix: transpose codec inside shard codec
1 parent fb50c2c commit 18355c6

2 files changed

Lines changed: 69 additions & 8 deletions

File tree

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package org.janelia.saalfeldlab.n5.codec;
2+
3+
import java.util.ArrayList;
4+
5+
import org.janelia.saalfeldlab.n5.DatasetAttributes;
6+
import org.janelia.saalfeldlab.n5.N5Exception;
7+
8+
public class CodecParser {
9+
10+
public DatasetCodecInfo[] datasetCodecInfos;
11+
public BlockCodecInfo blockCodecInfo;
12+
public DataCodecInfo[] dataCodecInfos;
13+
14+
public CodecParser(CodecInfo[] codecs) {
15+
16+
parse(codecs);
17+
}
18+
19+
private void parse(CodecInfo[] codecs) {
20+
21+
final ArrayList<DataCodecInfo> dataCodecList = new ArrayList<>();
22+
final ArrayList<DatasetCodecInfo> datasetCodecList = new ArrayList<>();
23+
24+
boolean foundBlockCodec = false;
25+
26+
int i = 0;
27+
int blockCodecIndex = -1;
28+
for (CodecInfo codec : codecs) {
29+
if (!foundBlockCodec) {
30+
31+
if (codec instanceof BlockCodecInfo) {
32+
blockCodecInfo = (BlockCodecInfo)codec;
33+
foundBlockCodec = true;
34+
blockCodecIndex = i;
35+
} else if (codec instanceof DatasetCodecInfo)
36+
datasetCodecList.add((DatasetCodecInfo)codec);
37+
else
38+
throw new N5Exception("Codec at index " + i + " is a DataCodec, but came before a BlockCodec.");
39+
40+
} else if (codec instanceof BlockCodecInfo)
41+
throw new N5Exception("Codec at index " + i + " is a BlockCodec, but came after a BlockCodec at position " + blockCodecIndex);
42+
else if (codec instanceof DatasetCodecInfo)
43+
throw new N5Exception("Codec at index " + i + " is a DatasetCodec, but came after a BlockCodec at position " + blockCodecIndex);
44+
else
45+
dataCodecList.add((DataCodecInfo)codec);
46+
47+
i++;
48+
}
49+
50+
datasetCodecInfos = datasetCodecList.stream().toArray(n -> new DatasetCodecInfo[n]);
51+
dataCodecInfos = dataCodecList.stream().toArray(n -> new DataCodecInfo[n]);
52+
}
53+
54+
private static CodecInfo[] concatenateCodecs(DatasetAttributes attributes) {
55+
56+
final CodecInfo[] codecs = new CodecInfo[attributes.getDataCodecInfos().length + 1];
57+
codecs[0] = attributes.getBlockCodecInfo();
58+
System.arraycopy(attributes.getDataCodecInfos(), 0, codecs, 1, attributes.getDataCodecInfos().length);
59+
return codecs;
60+
}
61+
}

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@
3434
import org.janelia.saalfeldlab.n5.codec.BlockCodec;
3535
import org.janelia.saalfeldlab.n5.codec.BlockCodecInfo;
3636
import org.janelia.saalfeldlab.n5.codec.CodecInfo;
37+
import org.janelia.saalfeldlab.n5.codec.CodecParser;
3738
import org.janelia.saalfeldlab.n5.codec.DataCodecInfo;
39+
import org.janelia.saalfeldlab.n5.codec.DatasetCodecInfo;
3840
import org.janelia.saalfeldlab.n5.serialization.N5Annotations;
3941
import org.janelia.saalfeldlab.n5.serialization.NameConfig;
4042
import org.janelia.saalfeldlab.n5.shard.ShardIndex.IndexLocation;
@@ -63,6 +65,8 @@ public String getType() {
6365
@NameConfig.Parameter(value = "index_codecs")
6466
private CodecInfo[] indexCodecs;
6567

68+
private transient DatasetCodecInfo[] innerDatasetCodecInfo;
69+
6670
private transient BlockCodecInfo innerBlockCodecInfo;
6771

6872
private transient DataCodecInfo[] innerDataCodecInfos;
@@ -106,14 +110,10 @@ private void build() {
106110
// from
107111
// codecs and indexCodecs
108112

109-
if (codecs[0] instanceof BlockCodecInfo)
110-
innerBlockCodecInfo = (BlockCodecInfo)codecs[0];
111-
else
112-
throw new N5Exception("Codec at index " + 0 + " must be a BlockCodec.");
113-
114-
innerDataCodecInfos = new DataCodecInfo[codecs.length - 1];
115-
for (int i = 1; i < codecs.length; i++)
116-
innerDataCodecInfos[i - 1] = (DataCodecInfo)codecs[i];
113+
final CodecParser parser = new CodecParser(codecs);
114+
innerDatasetCodecInfo = parser.datasetCodecInfos;
115+
innerBlockCodecInfo = parser.blockCodecInfo;
116+
innerDataCodecInfos = parser.dataCodecInfos;
117117

118118
if (indexCodecs[0] instanceof BlockCodecInfo)
119119
indexBlockCodecInfo = (BlockCodecInfo)indexCodecs[0];

0 commit comments

Comments
 (0)