Skip to content

Commit 22eb554

Browse files
authored
Merge pull request queryverse#280 from queryverse/fix-select-oftype
Fix @select oftype case
2 parents c8ecba9 + bb0808d commit 22eb554

File tree

2 files changed

+17
-23
lines changed

2 files changed

+17
-23
lines changed

src/table_query_macros.jl

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -41,21 +41,27 @@ macro select(args...)
4141
elseif typeof(arg) == QuoteNode
4242
# select by name
4343
prev = :( merge($prev, QueryOperators.NamedTupleUtilities.select(_, Val($(arg)))) )
44+
elseif arg isa Expr && arg.head==:call && length(arg.args)==3 && arg.args[1]==Symbol(":")
45+
arg = string(arg)
46+
# select by range, with multiple syntaxes supported
47+
m_range = match(r"^:([^,:]+) *: *:([^,:]+)", arg)
48+
m_range_ind = match(r"^([0-9]+) *: *([0-9]+)", arg)
49+
50+
if m_range_ind !== nothing
51+
a = parse(Int, m_range_ind[1])
52+
b = parse(Int, m_range_ind[2])
53+
prev = :( merge($prev, QueryOperators.NamedTupleUtilities.range(_, Val(keys(_)[$a]), Val(keys(_)[$b]))) )
54+
else
55+
prev = :( merge($prev, QueryOperators.NamedTupleUtilities.range(_, Val($(QuoteNode(Symbol(m_range[1])))), Val($(QuoteNode(Symbol(m_range[2])))))) )
56+
end
4457
else
4558
arg = string(arg)
4659
# select by element type
47-
m_type = match(r":\(:(.+)\)", arg)
60+
m_type = match(r"::(.+)", arg)
4861
# remove by name
4962
m_rem = match(r"^-:(.+)", arg)
5063
# remove by predicate functions
5164
m_rem_pred = match(r"^-\(*(startswith|endswith|occursin)\(\"(.+)\"\)+", arg)
52-
# select by range, with multiple syntaxes supported
53-
m_range = match(r"^:([^,:]+) *: *:([^,:]+)", arg)
54-
m_range_ind = match(r"^([0-9]+) *: *([0-9]+)", arg)
55-
if m_range == nothing && m_range_ind == nothing
56-
m_range = match(r"^rangeat\(:([^,]+), *:([^,]+)\)", arg)
57-
m_range_ind = match(r"^rangeat\(([0-9]+), *([0-9]+)\)", arg)
58-
end
5965
# select by predicate functions
6066
m_pred = match(r"^(startswith|endswith|occursin)\(\"(.+)\"\)", arg)
6167
is_neg_pred = false
@@ -66,7 +72,7 @@ macro select(args...)
6672

6773
# TODO: eltype
6874
if m_type !== nothing
69-
prev = :( merge($prev, QueryOperators.NamedTupleUtilities.oftype(_, parse(DataType, @datatype($m_type[1])))) )
75+
prev = :( merge($prev, QueryOperators.NamedTupleUtilities.oftype(_, Val($(eval(Symbol(m_type[1])))))) )
7076
elseif m_rem !== nothing
7177
prev = ifelse(prev == NamedTuple(), :_, prev)
7278
prev = :( QueryOperators.NamedTupleUtilities.remove($prev, Val($(QuoteNode(Symbol(m_rem[1]))))) )
@@ -79,14 +85,6 @@ macro select(args...)
7985
elseif m_rem_pred[1] == "occursin"
8086
prev = :( QueryOperators.NamedTupleUtilities.not_occursin($prev, Val($(QuoteNode(Symbol(m_rem_pred[2]))))) )
8187
end
82-
elseif m_range !== nothing || m_range_ind !== nothing
83-
if m_range_ind !== nothing
84-
a = parse(Int, m_range_ind[1])
85-
b = parse(Int, m_range_ind[2])
86-
prev = :( merge($prev, QueryOperators.NamedTupleUtilities.range(_, Val(keys(_)[$a]), Val(keys(_)[$b]))) )
87-
else
88-
prev = :( merge($prev, QueryOperators.NamedTupleUtilities.range(_, Val($(QuoteNode(Symbol(m_range[1])))), Val($(QuoteNode(Symbol(m_range[2])))))) )
89-
end
9088
elseif m_pred !== nothing
9189
if is_neg_pred == false
9290
if m_pred[1] == "startswith"
@@ -188,7 +186,3 @@ macro mutate(args...)
188186

189187
return :( Query.@map( $prev ) ) |> esc
190188
end
191-
192-
macro datatype(str)
193-
:($(Symbol(str)))
194-
end

test/test_macros.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ using Test
1212
@test DataFrame(df |> @select(startswith("b"))) == DataFrame(bar=[3.,2.,1.], bat=["a","b","c"])
1313
@test DataFrame(df |> @select(endswith("ar"))) == DataFrame(bar=[3.,2.,1.],)
1414
@test DataFrame(df |> @select(!occursin("a"))) == DataFrame(foo=[1,2,3],)
15-
@test DataFrame(df |> @select(rangeat(:foo, :bar))) == DataFrame(foo=[1,2,3], bar=[3.,2.,1.])
15+
@test DataFrame(df |> @select(:foo : :bar)) == DataFrame(foo=[1,2,3], bar=[3.,2.,1.])
1616
@test DataFrame(df |> @select(2:3, -endswith("at"))) == DataFrame(bar=[3.,2.,1.],)
17-
@test DataFrame(df |> @select(rangeat(1, 3))) == DataFrame(df |> @select(everything()))
17+
@test DataFrame(df |> @select(1:3)) == DataFrame(df |> @select(everything()))
1818

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

0 commit comments

Comments
 (0)