11package dev .zarr .zarrjava .store ;
22
3+ import dev .zarr .zarrjava .core .chunkkeyencoding .Separator ;
4+
35import javax .annotation .Nonnull ;
46import javax .annotation .Nullable ;
57import java .nio .ByteBuffer ;
8+ import java .nio .file .Path ;
69import java .util .HashMap ;
710import java .util .HashSet ;
811import java .util .Map ;
912import java .util .Set ;
1013import java .util .stream .Stream ;
1114
1215public 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}
0 commit comments