Skip to content

Commit

Permalink
Merge pull request #280 from queryverse/fix-select-oftype
Browse files Browse the repository at this point in the history
Fix @select oftype case
  • Loading branch information
davidanthoff authored Sep 13, 2019
2 parents c8ecba9 + bb0808d commit 22eb554
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 23 deletions.
36 changes: 15 additions & 21 deletions src/table_query_macros.jl
Original file line number Diff line number Diff line change
Expand Up @@ -41,21 +41,27 @@ macro select(args...)
elseif typeof(arg) == QuoteNode
# select by name
prev = :( merge($prev, QueryOperators.NamedTupleUtilities.select(_, Val($(arg)))) )
elseif arg isa Expr && arg.head==:call && length(arg.args)==3 && arg.args[1]==Symbol(":")
arg = string(arg)
# select by range, with multiple syntaxes supported
m_range = match(r"^:([^,:]+) *: *:([^,:]+)", arg)
m_range_ind = match(r"^([0-9]+) *: *([0-9]+)", arg)

if m_range_ind !== nothing
a = parse(Int, m_range_ind[1])
b = parse(Int, m_range_ind[2])
prev = :( merge($prev, QueryOperators.NamedTupleUtilities.range(_, Val(keys(_)[$a]), Val(keys(_)[$b]))) )
else
prev = :( merge($prev, QueryOperators.NamedTupleUtilities.range(_, Val($(QuoteNode(Symbol(m_range[1])))), Val($(QuoteNode(Symbol(m_range[2])))))) )
end
else
arg = string(arg)
# select by element type
m_type = match(r":\(:(.+)\)", arg)
m_type = match(r"::(.+)", arg)
# remove by name
m_rem = match(r"^-:(.+)", arg)
# remove by predicate functions
m_rem_pred = match(r"^-\(*(startswith|endswith|occursin)\(\"(.+)\"\)+", arg)
# select by range, with multiple syntaxes supported
m_range = match(r"^:([^,:]+) *: *:([^,:]+)", arg)
m_range_ind = match(r"^([0-9]+) *: *([0-9]+)", arg)
if m_range == nothing && m_range_ind == nothing
m_range = match(r"^rangeat\(:([^,]+), *:([^,]+)\)", arg)
m_range_ind = match(r"^rangeat\(([0-9]+), *([0-9]+)\)", arg)
end
# select by predicate functions
m_pred = match(r"^(startswith|endswith|occursin)\(\"(.+)\"\)", arg)
is_neg_pred = false
Expand All @@ -66,7 +72,7 @@ macro select(args...)

# TODO: eltype
if m_type !== nothing
prev = :( merge($prev, QueryOperators.NamedTupleUtilities.oftype(_, parse(DataType, @datatype($m_type[1])))) )
prev = :( merge($prev, QueryOperators.NamedTupleUtilities.oftype(_, Val($(eval(Symbol(m_type[1])))))) )
elseif m_rem !== nothing
prev = ifelse(prev == NamedTuple(), :_, prev)
prev = :( QueryOperators.NamedTupleUtilities.remove($prev, Val($(QuoteNode(Symbol(m_rem[1]))))) )
Expand All @@ -79,14 +85,6 @@ macro select(args...)
elseif m_rem_pred[1] == "occursin"
prev = :( QueryOperators.NamedTupleUtilities.not_occursin($prev, Val($(QuoteNode(Symbol(m_rem_pred[2]))))) )
end
elseif m_range !== nothing || m_range_ind !== nothing
if m_range_ind !== nothing
a = parse(Int, m_range_ind[1])
b = parse(Int, m_range_ind[2])
prev = :( merge($prev, QueryOperators.NamedTupleUtilities.range(_, Val(keys(_)[$a]), Val(keys(_)[$b]))) )
else
prev = :( merge($prev, QueryOperators.NamedTupleUtilities.range(_, Val($(QuoteNode(Symbol(m_range[1])))), Val($(QuoteNode(Symbol(m_range[2])))))) )
end
elseif m_pred !== nothing
if is_neg_pred == false
if m_pred[1] == "startswith"
Expand Down Expand Up @@ -188,7 +186,3 @@ macro mutate(args...)

return :( Query.@map( $prev ) ) |> esc
end

macro datatype(str)
:($(Symbol(str)))
end
4 changes: 2 additions & 2 deletions test/test_macros.jl
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ using Test
@test DataFrame(df |> @select(startswith("b"))) == DataFrame(bar=[3.,2.,1.], bat=["a","b","c"])
@test DataFrame(df |> @select(endswith("ar"))) == DataFrame(bar=[3.,2.,1.],)
@test DataFrame(df |> @select(!occursin("a"))) == DataFrame(foo=[1,2,3],)
@test DataFrame(df |> @select(rangeat(:foo, :bar))) == DataFrame(foo=[1,2,3], bar=[3.,2.,1.])
@test DataFrame(df |> @select(:foo : :bar)) == DataFrame(foo=[1,2,3], bar=[3.,2.,1.])
@test DataFrame(df |> @select(2:3, -endswith("at"))) == DataFrame(bar=[3.,2.,1.],)
@test DataFrame(df |> @select(rangeat(1, 3))) == DataFrame(df |> @select(everything()))
@test DataFrame(df |> @select(1:3)) == DataFrame(df |> @select(everything()))

@test DataFrame(df |> @select(:foo, :bar, :bat)) == df
@test DataFrame(df |> @select(startswith("f"), endswith("t"))) == DataFrame(foo=[1,2,3], bat=["a","b","c"])
Expand Down

0 comments on commit 22eb554

Please sign in to comment.