Skip to content

Commit e630054

Browse files
allow the construction of the multi-file data based on a list of abstract datasets
1 parent 3c33dc3 commit e630054

File tree

3 files changed

+33
-5
lines changed

3 files changed

+33
-5
lines changed

src/memory_dataset.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ CDM.attribnames(md::Union{MemoryDataset,MemoryVariable}) = keys(md._attrib)
118118
CDM.attrib(md::Union{MemoryDataset,MemoryVariable},name::SymbolOrString) = md._attrib[String(name)]
119119

120120

121-
CDM.groupnames(md::MemoryDataset) = keys(md._group)
121+
CDM.groupnames(md::MemoryDataset) = collect(keys(md._group))
122122
CDM.group(md::MemoryDataset,name::SymbolOrString) = md._group[String(name)]
123123

124124
function CDM.defDim(md::MemoryDataset,name::SymbolOrString,len)

src/multifile.jl

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,12 @@ end
5252

5353
unlimited(ds::MFDataset) = unique(reduce(vcat,unlimited.(ds.ds)))
5454

55-
groupnames(ds::MFDataset) = groupnames(ds.ds[1])
55+
groupnames(ds::MFDataset) = unique(reduce(vcat,groupnames.(ds.ds)))
5656

5757
function group(mfds::MFDataset,name::SymbolOrString)
58-
ds = group.(mfds.ds,name)
58+
ds_sel = filter(ds -> name in groupnames(ds),mfds.ds)
59+
60+
ds = group.(ds_sel,name)
5961
constvars = Symbol[]
6062
return MFDataset(ds,mfds.aggdim,mfds.isnewdim,constvars)
6163
end
@@ -84,7 +86,10 @@ function MFDataset(ds,aggdim,isnewdim,constvars)
8486
end
8587

8688

87-
function MFDataset(TDS,fnames::AbstractArray{<:AbstractString,N},mode = "r"; aggdim = nothing,
89+
# when aggdim is "", the variables list of each file is
90+
# merged and no variable is concatanted
91+
function MFDataset(TDS,fnames::AbstractArray{<:AbstractString,N},mode = "r";
92+
aggdim = nothing,
8893
deferopen = true,
8994
_aggdimconstant = false,
9095
isnewdim = false,
@@ -125,6 +130,25 @@ function MFDataset(TDS,fnames::AbstractArray{<:AbstractString,N},mode = "r"; agg
125130
return mfds
126131
end
127132

133+
"""
134+
mfds = MFDataset(ds)
135+
136+
Virtually concatente a vector of AbstractDataset (`ds`) by merging the list
137+
of variables. Every variable which happend to be repeated in several datasets
138+
is assumed to be constant accorss all datasets.
139+
"""
140+
function MFDataset(ds::AbstractVector{<:AbstractDataset};
141+
aggdim = nothing,
142+
deferopen = true,
143+
_aggdimconstant = false,
144+
isnewdim = false,
145+
constvars = Union{Symbol,String}[],
146+
)
147+
148+
MFDataset(ds,aggdim,isnewdim,Symbol.(constvars))
149+
end
150+
151+
128152

129153
function close(mfds::MFDataset)
130154
close.(mfds.ds)
@@ -192,8 +216,9 @@ function variable(mfds::MFDataset,varname::SymbolOrString)
192216

193217
if (dim != nothing)
194218
v = CatArrays.CatArray(dim,vars...)
219+
# GRIBdatasets.dimnames can be a vector of String
195220
return MFVariable(mfds,v,
196-
dimnames(vars[1]),String(varname))
221+
Tuple(dimnames(vars[1])),String(varname))
197222
else
198223
return vars[1]
199224
end

test/test_multifile.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,9 @@ ds = TDS(fnames,aggdim = "", deferopen = false);
267267

268268
@test sort(keys(ds)) == ["ampl", "lat", "lon", "time", "vel"]
269269

270+
ds_all = TDS.(fnames)
271+
mfds = CDM.MFDataset(ds_all,aggdim = "")
272+
@test sort(keys(mfds)) == ["ampl", "lat", "lon", "time", "vel"]
270273

271274
# save a merged file
272275
fname_merged = tempname()

0 commit comments

Comments
 (0)