Skip to content

Commit 218f079

Browse files
committed
memorystore map string keys
1 parent 2d29a3b commit 218f079

7 files changed

Lines changed: 85 additions & 35 deletions

File tree

src/main/java/dev/zarr/zarrjava/core/Group.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,14 @@ public static Group open(String path) throws IOException, ZarrException {
6464
}
6565

6666
@Nullable
67-
public abstract Node get(String key) throws ZarrException;
67+
public abstract Node get(String key) throws ZarrException, IOException;
6868

6969
public Stream<Node> list() {
7070
return storeHandle.list()
7171
.map(key -> {
7272
try {
7373
return get(key);
74-
} catch (ZarrException e) {
74+
} catch (Exception e) {
7575
throw new RuntimeException(e);
7676
}
7777
})
Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,36 @@
11
package dev.zarr.zarrjava.store;
22

3+
import dev.zarr.zarrjava.core.chunkkeyencoding.Separator;
4+
35
import javax.annotation.Nonnull;
46
import javax.annotation.Nullable;
57
import java.nio.ByteBuffer;
8+
import java.nio.file.Path;
69
import java.util.HashMap;
710
import java.util.HashSet;
811
import java.util.Map;
912
import java.util.Set;
1013
import java.util.stream.Stream;
1114

1215
public class MemoryStore implements Store, Store.ListableStore {
13-
private final Map<String[], byte[]> map = new HashMap<>();
16+
private final Map<String, byte[]> map = new HashMap<>();
17+
Separator separator;
18+
19+
public MemoryStore(Separator separator){
20+
this.separator = separator;
21+
}
22+
23+
public MemoryStore(){
24+
this(Separator.SLASH);
25+
}
26+
27+
String resolveKeys(String[] keys) {
28+
return String.join(separator.getValue(), keys);
29+
}
1430

1531
@Override
1632
public boolean exists(String[] keys) {
17-
return map.containsKey(keys);
33+
return map.containsKey(resolveKeys(keys));
1834
}
1935

2036
@Nullable
@@ -32,32 +48,36 @@ public ByteBuffer get(String[] keys, long start) {
3248
@Nullable
3349
@Override
3450
public ByteBuffer get(String[] keys, long start, long end) {
35-
if(end>Integer.MAX_VALUE) throw new RuntimeException("TODO");
36-
if(!map.containsKey(keys)) return null; //TODO: necessary?
37-
if (end < 0) end = map.get(keys).length - end;
38-
return ByteBuffer.wrap(map.get(keys), (int) start, (int) end);
51+
byte[] bytes = map.get(resolveKeys(keys));
52+
if (bytes == null) return null;
53+
if (end < 0) end = bytes.length;
54+
if (end > Integer.MAX_VALUE) throw new RuntimeException("TODO"); //TODO
55+
return ByteBuffer.wrap(bytes, (int) start, (int) end);
3956
}
4057

4158

4259
@Override
4360
public void set(String[] keys, ByteBuffer bytes) {
44-
map.put(keys, bytes.array());
61+
map.put(resolveKeys(keys), bytes.array());
4562
}
4663

4764
@Override
4865
public void delete(String[] keys) {
49-
map.remove(keys);
66+
map.remove(resolveKeys(keys));
5067
}
5168

5269
public Stream<String> list(String[] keys) {
70+
String prefix = resolveKeys(keys);
5371
Set<String> allKeys = new HashSet<>();
54-
for(String[] k: map.keySet()){
55-
if (!equalFirstKeys(k, keys, keys.length));
56-
String key = "";
57-
for (String s : k) {
58-
key += s + "/";
59-
allKeys.add(key);
60-
}
72+
73+
for (String k : map.keySet()) {
74+
if (!k.startsWith(prefix)) continue;
75+
String current = "";
76+
for (String s : k.split(separator.getValue())) {
77+
current += s;
78+
allKeys.add(current);
79+
current += separator.getValue();
80+
}
6181
}
6282
return allKeys.stream();
6383
}
@@ -72,14 +92,4 @@ public StoreHandle resolve(String... keys) {
7292
public String toString() {
7393
return String.format("<MemoryStore {%s}>", hashCode());
7494
}
75-
76-
private boolean equalFirstKeys(String[] k1, String[] k2, int n){
77-
if (k1.length < n || k2.length < n) return false;
78-
for (int i = 0; i < n; i++) {
79-
if(!k1[i].equals(k2[i]))
80-
return false;
81-
}
82-
return true;
83-
}
84-
8595
}

src/main/java/dev/zarr/zarrjava/v2/Group.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import javax.annotation.Nullable;
1111
import java.io.IOException;
1212
import java.nio.ByteBuffer;
13+
import java.nio.file.NoSuchFileException;
1314
import java.nio.file.Path;
1415
import java.nio.file.Paths;
1516
import java.util.function.Function;
@@ -60,11 +61,11 @@ public static Group create(String path) throws IOException, ZarrException {
6061
}
6162

6263
@Nullable
63-
public Node get(String key) throws ZarrException {
64+
public Node get(String key) throws ZarrException, IOException {
6465
StoreHandle keyHandle = storeHandle.resolve(key);
6566
try {
6667
return Node.open(keyHandle);
67-
} catch (IOException e) {
68+
} catch (NoSuchFileException e) {
6869
return null;
6970
}
7071
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import dev.zarr.zarrjava.utils.Utils;
88
import java.io.IOException;
99
import java.nio.ByteBuffer;
10+
import java.nio.file.NoSuchFileException;
1011
import java.nio.file.Path;
1112
import java.nio.file.Paths;
1213
import java.util.Map;
@@ -79,11 +80,11 @@ public static Group create(String path) throws IOException, ZarrException {
7980
}
8081

8182
@Nullable
82-
public Node get(String key) throws ZarrException {
83+
public Node get(String key) throws ZarrException, IOException{
8384
StoreHandle keyHandle = storeHandle.resolve(key);
8485
try {
8586
return Node.open(keyHandle);
86-
} catch (IOException e) {
87+
} catch (NoSuchFileException e) {
8788
return null;
8889
}
8990
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import java.io.IOException;
1212
import java.nio.ByteBuffer;
13+
import java.nio.file.NoSuchFileException;
1314
import java.nio.file.Path;
1415
import java.nio.file.Paths;
1516

src/test/java/dev/zarr/zarrjava/ZarrStoreTest.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package dev.zarr.zarrjava;
22

33
import com.fasterxml.jackson.databind.ObjectMapper;
4-
import dev.zarr.zarrjava.store.FilesystemStore;
5-
import dev.zarr.zarrjava.store.HttpStore;
6-
import dev.zarr.zarrjava.store.S3Store;
4+
import dev.zarr.zarrjava.core.chunkkeyencoding.Separator;
5+
import dev.zarr.zarrjava.store.*;
76
import dev.zarr.zarrjava.v3.*;
87
import org.junit.jupiter.api.Assertions;
98
import org.junit.jupiter.api.Test;
9+
import org.junit.jupiter.params.ParameterizedTest;
10+
import org.junit.jupiter.params.provider.CsvSource;
1011
import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider;
1112
import software.amazon.awssdk.regions.Region;
1213
import software.amazon.awssdk.services.s3.S3Client;
@@ -17,7 +18,7 @@
1718
import static dev.zarr.zarrjava.v3.Node.makeObjectMapper;
1819

1920
public class ZarrStoreTest extends ZarrTest {
20-
@Test
21+
@Test
2122
public void testFileSystemStores() throws IOException, ZarrException {
2223
FilesystemStore fsStore = new FilesystemStore(TESTDATA);
2324
ObjectMapper objectMapper = makeObjectMapper();
@@ -78,4 +79,22 @@ public void testHttpStore() throws IOException, ZarrException {
7879

7980
Assertions.assertArrayEquals(new long[]{1, 4096, 4096, 2048}, array.metadata().shape);
8081
}
82+
83+
@ParameterizedTest
84+
@CsvSource({
85+
"DOT", "SLASH"
86+
})
87+
public void testMemoryStore(Separator separator) throws ZarrException, IOException {
88+
StoreHandle storeHandle = new MemoryStore(separator).resolve();
89+
Group group = Group.create(storeHandle);
90+
Array array = group.createArray("array", b -> b
91+
.withShape(10, 10)
92+
.withDataType(DataType.UINT8)
93+
.withChunkShape(5, 5)
94+
);
95+
group.createGroup("subgroup");
96+
Assertions.assertEquals(2, group.list().count());
97+
for(String s: storeHandle.list().toArray(String[]::new))
98+
System.out.println(s);
99+
}
81100
}

src/test/java/dev/zarr/zarrjava/ZarrV2Test.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package dev.zarr.zarrjava;
22

3+
import dev.zarr.zarrjava.core.chunkkeyencoding.Separator;
34
import dev.zarr.zarrjava.store.FilesystemStore;
5+
import dev.zarr.zarrjava.store.MemoryStore;
46
import dev.zarr.zarrjava.store.StoreHandle;
57
import dev.zarr.zarrjava.v2.Array;
68
import dev.zarr.zarrjava.v2.ArrayMetadata;
@@ -255,4 +257,20 @@ public void testCreateGroup() throws ZarrException, IOException {
255257
Group.create(storeHandleString);
256258
Assertions.assertTrue(Files.exists(Paths.get(storeHandleString).resolve(".zgroup")));
257259
}
260+
261+
@Test
262+
public void testMemoryStore() throws ZarrException, IOException {
263+
StoreHandle storeHandle = new MemoryStore().resolve();
264+
Group group = Group.create(storeHandle);
265+
Array array = group.createArray("array", b -> b
266+
.withShape(10, 10)
267+
.withDataType(DataType.UINT8)
268+
.withChunks(5, 5)
269+
);
270+
group.createGroup("subgroup");
271+
Assertions.assertEquals(2, group.list().count());
272+
for(String s: storeHandle.list().toArray(String[]::new))
273+
System.out.println(s);
274+
}
275+
258276
}

0 commit comments

Comments
 (0)