From 0bc808121bd4a2e6835c2619642f32da0c00929a Mon Sep 17 00:00:00 2001 From: siddjain444 Date: Thu, 25 Apr 2024 09:07:08 +0000 Subject: [PATCH] Updating the getindex function to throw argument error when string and symbol are passed simultaneously as input to the function --- src/getindex.jl | 84 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 64 insertions(+), 20 deletions(-) diff --git a/src/getindex.jl b/src/getindex.jl index 196a986..2b9cdab 100644 --- a/src/getindex.jl +++ b/src/getindex.jl @@ -252,11 +252,12 @@ julia> ts[1, "x1"]; # same as above ### ### Inputs: row scalar, column scalar; Output: scalar + function Base.getindex(ts::TSFrame, i::Int, j::Int) return ts.coredata[i,j+1] end -function Base.getindex(ts::TSFrame, i::Int, j::Union{Symbol, String}) +function Base.getindex(ts::TSFrame, i::Int, j::Union{Symbol, AbstractString}) return ts.coredata[i, j] end @@ -265,7 +266,7 @@ function Base.getindex(ts::TSFrame, dt::T, j::Int) where {T<:TimeType} ts.coredata[idx, j+1] end -function Base.getindex(ts::TSFrame, dt::T, j::Union{String, Symbol}) where {T<:TimeType} +function Base.getindex(ts::TSFrame, dt::T, j::Union{AbstractString, Symbol}) where {T<:TimeType} idx = findfirst(x -> x == dt, index(ts)) ts.coredata[idx, j] end @@ -273,21 +274,32 @@ end ### Inputs: row scalar, column vector; Output: TSFrame function Base.getindex(ts::TSFrame, i::Int, j::AbstractVector{Int}) - TSFrame(ts.coredata[[i], Cols(:Index, j.+1)]) # increment: account for Index + TSFrame(ts.coredata[[i], Cols(:Index, j.+1)]) # increment: account for Index end -function Base.getindex(ts::TSFrame, i::Int, j::AbstractVector{T}) where {T<:Union{String, Symbol}} - TSFrame(ts.coredata[[i], Cols(:Index, j)]) + +function Base.getindex(ts::TSFrame, i::Int, j::AbstractVector{T}) where {T<:Union{AbstractString, Symbol}} + if length(unique(map(x -> typeof(x), j))) == 1 + TSFrame(ts.coredata[[i], Cols(:Index, j)]) + else + throw(ArgumentError("The column vector cannot contain both String and Symbol types.")) + end end + function Base.getindex(ts::TSFrame, dt::T, j::AbstractVector{Int}) where {T<:TimeType} idx = findfirst(x -> x == dt, index(ts)) ts[idx, j] end -function Base.getindex(ts::TSFrame, dt::D, j::AbstractVector{T}) where {D<:TimeType, T<:Union{String, Symbol}} +function Base.getindex(ts::TSFrame, dt::D, j::AbstractVector{T}) where {D<:TimeType, T<:Union{AbstractString, Symbol}} idx = findfirst(x -> x == dt, index(ts)) - ts[idx, j] + if length(unique(map(x -> typeof(x), j))) == 1 + ts[idx, j] + else + throw(ArgumentError("The column vector cannot contain both AbstractString and Symbol types.")) + end + end ### @@ -302,7 +314,8 @@ function Base.getindex(ts::TSFrame, i::AbstractVector{Int}, j::Int) ts.coredata[i, j+1] # increment: account for Index end -function Base.getindex(ts::TSFrame, i::AbstractVector{Int}, j::Union{String, Symbol}) + +function Base.getindex(ts::TSFrame, i::AbstractVector{Int}, j::Union{AbstractString, Symbol}) ts.coredata[i, j] end @@ -314,12 +327,18 @@ function Base.getindex(ts::TSFrame, dt::AbstractVector{T}, j::Int) where {T<:Tim ts[idx, j] end -function Base.getindex(ts::TSFrame, dt::AbstractVector{T}, j::Union{String, Symbol}) where {T<:TimeType} + +function Base.getindex(ts::TSFrame, dt::AbstractVector{T}, j::Union{AbstractString, Symbol}) where {T<:TimeType} idx = map(d -> findfirst(x -> x == d, index(ts)), dt) if length(idx) == 0 return nothing + else + if length(unique(map(x -> typeof(x), j))) == 1 + ts[idx, j] + else + throw(ArgumentError("The column vector cannot contain both AbstractString and Symbol types.")) + end end - ts[idx, j] end ### @@ -328,10 +347,16 @@ function Base.getindex(ts::TSFrame, i::AbstractVector{Int}, j::AbstractVector{In TSFrame(ts.coredata[i, Cols(:Index, j.+1)]) # increment: account for Index end -function Base.getindex(ts::TSFrame, i::AbstractVector{Int}, j::AbstractVector{T}) where {T<:Union{String, Symbol}} - TSFrame(ts.coredata[i, Cols(:Index, j)]) + +function Base.getindex(ts::TSFrame, i::AbstractVector{Int}, j::AbstractVector{T}) where {T<:Union{AbstractString, Symbol}} + if length(unique(map(x -> typeof(x), j))) == 1 + TSFrame(ts.coredata[i, Cols(:Index, j)]) + else + throw(ArgumentError("The column vector cannot contain both AbstractString and Symbol types.")) + end end + function Base.getindex(ts::TSFrame, dt::AbstractVector{T}, j::AbstractVector{Int}) where {T<:TimeType} idx = map(d -> findfirst(x -> x == d, index(ts)), dt) if length(idx) == 0 @@ -340,9 +365,15 @@ function Base.getindex(ts::TSFrame, dt::AbstractVector{T}, j::AbstractVector{Int ts[idx, j] end -function Base.getindex(ts::TSFrame, dt::AbstractVector{D}, j::AbstractVector{T}) where {D<:TimeType, T<:Union{String, Symbol}} + +function Base.getindex(ts::TSFrame, dt::AbstractVector{D}, j::AbstractVector{T}) where {D<:TimeType, T<:Union{AbstractString, Symbol}} idx = map(d -> findfirst(x -> x == d, index(ts)), dt) - ts[idx, j] + if length(unique(map(x -> typeof(x), j))) == 1 + ts[idx, j] + else + throw(ArgumentError("The column vector cannot contain both AbstractString and Symbol types.")) + end + end ### @@ -362,7 +393,8 @@ function Base.getindex(ts::TSFrame, i::UnitRange, j::Int) ts[collect(i), j] end -function Base.getindex(ts::TSFrame, i::UnitRange, j::Union{String, Symbol}) + +function Base.getindex(ts::TSFrame, i::UnitRange, j::Union{AbstractString, Symbol}) ts[collect(i), j] end ### @@ -372,8 +404,14 @@ function Base.getindex(ts::TSFrame, i::UnitRange, j::AbstractVector{Int}) ts[collect(i), j] end -function Base.getindex(ts::TSFrame, i::UnitRange, j::AbstractVector{T}) where {T<:Union{String, Symbol}} - ts[collect(i), j] + +function Base.getindex(ts::TSFrame, i::UnitRange, j::AbstractVector{T}) where {T<:Union{AbstractString, Symbol}} + if length(unique(map(x -> typeof(x), j))) == 1 + ts[collect(i), j] + else + throw(ArgumentError("The column vector cannot contain both AbstractString and Symbol types.")) + end + end ### @@ -476,7 +514,8 @@ function Base.getindex(ts::TSFrame, ::Colon, j::Int) ts[1:TSFrames.nrow(ts), j] end -function Base.getindex(ts::TSFrame, ::Colon, j::Union{String, Symbol}) + +function Base.getindex(ts::TSFrame, ::Colon, j::Union{AbstractString, Symbol}) ts[1:TSFrames.nrow(ts), j] end ### @@ -486,8 +525,13 @@ function Base.getindex(ts::TSFrame, ::Colon, j::AbstractVector{Int}) ts[1:TSFrames.nrow(ts), j] end -function Base.getindex(ts::TSFrame, ::Colon, j::AbstractVector{T}) where {T<:Union{String, Symbol}} - ts[1:TSFrames.nrow(ts), j] +function Base.getindex(ts::TSFrame, ::Colon, j::AbstractVector{T}) where {T<:Union{AbstractString, Symbol}} + if length(unique(map(x -> typeof(x), j))) == 1 + ts[1:TSFrames.nrow(ts), j] + else + throw(ArgumentError("The column vector cannot contain both AbstractString and Symbol types.")) + end + end ###