Skip to content

Commit 894816d

Browse files
Merge pull request #7 from JuliaGeo/as/dataset_from_store
Add methods to construct a ZarrDataset from Zarr.jl objects
2 parents 5dc7251 + 5e842a3 commit 894816d

File tree

5 files changed

+95
-12
lines changed

5 files changed

+95
-12
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ZarrDatasets"
22
uuid = "519a4cdf-1362-424a-9ea1-b1d782dbb24b"
33
authors = ["Alexander Barth <[email protected]> and contributors"]
4-
version = "0.1.2"
4+
version = "0.1.3"
55

66
[deps]
77
CommonDataModel = "1fbeeb36-5f17-413c-809b-666fb144f157"

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,14 @@ NCDataset("$(dataset_id)_selection.nc","c") do ds_nc
4949
write(ds_nc,ds_sub)
5050
end
5151
```
52+
53+
## Using a pre-existing Zarr array or store
54+
55+
It's also simple to wrap an existing Zarr array, or a manually constructed Zarr store, in a `ZarrDataset`:
56+
57+
```julia
58+
zg = zopen("/path/to/zarr")
59+
zd = ZarrDataset(zg)
60+
```
61+
62+
and you can pass a constructed `Zarr.AbstractStore` similarly.

src/dataset.jl

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ CDM.maskingvalue(ds::ZarrDataset) = ds.maskingvalue
8383
ds = ZarrDataset(url::AbstractString,mode = "r";
8484
_omitcode = [404,403],
8585
maskingvalue = missing)
86+
ZarrDataset(zg::Zarr.ZGroup; _omitcode, maskingvalue)
8687
ZarrDataset(f::Function,url::AbstractString,mode = "r";
8788
maskingvalue = missing)
8889
@@ -135,33 +136,54 @@ function ZarrDataset(url::AbstractString,mode = "r";
135136
)
136137

137138
dimensions = OrderedDict{Symbol,Int}()
138-
iswritable = false
139139

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

148174
for (varname,zarray) in zg.arrays
149175
for (dimname,dimlen) in zip(reverse(zarray.attrs["_ARRAY_DIMENSIONS"]),size(zarray))
150-
151176
dn = Symbol(dimname)
152177
if haskey(dimensions,dn)
153178
@assert dimensions[dn] == dimlen
154179
else
155180
dimensions[dn] = dimlen
156181
end
157-
end
158182
end
159-
elseif mode == "c"
160-
store = Zarr.DirectoryStore(url)
161-
zg = zgroup(store, "",attrs = Dict{String,Any}(attrib))
162-
iswritable = true
163183
end
164-
ZarrDataset(parentdataset,zg,dimensions,iswritable,maskingvalue)
184+
185+
return ZarrDataset(parentdataset, zg, dimensions, mode == "r" ? false : zg.writeable, maskingvalue)
186+
165187
end
166188

167189

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)