Skip to content

Commit b8266b5

Browse files
committed
Add methods to construct a ZarrDataset from Zarr.jl objects
This commit allows the user to construct a ZarrDataset from a `Zarr.AbstractStore` or `Zarr.ZGroup`. It also refactors the pipeline such that strings open stores, stores open ZGroups, and then ZGroups are finally wrapped in ZarrDataset. This way, all of the infrastructure is reused and bugfixes are cleaner.
1 parent 5dc7251 commit b8266b5

File tree

3 files changed

+82
-11
lines changed

3 files changed

+82
-11
lines changed

src/dataset.jl

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -135,33 +135,54 @@ function ZarrDataset(url::AbstractString,mode = "r";
135135
)
136136

137137
dimensions = OrderedDict{Symbol,Int}()
138-
iswritable = false
139138

140-
if mode == "r"
139+
zg = if mode == "r"
141140
zg = Zarr.zopen(url,mode)
142-
if (zg.storage isa Zarr.HTTPStore) ||
143-
(zg.storage isa Zarr.ConsolidatedStore{Zarr.HTTPStore})
141+
elseif mode == "c"
142+
store = Zarr.DirectoryStore(url)
143+
zg = zgroup(store, "",attrs = Dict{String,Any}(attrib))
144+
end
145+
ZarrDataset(zg; mode, parentdataset, _omitcode, maskingvalue, attrib)
146+
end
147+
148+
function ZarrDataset(store::Zarr.AbstractStore,mode = "r";
149+
parentdataset = nothing,
150+
_omitcode = [404,403],
151+
maskingvalue = missing,
152+
attrib = Dict(),
153+
)
154+
return ZarrDataset(zopen(store, mode); mode, parentdataset, _omitcode, maskingvalue, attrib)
155+
end
156+
157+
function ZarrDataset(zg::Zarr.ZGroup;
158+
mode = "r",
159+
parentdataset = nothing,
160+
_omitcode = [404,403],
161+
maskingvalue = missing,
162+
attrib = Dict(),
163+
)
164+
165+
dimensions = ZarrDatasets.OrderedDict{Symbol,Int}()
166+
iswritable = false
167+
if (zg.storage isa Zarr.HTTPStore) ||
168+
(zg.storage isa Zarr.ConsolidatedStore{Zarr.HTTPStore})
144169
@debug "omit chunks on HTTP error" _omitcode
145170
Zarr.missing_chunk_return_code!(zg.storage,_omitcode)
146171
end
147172

148173
for (varname,zarray) in zg.arrays
149174
for (dimname,dimlen) in zip(reverse(zarray.attrs["_ARRAY_DIMENSIONS"]),size(zarray))
150-
151175
dn = Symbol(dimname)
152176
if haskey(dimensions,dn)
153177
@assert dimensions[dn] == dimlen
154178
else
155179
dimensions[dn] = dimlen
156180
end
157-
end
158181
end
159-
elseif mode == "c"
160-
store = Zarr.DirectoryStore(url)
161-
zg = zgroup(store, "",attrs = Dict{String,Any}(attrib))
162-
iswritable = true
163182
end
164-
ZarrDataset(parentdataset,zg,dimensions,iswritable,maskingvalue)
183+
184+
return ZarrDataset(parentdataset, zg, dimensions, mode == "r" ? false : zg.writeable, maskingvalue)
185+
165186
end
166187

167188

test/runtests.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ using ZarrDatasets
77
include("test_write.jl")
88
include("test_groups.jl")
99
include("test_fillvalue.jl")
10+
include("test_preexisting.jl")
1011
include("test_aqua.jl")
1112
end

test/test_preexisting.jl

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using ZarrDatasets
2+
using Test
3+
using Zarr
4+
5+
# Test opening a ZarrDataset using a pre-existing Zarr store or group
6+
7+
# First,
8+
fname = tempname()
9+
mkdir(fname)
10+
gattrib = Dict("title" => "this is the title")
11+
ds = ZarrDataset(fname,"c",attrib = gattrib)
12+
13+
ds.attrib["number"] = 1
14+
defDim(ds,"lon",3)
15+
defDim(ds,"lat",5)
16+
17+
attrib = Dict(
18+
"units" => "m/s",
19+
"long_name" => "test",
20+
)
21+
22+
23+
varname = "var2"
24+
dimensionnames = ("lon","lat")
25+
vtype = Int32
26+
27+
zv = defVar(ds,varname,vtype,dimensionnames, attrib = attrib)
28+
zv[:,:] = data = rand(Int32,3,5)
29+
30+
zv.attrib["number"] = 12
31+
zv.attrib["standard_name"] = "test"
32+
ds.attrib["history"] = "test"
33+
close(ds)
34+
35+
for ds in ZarrDataset.((Zarr.storefromstring(fname)[1], Zarr.zopen(fname), ))
36+
37+
zv = ds[varname]
38+
39+
@test zv.attrib["number"] == 12
40+
@test zv.attrib["standard_name"] == "test"
41+
@test ds.attrib["history"] == "test"
42+
43+
@test zv[:,:] == data
44+
45+
io = IOBuffer()
46+
show(io,ds)
47+
str = String(take!(io))
48+
@test occursin("Global",str)
49+
end

0 commit comments

Comments
 (0)