fat_core 1.5.2 → 1.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/fat_core/table.rb +37 -8
- data/lib/fat_core/version.rb +1 -1
- data/spec/lib/table_spec.rb +43 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d398b7ceb368a1c99d20a78b6b223b7d6d0fee1
|
4
|
+
data.tar.gz: 3107bfa35da91b30a2001b56f85daef907ce9789
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c982073829b3209c0a03dfb9f16e30b0d6aaa321fc7720de5dac5a9c6bb36db7c9560087a53cee6a4fefa06273f317d8df25e7ac0a90d60efca87ee876e5ab1
|
7
|
+
data.tar.gz: 090803a0545f56bb24d7fdda0d27c5c21ff27b9eaa73ef69e3190ac5b74d60a02ffac6a2bf16b649e64547f19edabfa9ce44d4ab6172167e1814de3b272855b1
|
data/lib/fat_core/table.rb
CHANGED
@@ -183,7 +183,8 @@ module FatCore
|
|
183
183
|
## preceding the hline.
|
184
184
|
##
|
185
185
|
## The #order_by method resets the boundaries then adds boundaries at the
|
186
|
-
## last row of each group as a
|
186
|
+
## last row of each group of rows on which the sort keys were equal as a
|
187
|
+
## boundary.
|
187
188
|
##
|
188
189
|
## The #union_all (but not #union since it deletes duplicates) method adds
|
189
190
|
## a boundary between the constituent tables. #union_all also preserves any
|
@@ -195,10 +196,15 @@ module FatCore
|
|
195
196
|
## without change, since it only selects columns for the output and deletes
|
196
197
|
## no rows.
|
197
198
|
##
|
199
|
+
## Perhaps surprisingly, the #group_by method does /not/ result in any
|
200
|
+
## groups in the output table since the result of #group_by is to reduce
|
201
|
+
## all groups it finds into a single row, and having a group for each row
|
202
|
+
## of the output table would have no use.
|
203
|
+
##
|
198
204
|
## All the other table-transforming methods reset the boundaries in the new
|
199
|
-
## table. For example, #
|
200
|
-
##
|
201
|
-
## #
|
205
|
+
## table. For example, #where re-arranges and deletes rows, so the old
|
206
|
+
## boundaries would make no sense anyway. Likewise, #union, #intersection,
|
207
|
+
## #except, and #join reset the boundaries to their default.
|
202
208
|
## ###########################################################################
|
203
209
|
|
204
210
|
public
|
@@ -251,6 +257,15 @@ module FatCore
|
|
251
257
|
@boundaries += bounds.map { |k| k + shift }
|
252
258
|
end
|
253
259
|
|
260
|
+
# Return the group number to which row k belongs. Groups, from the user's
|
261
|
+
# point of view are indexed starting at 1.
|
262
|
+
def row_index_to_group_index(k)
|
263
|
+
boundaries.each_with_index do |b_last, g_num|
|
264
|
+
return (g_num + 1) if k <= b_last
|
265
|
+
end
|
266
|
+
1
|
267
|
+
end
|
268
|
+
|
254
269
|
def group_rows(k)
|
255
270
|
normalize_boundaries
|
256
271
|
return [] unless k < boundaries.size
|
@@ -289,6 +304,7 @@ module FatCore
|
|
289
304
|
new_tab.mark_boundary(k - 1) if last_key && key != last_key
|
290
305
|
last_key = key
|
291
306
|
end
|
307
|
+
new_tab.normalize_boundaries
|
292
308
|
new_tab
|
293
309
|
end
|
294
310
|
|
@@ -306,8 +322,10 @@ module FatCore
|
|
306
322
|
# well. The output table preserves any groups present in the input table.
|
307
323
|
def select(*cols, **new_cols)
|
308
324
|
result = Table.new
|
309
|
-
|
310
|
-
|
325
|
+
normalize_boundaries
|
326
|
+
ev = Evaluator.new(vars: { row: 0, group: 1 },
|
327
|
+
before: '@row = __row; @group = __group')
|
328
|
+
rows.each_with_index do |old_row, old_k|
|
311
329
|
new_row = {}
|
312
330
|
cols.each do |k|
|
313
331
|
h = k.as_sym
|
@@ -317,6 +335,8 @@ module FatCore
|
|
317
335
|
new_cols.each_pair do |key, val|
|
318
336
|
key = key.as_sym
|
319
337
|
vars = old_row.merge(new_row)
|
338
|
+
vars[:__row] = old_k + 1
|
339
|
+
vars[:__group] = row_index_to_group_index(old_k)
|
320
340
|
case val
|
321
341
|
when Symbol
|
322
342
|
raise "Column '#{val}' in select does not exist" unless vars.keys.include?(val)
|
@@ -330,6 +350,7 @@ module FatCore
|
|
330
350
|
result << new_row
|
331
351
|
end
|
332
352
|
result.boundaries = boundaries
|
353
|
+
result.normalize_boundaries
|
333
354
|
result
|
334
355
|
end
|
335
356
|
|
@@ -338,10 +359,15 @@ module FatCore
|
|
338
359
|
def where(expr)
|
339
360
|
expr = expr.to_s
|
340
361
|
result = Table.new
|
341
|
-
ev = Evaluator.new(vars: { row: 0 },
|
342
|
-
|
362
|
+
ev = Evaluator.new(vars: { row: 0 },
|
363
|
+
before: '@row = __row; @group = __group')
|
364
|
+
rows.each_with_index do |row, k|
|
365
|
+
vars = row
|
366
|
+
vars[:__row] = k + 1
|
367
|
+
vars[:__group] = row_index_to_group_index(k)
|
343
368
|
result << row if ev.evaluate(expr, vars: row)
|
344
369
|
end
|
370
|
+
result.normalize_boundaries
|
345
371
|
result
|
346
372
|
end
|
347
373
|
|
@@ -452,6 +478,7 @@ module FatCore
|
|
452
478
|
other.normalize_boundaries
|
453
479
|
result.append_boundaries(other.boundaries, shift: size)
|
454
480
|
end
|
481
|
+
result.normalize_boundaries
|
455
482
|
distinct ? result.distinct : result
|
456
483
|
end
|
457
484
|
|
@@ -563,6 +590,7 @@ module FatCore
|
|
563
590
|
end
|
564
591
|
end
|
565
592
|
end
|
593
|
+
result.normalize_boundaries
|
566
594
|
result
|
567
595
|
end
|
568
596
|
|
@@ -621,6 +649,7 @@ module FatCore
|
|
621
649
|
groups.each_pair do |_vals, grp_rows|
|
622
650
|
result << row_from_group(grp_rows, group_cols, agg_cols)
|
623
651
|
end
|
652
|
+
result.normalize_boundaries
|
624
653
|
result
|
625
654
|
end
|
626
655
|
|
data/lib/fat_core/version.rb
CHANGED
data/spec/lib/table_spec.rb
CHANGED
@@ -671,6 +671,25 @@ EOS
|
|
671
671
|
expect(tab2[:s].items).to eq([26450449, 169744, 3316041])
|
672
672
|
expect(tab2[:c].items).to eq([12492, 25648, 7552])
|
673
673
|
end
|
674
|
+
|
675
|
+
it 'should have access to @row and @group vars in evaluating' do
|
676
|
+
aoh = [
|
677
|
+
{ a: '5', 'Two words' => '20', s: '5_143', c: '3123' },
|
678
|
+
{ a: '4', 'Two words' => '5', s: 412, c: 6412 },
|
679
|
+
{ a: '7', 'Two words' => '8', s: '$1721', c: '$1_888' },
|
680
|
+
{ a: '5', 'Two words' => '20', s: '4_143', c: '4123' },
|
681
|
+
{ a: '4', 'Two words' => '5', s: 512, c: 5412 },
|
682
|
+
{ a: '7', 'Two words' => '8', s: '$1621', c: '$2_888' },
|
683
|
+
{ a: '5', 'Two words' => '20', s: '3_143', c: '5123' },
|
684
|
+
{ a: '4', 'Two words' => '5', s: 412, c: 4412 },
|
685
|
+
{ a: '7', 'Two words' => '8', s: '$1521', c: '$3_888' }
|
686
|
+
]
|
687
|
+
tab = Table.new(aoh).order_by(:a, :two_words)
|
688
|
+
tab2 = tab.select(:a, :two_words, number: '@row', group: '@group')
|
689
|
+
expect(tab2.headers).to eq [:a, :two_words, :number, :group]
|
690
|
+
expect(tab2[:number].items).to eq([1, 2, 3, 4, 5, 6, 7, 8, 9])
|
691
|
+
expect(tab2[:group].items).to eq([1, 1, 1, 2, 2, 2, 3, 3, 3])
|
692
|
+
end
|
674
693
|
end
|
675
694
|
|
676
695
|
describe 'where' do
|
@@ -680,7 +699,7 @@ EOS
|
|
680
699
|
expect(tab2[:date].max).to be < Date.parse('2006-06-01')
|
681
700
|
end
|
682
701
|
|
683
|
-
it 'should
|
702
|
+
it 'should where by boolean columns' do
|
684
703
|
tab =
|
685
704
|
[['Ref', 'Date', 'Code', 'Raw', 'Shares', 'Price', 'Info', 'Bool'],
|
686
705
|
nil,
|
@@ -708,6 +727,29 @@ EOS
|
|
708
727
|
tab2 = tab.where('info =~ /xxxx/')
|
709
728
|
expect(tab2.rows.size).to eq(0)
|
710
729
|
end
|
730
|
+
|
731
|
+
it 'where select by row and group' do
|
732
|
+
tab =
|
733
|
+
[['Ref', 'Date', 'Code', 'Raw', 'Shares', 'Price', 'Info', 'Bool'],
|
734
|
+
nil,
|
735
|
+
[1, '2013-05-02', 'P', 795_546.20, 795_546.2, 1.1850, 'ZMPEF1', 'T'],
|
736
|
+
[2, '2013-05-02', 'P', 118_186.40, 118_186.4, 11.8500, 'ZMPEF1', 'T'],
|
737
|
+
[7, '2013-05-20', 'S', 12_000.00, 5046.00, 28.2804, 'ZMEAC', 'F'],
|
738
|
+
[8, '2013-05-20', 'S', 85_000.00, 35_742.50, 28.3224, 'ZMEAC', 'T'],
|
739
|
+
[9, '2013-05-20', 'S', 33_302.00, 14_003.49, 28.6383, 'ZMEAC', 'T'],
|
740
|
+
[10, '2013-05-23', 'S', 8000.00, 3364.00, 27.1083, 'ZMEAC', 'T'],
|
741
|
+
[11, '2013-05-23', 'S', 23_054.00, 9694.21, 26.8015, 'ZMEAC', 'F'],
|
742
|
+
[12, '2013-05-23', 'S', 39_906.00, 16_780.47, 25.1749, 'ZMEAC', 'T'],
|
743
|
+
[13, '2013-05-29', 'S', 13_459.00, 5659.51, 24.7464, 'ZMEAC', 'T'],
|
744
|
+
[14, '2013-05-29', 'S', 15_700.00, 6601.85, 24.7790, 'ZMEAC', 'F'],
|
745
|
+
[15, '2013-05-29', 'S', 15_900.00, 6685.95, 24.5802, 'ZMEAC', 'T'],
|
746
|
+
[16, '2013-05-30', 'S', 6_679.00, 2808.52, 25.0471, 'ZMEAC', 'T']]
|
747
|
+
tab = Table.new(tab).order_by(:date, :code)
|
748
|
+
tab2 = tab.where('@row > 10')
|
749
|
+
expect(tab2.rows.size).to eq(2)
|
750
|
+
tab2 = tab.where('@group == 3')
|
751
|
+
expect(tab2.rows.size).to eq(3)
|
752
|
+
end
|
711
753
|
end
|
712
754
|
|
713
755
|
describe 'group_by' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fat_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel E. Doherty
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: simplecov
|