Skip to content

Commit 135506d

Browse files
add test of groups
1 parent 539ae58 commit 135506d

File tree

5 files changed

+105
-12
lines changed

5 files changed

+105
-12
lines changed

src/ZarrDatasets.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import CommonDataModel:
1616
defAttrib,
1717
defVar,
1818
defDim,
19+
defGroup,
1920
dim,
2021
dimnames,
2122
iswritable,

src/dataset.jl

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,19 @@ CDM.dimnames(ds::ZarrDataset) = Tuple(String.(keys(ds.dimensions)))
1818
# return ul
1919
# end
2020

21-
# function _dim(ds::ZarrDataset,dimname::SymbolOrString)
22-
# if haskey(ds.dimensions,name)
23-
# return ds.dimensions[name]
24-
# elseif ds.parentdataset !== nothing
25-
# return _dim(ds.parentdataset,name)
26-
# end
27-
# return nothing
28-
# end
21+
function _dim(ds::ZarrDataset,dimname::SymbolOrString)
22+
dimlen = get(ds.dimensions,Symbol(dimname),nothing)
23+
24+
if !isnothing(dimlen)
25+
return dimlen
26+
end
27+
28+
if ds.parentdataset !== nothing
29+
return _dim(ds.parentdataset,dimname)
30+
end
31+
32+
error("dimension $dimname is not defined")
33+
end
2934

3035
CDM.dim(ds::ZarrDataset,dimname::SymbolOrString) = ds.dimensions[Symbol(dimname)]
3136

@@ -50,8 +55,23 @@ function CDM.defAttrib(ds::ZarrDataset,name::SymbolOrString,value)
5055
storage[ds.zgroup.path,".zattrs"] = take!(io)
5156
end
5257

58+
# groups
59+
60+
function CDM.defGroup(ds::ZarrDataset,groupname::SymbolOrString; attrib = Dict())
61+
_attrib = Dict{String,Any}(attrib)
62+
zg = zgroup(ds.zgroup,String(groupname),attrs = _attrib)
63+
dimensions = OrderedDict{Symbol,Int}()
64+
return ZarrDataset(ds,zg,dimensions,ds.iswritable,ds.maskingvalue)
65+
end
66+
5367
CDM.groupnames(ds::ZarrDataset) = keys(ds.zgroup.groups)
54-
CDM.group(ds::ZarrDataset,name::SymbolOrString) = ZarrDataset(ds.zgroup.groups,String(name),ds)
68+
69+
function CDM.group(ds::ZarrDataset,groupname::SymbolOrString)
70+
dimensions = OrderedDict{Symbol,Int}()
71+
zg = ds.zgroup.groups[String(groupname)]
72+
return ZarrDataset(ds,zg,dimensions,ds.iswritable,ds.maskingvalue)
73+
end
74+
5575

5676

5777
CDM.parentdataset(ds::ZarrDataset) = ds.parentdataset
@@ -161,4 +181,4 @@ end
161181
export ZarrDataset
162182
export defDim
163183
export defVar
164-
#export defGroup
184+
export defGroup

src/variable.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ haschunks(v::ZarrVariable) = haschunks(v.zarray)
4444
eachchunk(v::CFVariable{T,N,<:ZarrVariable}) where {T,N} = eachchunk(v.var)
4545
haschunks(v::CFVariable{T,N,<:ZarrVariable}) where {T,N} = haschunks(v.var)
4646

47-
4847
function CDM.defVar(ds::ZarrDataset,name::SymbolOrString,vtype::DataType,dimensionnames; chunksizes=nothing, attrib = Dict(), fillvalue = nothing, kwargs...)
4948
@assert iswritable(ds)
5049

@@ -56,7 +55,7 @@ function CDM.defVar(ds::ZarrDataset,name::SymbolOrString,vtype::DataType,dimensi
5655
_attrib["_ARRAY_DIMENSIONS"] = reverse(dimensionnames)
5756

5857
_size = ntuple(length(dimensionnames)) do i
59-
ds.dimensions[Symbol(dimensionnames[i])]
58+
_dim(ds,dimensionnames[i])
6059
end
6160

6261
if isnothing(chunksizes)

test/runtests.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ using ZarrDatasets
55
include("test_cdm.jl")
66
include("test_multifile.jl")
77
include("test_write.jl")
8+
include("test_groups.jl")
89
include("test_aqua.jl")
910
end

test/test_groups.jl

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using ZarrDatasets
2+
using Test
3+
4+
data = rand(Int32,3,5)
5+
data2 = rand(Int8,3,5)
6+
data3 = rand(Int16,4)
7+
8+
fname = tempname()
9+
mkdir(fname)
10+
11+
12+
TDS = ZarrDataset
13+
14+
#using NCDatasets
15+
#TDS = NCDataset
16+
ds = TDS(fname,"c")
17+
defDim(ds,"lon",3)
18+
defDim(ds,"lat",5)
19+
20+
attrib = Dict(
21+
"units" => "m/s",
22+
"long_name" => "test",
23+
)
24+
25+
varname = "var2"
26+
dimensionnames = ("lon","lat")
27+
vtype = Int32
28+
29+
zv = defVar(ds,varname,vtype,dimensionnames, attrib = attrib)
30+
zv[:,:] = data
31+
zv.attrib["number"] = 12
32+
ds.attrib["history"] = "test"
33+
34+
35+
group_name = "sub-group"
36+
attrib = Dict("int_attrib" => 42)
37+
38+
dsg = defGroup(ds,group_name; attrib = attrib)
39+
40+
defDim(dsg,"time",length(data3))
41+
42+
zvg = defVar(dsg,"data2",eltype(data2),("lon","lat"))
43+
zvg[:,:] = data2
44+
zvg.attrib["standard_name"] = "test"
45+
46+
zv3 = defVar(dsg,"data3",eltype(data3),("time",))
47+
zv3[:] = data3
48+
49+
50+
@test_throws Exception defVar(dsg,"data4",Int8,("dimension_does_not_exists",))
51+
52+
53+
io = IOBuffer()
54+
show(io,ds)
55+
s = String(take!(io))
56+
@test occursin("sub-group",s)
57+
58+
close(ds)
59+
60+
# load data from group
61+
62+
ds = TDS(fname,"r")
63+
64+
@test ds["var2"][:,:] == data
65+
@test ds.group[group_name]["data2"][:,:] == data2
66+
@test ds.group[group_name]["data2"].attrib["standard_name"] == "test"
67+
@test ds.group[group_name]["data3"][:] == data3
68+
69+
@test ds.group[group_name].attrib["int_attrib"] == 42
70+
71+
display(ds)
72+
close(ds)

0 commit comments

Comments
 (0)