1
+ # Base interface
1
2
2
- CDM. name (v:: ZarrDataset ) = Zarr. zname (v. zgroup)
3
3
Base. keys (ds:: ZarrDataset ) = keys (ds. zgroup. arrays)
4
- Base. haskey (ds:: ZarrDataset ,varname:: SymbolOrString ) = haskey (ds. zgroup. arrays,String (varname))
4
+ function Base. haskey (ds:: ZarrDataset , varname:: SymbolOrString )
5
+ haskey (ds. zgroup. arrays, String (varname))
6
+ end
5
7
6
- function CDM. variable (ds:: ZarrDataset ,varname:: SymbolOrString )
8
+ # CommonDataModel.jl interface methods
9
+
10
+ CDM. name (v:: ZarrDataset ) = Zarr. zname (v. zgroup)
11
+ function CDM. variable (ds:: ZarrDataset , varname:: SymbolOrString )
7
12
zarray = ds. zgroup. arrays[String (varname)]
8
- ZarrVariable {eltype(zarray),ndims(zarray),typeof(zarray),typeof(ds)} (zarray,ds)
13
+ ZarrVariable {eltype(zarray),ndims(zarray),typeof(zarray),typeof(ds)} (zarray, ds)
9
14
end
10
-
11
15
CDM. dimnames (ds:: ZarrDataset ) = Tuple (String .(keys (ds. dimensions)))
16
+ CDM. dim (ds:: ZarrDataset , dimname:: SymbolOrString ) = ds. dimensions[Symbol (dimname)]
17
+ CDM. varnames (ds:: ZarrDataset ) = keys (ds. zgroup. arrays)
18
+ CDM. attribnames (ds:: ZarrDataset ) = keys (ds. zgroup. attrs)
19
+ CDM. attrib (ds:: ZarrDataset , name:: SymbolOrString ) = ds. zgroup. attrs[String (name)]
12
20
13
21
# function CDM.unlimited(ds::ZarrDataset)
14
22
# ul = ds.unlimited
@@ -18,67 +26,40 @@ CDM.dimnames(ds::ZarrDataset) = Tuple(String.(keys(ds.dimensions)))
18
26
# return ul
19
27
# end
20
28
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
34
-
35
- CDM. dim (ds:: ZarrDataset ,dimname:: SymbolOrString ) = ds. dimensions[Symbol (dimname)]
36
-
37
- function CDM. defDim (ds:: ZarrDataset ,dimname:: SymbolOrString ,dimlen)
29
+ function CDM. defDim (ds:: ZarrDataset , dimname:: SymbolOrString , dimlen)
38
30
dn = Symbol (dimname)
39
- @assert ! haskey (ds. dimensions,dn)
31
+ @assert ! haskey (ds. dimensions, dn)
40
32
ds. dimensions[dn] = dimlen
41
33
end
42
34
43
- CDM. varnames (ds:: ZarrDataset ) = keys (ds. zgroup. arrays)
44
-
45
- CDM. attribnames (ds:: ZarrDataset ) = keys (ds. zgroup. attrs)
46
- CDM. attrib (ds:: ZarrDataset ,name:: SymbolOrString ) = ds. zgroup. attrs[String (name)]
47
-
48
- function CDM. defAttrib (ds:: ZarrDataset ,name:: SymbolOrString ,value)
35
+ function CDM. defAttrib (ds:: ZarrDataset , name:: SymbolOrString , value)
49
36
@assert iswritable (ds)
50
37
ds. zgroup. attrs[String (name)] = value
51
38
52
39
storage = ds. zgroup. storage
53
40
io = IOBuffer ()
54
41
JSON. print (io, ds. zgroup. attrs)
55
- storage[ds. zgroup. path," .zattrs" ] = take! (io)
42
+ storage[ds. zgroup. path, " .zattrs" ] = take! (io)
56
43
end
57
44
58
45
# groups
59
-
60
- function CDM. defGroup (ds:: ZarrDataset ,groupname:: SymbolOrString ; attrib = Dict ())
46
+ function CDM. defGroup (ds:: ZarrDataset , groupname:: SymbolOrString ; attrib= Dict ())
61
47
_attrib = Dict {String,Any} (attrib)
62
- zg = zgroup (ds. zgroup,String (groupname),attrs = _attrib)
48
+ zg = zgroup (ds. zgroup, String (groupname); attrs = _attrib)
63
49
dimensions = OrderedDict {Symbol,Int} ()
64
- return ZarrDataset (ds,zg,dimensions,ds. iswritable,ds. maskingvalue)
50
+ return ZarrDataset (ds, zg, dimensions, ds. iswritable, ds. maskingvalue)
65
51
end
66
-
67
52
CDM. groupnames (ds:: ZarrDataset ) = keys (ds. zgroup. groups)
68
-
69
- function CDM. group (ds:: ZarrDataset ,groupname:: SymbolOrString )
53
+ function CDM. group (ds:: ZarrDataset , groupname:: SymbolOrString )
70
54
dimensions = OrderedDict {Symbol,Int} ()
71
55
zg = ds. zgroup. groups[String (groupname)]
72
- return ZarrDataset (ds,zg,dimensions,ds. iswritable,ds. maskingvalue)
56
+ return ZarrDataset (ds, zg, dimensions, ds. iswritable, ds. maskingvalue)
73
57
end
74
58
75
-
76
-
77
59
CDM. parentdataset (ds:: ZarrDataset ) = ds. parentdataset
78
60
CDM. iswritable (ds:: ZarrDataset ) = ds. iswritable
79
61
CDM. maskingvalue (ds:: ZarrDataset ) = ds. maskingvalue
80
62
81
-
82
63
"""
83
64
ds = ZarrDataset(url::AbstractString,mode = "r";
84
65
_omitcode = [404,403],
@@ -90,13 +71,17 @@ CDM.maskingvalue(ds::ZarrDataset) = ds.maskingvalue
90
71
Open the zarr dataset at the url or path `url`. The mode can be `"r"` (read-only),
91
72
`"w"` (write), or `"c"` (create). `ds` supports the API of the
92
73
[JuliaGeo/CommonDataModel.jl](https://github.com/JuliaGeo/CommonDataModel.jl).
93
- The experimental `_omitcode` allows to define which HTTP error code should be used
94
- for missing chunks. For compatibility with python's Zarr, the HTTP error 403
95
- (permission denied) is also used to missing chunks in addition to 404 (not
96
- found).
97
74
98
- The parameter `maskingvalue` allows to define which special value should be used
99
- as replacement for fill values. The default is `missing`.
75
+ # Keywords
76
+
77
+ - `_omitcode`: *experimental*, allows to define which HTTP error code should be used
78
+ for missing chunks. For compatibility with python's Zarr, the HTTP error 403
79
+ (permission denied) is also used to missing chunks in addition to 404 (not
80
+ found). Default [404, 403].
81
+ - `maskingvalue`: The parameter `maskingvalue` allows to define which special
82
+ value should be used as replacement for fill values. The default is `missing`.
83
+ Defaults to `missing``.
84
+ - `attrib`: Attributes, defualts to `Dict()`
100
85
101
86
Example:
102
87
@@ -128,72 +113,80 @@ zos1 = ZarrDataset(url) do ds
128
113
end # implicit call to close(ds)
129
114
```
130
115
"""
131
- function ZarrDataset (url:: AbstractString , mode = " r" ;
132
- parentdataset = nothing ,
133
- _omitcode = [404 ,403 ],
134
- maskingvalue = missing ,
135
- attrib = Dict (),
136
- )
137
-
116
+ function ZarrDataset (
117
+ url:: AbstractString ,
118
+ mode= " r" ;
119
+ parentdataset= nothing ,
120
+ _omitcode= [404 , 403 ],
121
+ maskingvalue= missing ,
122
+ attrib= Dict (),
123
+ )
138
124
dimensions = OrderedDict {Symbol,Int} ()
139
125
140
126
zg = if mode in (" w" , " r" )
141
127
zg = Zarr. zopen (url, mode)
142
128
elseif mode == " c"
143
129
store = Zarr. DirectoryStore (url)
144
- zg = zgroup (store, " " , attrs = Dict {String,Any} (attrib))
130
+ zg = zgroup (store, " " ; attrs= Dict {String,Any} (attrib))
145
131
else
146
132
throw (ArgumentError (" mode must be \" r\" , \" w\" or \" c\" , got $mode " ))
147
133
end
148
134
ZarrDataset (zg; mode, parentdataset, _omitcode, maskingvalue, attrib)
149
135
end
150
136
151
- function ZarrDataset (store:: Zarr.AbstractStore , mode = " r" ;
152
- parentdataset = nothing ,
153
- _omitcode = [404 ,403 ],
154
- maskingvalue = missing ,
155
- attrib = Dict (),
156
- )
157
- return ZarrDataset (zopen (store, mode); mode, parentdataset, _omitcode, maskingvalue, attrib)
137
+ function ZarrDataset (
138
+ store:: Zarr.AbstractStore ,
139
+ mode= " r" ;
140
+ parentdataset= nothing ,
141
+ _omitcode= [404 , 403 ],
142
+ maskingvalue= missing ,
143
+ attrib= Dict (),
144
+ )
145
+ return ZarrDataset (
146
+ zopen (store, mode); mode, parentdataset, _omitcode, maskingvalue, attrib
147
+ )
158
148
end
159
149
160
- function ZarrDataset (zg :: Zarr.ZGroup ;
161
- mode = " r " ,
162
- parentdataset = nothing ,
163
- _omitcode = [ 404 , 403 ] ,
164
- maskingvalue = missing ,
165
- attrib = Dict () ,
166
- )
167
-
150
+ function ZarrDataset (
151
+ zg :: Zarr.ZGroup ;
152
+ mode = " r " ,
153
+ parentdataset = nothing ,
154
+ _omitcode = [ 404 , 403 ] ,
155
+ maskingvalue = missing ,
156
+ attrib = Dict (),
157
+ )
168
158
dimensions = ZarrDatasets. OrderedDict {Symbol,Int} ()
169
159
iswritable = false
170
160
if (zg. storage isa Zarr. HTTPStore) ||
171
161
(zg. storage isa Zarr. ConsolidatedStore{Zarr. HTTPStore})
172
- @debug " omit chunks on HTTP error" _omitcode
173
- Zarr. missing_chunk_return_code! (zg. storage,_omitcode)
174
- end
162
+ @debug " omit chunks on HTTP error" _omitcode
163
+ Zarr. missing_chunk_return_code! (zg. storage, _omitcode)
164
+ end
175
165
176
- for (varname,zarray) in zg. arrays
177
- for (dimname,dimlen) in zip (reverse (zarray. attrs[" _ARRAY_DIMENSIONS" ]),size (zarray))
178
- dn = Symbol (dimname)
179
- if haskey (dimensions,dn)
180
- @assert dimensions[dn] == dimlen
181
- else
182
- dimensions[dn] = dimlen
183
- end
166
+ for (varname, zarray) in zg. arrays
167
+ for (dimname, dimlen) in
168
+ zip (reverse (zarray. attrs[" _ARRAY_DIMENSIONS" ]), size (zarray))
169
+ dn = Symbol (dimname)
170
+ if haskey (dimensions, dn)
171
+ @assert dimensions[dn] == dimlen
172
+ else
173
+ dimensions[dn] = dimlen
174
+ end
184
175
end
185
176
end
186
177
187
- return ZarrDataset (parentdataset, zg, dimensions, mode == " r" ? false : zg. writeable, maskingvalue)
188
-
178
+ return ZarrDataset (
179
+ parentdataset, zg, dimensions, mode == " r" ? false : zg. writeable, maskingvalue
180
+ )
189
181
end
190
182
183
+ function ZarrDataset (
184
+ fnames:: AbstractArray{<:AbstractString,N} , args... ; kwargs...
185
+ ) where {N}
186
+ MFDataset (ZarrDataset, fnames, args... ; kwargs... )
187
+ end
191
188
192
- ZarrDataset (fnames:: AbstractArray{<:AbstractString,N} , args... ; kwargs... ) where N =
193
- MFDataset (ZarrDataset,fnames, args... ; kwargs... )
194
-
195
-
196
- function ZarrDataset (f:: Function ,args... ; kwargs... )
189
+ function ZarrDataset (f:: Function , args... ; kwargs... )
197
190
ds = ZarrDataset (args... ; kwargs... )
198
191
try
199
192
f (ds)
@@ -202,7 +195,18 @@ function ZarrDataset(f::Function,args...; kwargs...)
202
195
end
203
196
end
204
197
205
- export ZarrDataset
206
- export defDim
207
- export defVar
208
- export defGroup
198
+ # Utility functions
199
+
200
+ function _dim (ds:: ZarrDataset , dimname:: SymbolOrString )
201
+ dimlen = get (ds. dimensions, Symbol (dimname), nothing )
202
+
203
+ if ! isnothing (dimlen)
204
+ return dimlen
205
+ end
206
+
207
+ if ds. parentdataset != = nothing
208
+ return _dim (ds. parentdataset, dimname)
209
+ end
210
+
211
+ error (" dimension $dimname is not defined" )
212
+ end
0 commit comments