|
1 | 1 | function normalize_select(idx, @nospecialize(cols...)) |
2 | | - selected_cols = Int[] |
| 2 | + selected_cols = [Int[], Int[]] |
3 | 3 | for i in 1:length(cols) |
4 | 4 | normalize_select!(selected_cols, idx, cols[i]) |
5 | 5 | end |
6 | 6 | unique!(selected_cols) |
7 | 7 | end |
8 | 8 | function normalize_select!(selected_cols, idx, cols::ColumnIndex) |
9 | | - push!(selected_cols, idx[cols]) |
| 9 | + push!(selected_cols[1], idx[cols]) |
10 | 10 | end |
11 | 11 |
|
12 | 12 | function normalize_select!(selected_cols, idx, cols::MultiColumnIndex) |
13 | 13 | colsidx = idx[cols] |
14 | 14 | for i in 1:length(colsidx) |
15 | | - push!(selected_cols, colsidx[i]) |
| 15 | + push!(selected_cols[1], colsidx[i]) |
| 16 | + end |
| 17 | + if cols isa Not |
| 18 | + colsidxnot = idx[cols.skip] |
| 19 | + for i in 1:length(colsidxnot) |
| 20 | + push!(selected_cols[2], colsidxnot[i]) |
| 21 | + end |
16 | 22 | end |
17 | 23 | end |
18 | 24 |
|
19 | 25 | # sell and sell! will replace select and select! |
20 | 26 | # Dataset shouldn't support copycols since it causes modifying a data set without telling other alias data sets |
21 | 27 | function select(ds::Dataset, @nospecialize(args...)) |
22 | | - selected_cols = normalize_select(index(ds), args...) |
| 28 | + selected_cols_all = normalize_select(index(ds), args...) |
| 29 | + selected_cols = setdiff!(selected_cols_all[1], selected_cols_all[2]) |
23 | 30 | res = AbstractVector[] |
24 | 31 |
|
25 | 32 | for j in 1:length(selected_cols) |
@@ -56,7 +63,8 @@ function select(ds::Dataset, @nospecialize(args...)) |
56 | 63 | end |
57 | 64 |
|
58 | 65 | function select!(ds, @nospecialize(args...)) |
59 | | - selected_cols = normalize_select(index(ds), args...) |
| 66 | + selected_cols_all = normalize_select(index(ds), args...) |
| 67 | + selected_cols = setdiff!(selected_cols_all[1], selected_cols_all[2]) |
60 | 68 | unwanted_cols = setdiff(1:ncol(ds), selected_cols) |
61 | 69 | sort!(unwanted_cols, rev = true) |
62 | 70 |
|
|
0 commit comments