Skip to content

Commit 448c7e2

Browse files
committed
disallow DataFrames in obsp/varp, obsmap/varmap, layers
1 parent 5913869 commit 448c7e2

File tree

3 files changed

+48
-28
lines changed

3 files changed

+48
-28
lines changed

src/alignedmapping.jl

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
abstract type AbstractAlignedMapping{T <: Tuple, K, V} <: AbstractDict{K, V} end
22

3-
struct AlignedMapping{T <: Tuple, K, R} <: AbstractAlignedMapping{
3+
struct AlignedMapping{T <: Tuple, K, R, D} <: AbstractAlignedMapping{
44
T,
55
K,
6-
Union{AbstractArray{<:Number}, AbstractArray{Union{Missing, T}} where T <: Number, AbstractDataFrame},
6+
Union{AbstractArray{<:Number}, AbstractArray{Union{Missing, T}} where T <: Number, D == true ? DataFrame : Union{}},
77
}
88
ref::R # any type as long as it supports size()
9-
d::Dict{K, Union{AbstractArray{<:Number}, AbstractArray{Union{Missing, T}} where T <: Number, DataFrame}}
9+
d::Dict{
10+
K,
11+
Union{
12+
AbstractArray{<:Number},
13+
AbstractArray{Union{Missing, T}} where T <: Number,
14+
D == true ? DataFrame : Union{},
15+
},
16+
}
1017

11-
function AlignedMapping{T, K}(r, d::AbstractDict{K}) where {T <: Tuple, K}
18+
function AlignedMapping{T, K, D}(r, d::AbstractDict{K}) where {T <: Tuple, K, D}
1219
for (k, v) d
1320
checkdim(T, v, r, k)
1421
end
15-
return new{T, K, typeof(r)}(r, d)
22+
return new{T, K, typeof(r), D}(r, d)
1623
end
1724
end
1825

@@ -84,10 +91,23 @@ function Base.setindex!(d::AlignedMapping{T}, v::Union{AbstractArray, DataFrame}
8491
end
8592
Base.sizehint!(d::AlignedMapping, n) = sizehint!(d.d, n)
8693

94+
AlignedMapping{T, K}(r, d::AbstractDict{K}, ::Val{true}) where {T <: Tuple, K} = AlignedMapping{T, K, true}(r, d)
95+
AlignedMapping{T, K}(r, d::AbstractDict{K}, ::Val{false}) where {T <: Tuple, K} = AlignedMapping{T, K, false}(r, d)
96+
AlignedMapping{T, K}(r, d::AbstractDict{K}) where {T <: Tuple, K} = AlignedMapping{T, K}(r, d, Val(true))
97+
8798
AlignedMapping{T}(r, d::AbstractDict) where {T <: Tuple} = AlignedMapping{T, keytype(d)}(r, d)
88-
AlignedMapping{T, K}(ref) where {T, K} = AlignedMapping{T}(ref, Dict{K, AbstractMatrix{<:Number}}())
89-
AlignedMapping{T, K}(ref, ::Nothing) where {T, K} = AlignedMapping{T, K}(ref)
99+
AlignedMapping{T}(r, d::AbstractDict, ::Val{true}) where {T <: Tuple} = AlignedMapping{T, keytype(d)}(r, d, Val(true))
100+
AlignedMapping{T}(r, d::AbstractDict, ::Val{false}) where {T <: Tuple} = AlignedMapping{T, keytype(d)}(r, d, Val(false))
101+
90102
AlignedMapping{T}(r, d::Group) where {T <: Tuple} = AligedMapping{T}(ref, read_dict_of_mixed(d))
103+
AlignedMapping{T}(r, d::Group, ::Val{true}) where {T <: Tuple} = AligedMapping{T}(ref, read_dict_of_mixed(d), Val(true))
104+
AlignedMapping{T}(r, d::Group, ::Val{false}) where {T <: Tuple} =
105+
AligedMapping{T}(ref, read_dict_of_mixed(d), Val(false))
106+
107+
AlignedMapping{T, K}(ref) where {T, K} = AlignedMapping{T, K}(ref, Dict{K, AbstractMatrix{<:Number}}())
108+
AlignedMapping{T, K}(ref, ::Nothing) where {T, K} = AlignedMapping{T, K}(ref)
109+
AlignedMapping{T, K, D}(ref) where {T, K, D} = AlignedMapping{T, K, D}(ref, Dict{K, AbstractMatrix{<:Number}}())
110+
AlignedMapping{T, K, D}(ref, ::Nothing) where {T, K, D} = AlignedMapping{T, K, D}(ref)
91111

92112
Base.delete!(d::BackedAlignedMapping, k) = !isnothing(d.d) && delete_object(d.d, k)
93113
function Base.empty!(d::BackedAlignedMapping)
@@ -248,5 +268,5 @@ function Base.view(parentview::AlignedMappingView{T}, indices...) where {T <: Tu
248268
return AlignedMappingView(parent(parentview), Base.reindex(parentindices(parentview), indices))
249269
end
250270

251-
const StrAlignedMapping{T <: Tuple, R} = AlignedMapping{T, String, R}
271+
const StrAlignedMapping{T <: Tuple, R, D} = AlignedMapping{T, String, R, D}
252272
const StrAlignedMappingView{T <: Tuple} = AlignedMappingView{T, String}

src/anndata.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ mutable struct AnnData <: AbstractAnnData
1212
var_names::Index{<:AbstractString}
1313

1414
obsm::StrAlignedMapping{Tuple{1 => 1}, AnnData}
15-
obsp::StrAlignedMapping{Tuple{1 => 1, 2 => 1}, AnnData}
15+
obsp::StrAlignedMapping{Tuple{1 => 1, 2 => 1}, AnnData, false}
1616

1717
varm::StrAlignedMapping{Tuple{1 => 2}, AnnData}
18-
varp::StrAlignedMapping{Tuple{1 => 2, 2 => 2}, AnnData}
18+
varp::StrAlignedMapping{Tuple{1 => 2, 2 => 2}, AnnData, false}
1919

2020
layers::AbstractAlignedMapping{Tuple{1 => 1, 2 => 2}, String}
2121

@@ -42,15 +42,15 @@ mutable struct AnnData <: AbstractAnnData
4242
# observations
4343
adata.obsm =
4444
StrAlignedMapping{Tuple{1 => 1}}(adata, haskey(file, "obsm") ? read_dict_of_mixed(file["obsm"]) : nothing)
45-
adata.obsp = StrAlignedMapping{Tuple{1 => 1, 2 => 1}}(
45+
adata.obsp = StrAlignedMapping{Tuple{1 => 1, 2 => 1}, false}(
4646
adata,
4747
haskey(file, "obsp") ? read_dict_of_matrices(file["obsp"]) : nothing,
4848
)
4949

5050
# Variables
5151
adata.varm =
5252
StrAlignedMapping{Tuple{1 => 2}}(adata, haskey(file, "varm") ? read_dict_of_mixed(file["varm"]) : nothing)
53-
adata.varp = StrAlignedMapping{Tuple{1 => 2, 2 => 2}}(
53+
adata.varp = StrAlignedMapping{Tuple{1 => 2, 2 => 2}, false}(
5454
adata,
5555
haskey(file, "varp") ? read_dict_of_matrices(file["varp"]) : nothing,
5656
)
@@ -60,7 +60,7 @@ mutable struct AnnData <: AbstractAnnData
6060

6161
# Layers
6262
if !backed
63-
adata.layers = StrAlignedMapping{Tuple{1 => 1, 2 => 2}}(
63+
adata.layers = StrAlignedMapping{Tuple{1 => 1, 2 => 2}, false}(
6464
adata,
6565
haskey(file, "layers") ? read_dict_of_matrices(file["layers"]) : nothing,
6666
)
@@ -113,10 +113,10 @@ mutable struct AnnData <: AbstractAnnData
113113
end
114114
adata = new(nothing, X, obs, Index(obs_names), var, Index(var_names))
115115
adata.obsm = StrAlignedMapping{Tuple{1 => 1}}(adata, obsm)
116-
adata.obsp = StrAlignedMapping{Tuple{1 => 1, 2 => 1}}(adata, obsp)
116+
adata.obsp = StrAlignedMapping{Tuple{1 => 1, 2 => 1}, false}(adata, obsp)
117117
adata.varm = StrAlignedMapping{Tuple{1 => 2}}(adata, varm)
118-
adata.varp = StrAlignedMapping{Tuple{1 => 2, 2 => 2}}(adata, varp)
119-
adata.layers = StrAlignedMapping{Tuple{1 => 1, 2 => 2}}(adata, layers)
118+
adata.varp = StrAlignedMapping{Tuple{1 => 2, 2 => 2}, false}(adata, varp)
119+
adata.layers = StrAlignedMapping{Tuple{1 => 1, 2 => 2}, false}(adata, layers)
120120
adata.uns = isnothing(uns) ? Dict{String, Any}() : uns
121121

122122
return adata

src/mudata.jl

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ mutable struct MuData <: AbstractMuData
77
obs::DataFrame
88
obs_names::Index{<:AbstractString}
99
obsm::StrAlignedMapping{Tuple{1 => 1}, MuData}
10-
obsp::StrAlignedMapping{Tuple{1 => 1, 2 => 1}, MuData}
11-
obsmap::StrAlignedMapping{Tuple{1 => 1}, MuData}
10+
obsp::StrAlignedMapping{Tuple{1 => 1, 2 => 1}, MuData, false}
11+
obsmap::StrAlignedMapping{Tuple{1 => 1}, MuData, false}
1212

1313
var::DataFrame
1414
var_names::Index{<:AbstractString}
1515
varm::StrAlignedMapping{Tuple{1 => 2}, MuData}
16-
varp::StrAlignedMapping{Tuple{1 => 2, 2 => 2}, MuData}
17-
varmap::StrAlignedMapping{Tuple{1 => 2}, MuData}
16+
varp::StrAlignedMapping{Tuple{1 => 2, 2 => 2}, MuData, false}
17+
varmap::StrAlignedMapping{Tuple{1 => 2}, MuData, false}
1818

1919
uns::Dict{<:AbstractString, <:Any}
2020

@@ -40,23 +40,23 @@ mutable struct MuData <: AbstractMuData
4040
# Observations
4141
mdata.obsm =
4242
StrAlignedMapping{Tuple{1 => 1}}(mdata, haskey(file, "obsm") ? read_dict_of_mixed(file["obsm"]) : nothing)
43-
mdata.obsp = StrAlignedMapping{Tuple{1 => 1, 2 => 1}}(
43+
mdata.obsp = StrAlignedMapping{Tuple{1 => 1, 2 => 1}, false}(
4444
mdata,
4545
haskey(file, "obsp") ? read_dict_of_matrices(file["obsp"]) : nothing,
4646
)
47-
mdata.obsmap = StrAlignedMapping{Tuple{1 => 1}}(
47+
mdata.obsmap = StrAlignedMapping{Tuple{1 => 1}, false}(
4848
mdata,
4949
haskey(file, "obsmap") ? read_dict_of_matrices(file["obsmap"]) : nothing,
5050
)
5151

5252
# Variables
5353
mdata.varm =
5454
StrAlignedMapping{Tuple{1 => 2}}(mdata, haskey(file, "varm") ? read_dict_of_mixed(file["varm"]) : nothing)
55-
mdata.varp = StrAlignedMapping{Tuple{1 => 2, 2 => 2}}(
55+
mdata.varp = StrAlignedMapping{Tuple{1 => 2, 2 => 2}, false}(
5656
mdata,
5757
haskey(file, "varp") ? read_dict_of_matrices(file["varp"]) : nothing,
5858
)
59-
mdata.varmap = StrAlignedMapping{Tuple{1 => 2}}(
59+
mdata.varmap = StrAlignedMapping{Tuple{1 => 2}, false}(
6060
mdata,
6161
haskey(file, "varmap") ? read_dict_of_matrices(file["varmap"]) : nothing,
6262
)
@@ -117,10 +117,10 @@ mutable struct MuData <: AbstractMuData
117117

118118
mdata.obsm = StrAlignedMapping{Tuple{1 => 1}}(mdata, obsm)
119119
mdata.varm = StrAlignedMapping{Tuple{1 => 2}}(mdata, varm)
120-
mdata.obsp = StrAlignedMapping{Tuple{1 => 1, 2 => 1}}(mdata, obsp)
121-
mdata.varp = StrAlignedMapping{Tuple{1 => 2, 2 => 2}}(mdata, varp)
122-
mdata.obsmap = StrAlignedMapping{Tuple{1 => 1}}(mdata, obsmap)
123-
mdata.varmap = StrAlignedMapping{Tuple{1 => 2}}(mdata, varmap)
120+
mdata.obsp = StrAlignedMapping{Tuple{1 => 1, 2 => 1}, false}(mdata, obsp)
121+
mdata.varp = StrAlignedMapping{Tuple{1 => 2, 2 => 2}, false}(mdata, varp)
122+
mdata.obsmap = StrAlignedMapping{Tuple{1 => 1}, false}(mdata, obsmap)
123+
mdata.varmap = StrAlignedMapping{Tuple{1 => 2}, false}(mdata, varmap)
124124
mdata.uns = isnothing(uns) ? Dict{String, Any}() : uns
125125
mdata.axis = isnothing(axis) ? 0x1 : axis
126126

0 commit comments

Comments
 (0)