From de69179e279dd7ef1efad759c876bbfad1e3ffdf Mon Sep 17 00:00:00 2001 From: David Anthoff Date: Fri, 13 Sep 2019 09:57:22 -0700 Subject: [PATCH 1/2] Fix @select oftype case --- src/table_query_macros.jl | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/table_query_macros.jl b/src/table_query_macros.jl index 8e5f08d6..11508190 100644 --- a/src/table_query_macros.jl +++ b/src/table_query_macros.jl @@ -44,7 +44,7 @@ macro select(args...) 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 @@ -66,7 +66,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]))))) ) @@ -188,7 +188,3 @@ macro mutate(args...) return :( Query.@map( $prev ) ) |> esc end - -macro datatype(str) - :($(Symbol(str))) -end \ No newline at end of file From bb0808d2bae6631cde7a645c1eb37353ef218f66 Mon Sep 17 00:00:00 2001 From: David Anthoff Date: Fri, 13 Sep 2019 15:14:17 -0700 Subject: [PATCH 2/2] Remove rangeat syntax --- src/table_query_macros.jl | 28 +++++++++++++--------------- test/test_macros.jl | 4 ++-- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/table_query_macros.jl b/src/table_query_macros.jl index 11508190..29e029ac 100644 --- a/src/table_query_macros.jl +++ b/src/table_query_macros.jl @@ -41,6 +41,19 @@ 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 @@ -49,13 +62,6 @@ macro select(args...) 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 @@ -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" diff --git a/test/test_macros.jl b/test/test_macros.jl index 035bffbe..e26fdc56 100644 --- a/test/test_macros.jl +++ b/test/test_macros.jl @@ -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"])