Skip to content

Commit

Permalink
Updating the getindex function to throw argument error when string an…
Browse files Browse the repository at this point in the history
…d symbol are passed simultaneously as input to the function
  • Loading branch information
siddjain444 committed Apr 25, 2024
1 parent d1ed39e commit 0bc8081
Showing 1 changed file with 64 additions and 20 deletions.
84 changes: 64 additions & 20 deletions src/getindex.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -265,29 +266,40 @@ 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
###

### 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
###

Expand All @@ -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

Expand All @@ -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
###

Expand All @@ -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
Expand All @@ -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
###

Expand All @@ -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
###
Expand All @@ -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
###

Expand Down Expand Up @@ -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
###
Expand All @@ -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
###

Expand Down

0 comments on commit 0bc8081

Please sign in to comment.