Skip to content

Commit

Permalink
add test of groups
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexander-Barth committed May 7, 2024
1 parent 539ae58 commit 135506d
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 12 deletions.
1 change: 1 addition & 0 deletions src/ZarrDatasets.jl
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import CommonDataModel:
defAttrib,
defVar,
defDim,
defGroup,
dim,
dimnames,
iswritable,
Expand Down
40 changes: 30 additions & 10 deletions src/dataset.jl
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,19 @@ CDM.dimnames(ds::ZarrDataset) = Tuple(String.(keys(ds.dimensions)))
# return ul
# end

# function _dim(ds::ZarrDataset,dimname::SymbolOrString)
# if haskey(ds.dimensions,name)
# return ds.dimensions[name]
# elseif ds.parentdataset !== nothing
# return _dim(ds.parentdataset,name)
# end
# return nothing
# end
function _dim(ds::ZarrDataset,dimname::SymbolOrString)
dimlen = get(ds.dimensions,Symbol(dimname),nothing)

if !isnothing(dimlen)
return dimlen
end

if ds.parentdataset !== nothing
return _dim(ds.parentdataset,dimname)
end

error("dimension $dimname is not defined")
end

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

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

# groups

function CDM.defGroup(ds::ZarrDataset,groupname::SymbolOrString; attrib = Dict())
_attrib = Dict{String,Any}(attrib)
zg = zgroup(ds.zgroup,String(groupname),attrs = _attrib)
dimensions = OrderedDict{Symbol,Int}()
return ZarrDataset(ds,zg,dimensions,ds.iswritable,ds.maskingvalue)
end

CDM.groupnames(ds::ZarrDataset) = keys(ds.zgroup.groups)
CDM.group(ds::ZarrDataset,name::SymbolOrString) = ZarrDataset(ds.zgroup.groups,String(name),ds)

function CDM.group(ds::ZarrDataset,groupname::SymbolOrString)
dimensions = OrderedDict{Symbol,Int}()
zg = ds.zgroup.groups[String(groupname)]
return ZarrDataset(ds,zg,dimensions,ds.iswritable,ds.maskingvalue)
end



CDM.parentdataset(ds::ZarrDataset) = ds.parentdataset
Expand Down Expand Up @@ -161,4 +181,4 @@ end
export ZarrDataset
export defDim
export defVar
#export defGroup
export defGroup
3 changes: 1 addition & 2 deletions src/variable.jl
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ haschunks(v::ZarrVariable) = haschunks(v.zarray)
eachchunk(v::CFVariable{T,N,<:ZarrVariable}) where {T,N} = eachchunk(v.var)
haschunks(v::CFVariable{T,N,<:ZarrVariable}) where {T,N} = haschunks(v.var)


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

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

_size = ntuple(length(dimensionnames)) do i
ds.dimensions[Symbol(dimensionnames[i])]
_dim(ds,dimensionnames[i])
end

if isnothing(chunksizes)
Expand Down
1 change: 1 addition & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ using ZarrDatasets
include("test_cdm.jl")
include("test_multifile.jl")
include("test_write.jl")
include("test_groups.jl")
include("test_aqua.jl")
end
72 changes: 72 additions & 0 deletions test/test_groups.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
using ZarrDatasets
using Test

data = rand(Int32,3,5)
data2 = rand(Int8,3,5)
data3 = rand(Int16,4)

fname = tempname()
mkdir(fname)


TDS = ZarrDataset

#using NCDatasets
#TDS = NCDataset
ds = TDS(fname,"c")
defDim(ds,"lon",3)
defDim(ds,"lat",5)

attrib = Dict(
"units" => "m/s",
"long_name" => "test",
)

varname = "var2"
dimensionnames = ("lon","lat")
vtype = Int32

zv = defVar(ds,varname,vtype,dimensionnames, attrib = attrib)
zv[:,:] = data
zv.attrib["number"] = 12
ds.attrib["history"] = "test"


group_name = "sub-group"
attrib = Dict("int_attrib" => 42)

dsg = defGroup(ds,group_name; attrib = attrib)

defDim(dsg,"time",length(data3))

zvg = defVar(dsg,"data2",eltype(data2),("lon","lat"))
zvg[:,:] = data2
zvg.attrib["standard_name"] = "test"

zv3 = defVar(dsg,"data3",eltype(data3),("time",))
zv3[:] = data3


@test_throws Exception defVar(dsg,"data4",Int8,("dimension_does_not_exists",))


io = IOBuffer()
show(io,ds)
s = String(take!(io))
@test occursin("sub-group",s)

close(ds)

# load data from group

ds = TDS(fname,"r")

@test ds["var2"][:,:] == data
@test ds.group[group_name]["data2"][:,:] == data2
@test ds.group[group_name]["data2"].attrib["standard_name"] == "test"
@test ds.group[group_name]["data3"][:] == data3

@test ds.group[group_name].attrib["int_attrib"] == 42

display(ds)
close(ds)

0 comments on commit 135506d

Please sign in to comment.