first_after_created_at 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5c68bc6c2fd25b8e8646e822183a0684353732dc
4
- data.tar.gz: ba8096158884184921139077a615b9c03ce53b67
3
+ metadata.gz: 205c6fbed97f1fdcd252bac9639c675ff593784c
4
+ data.tar.gz: 21f6e6be86b437c3fc27d1db0fe44b3dec2036e2
5
5
  SHA512:
6
- metadata.gz: c4cfbc06f5f302a71fa89bf5ad9ebb33cfe60b79e3e3ff803f9abf4c3c99e555df5f6a7c74fe003f4f59d31570eb542512000179e2a64589a5d86f857c44e3ae
7
- data.tar.gz: aeaee80b37b92e2c74705c030adc7ad230f5717b61d1b1629005ca9d5636c64294ce161caa44ba8ac724dbd68f36366087313e7ee13cdd3f31973d5f84325c32
6
+ metadata.gz: 16291ec36459c4a89cee2adb15036b0765cfd0fd249a234c82ef873680522b2797ddbc57c4dbfce55b5b62a224208cf6cdc84086a2191d842c6fb0b3fc945c84
7
+ data.tar.gz: 0ab38332154389810490d66150bd791470982d149e79b816377e45f2a520042212e7e33a94be3b7627301fedc9d8ebaaf2120ad17ab1d129b8198f7bc2157f37
@@ -1,3 +1,3 @@
1
1
  module FirstAfterCreatedAt
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -1,44 +1,38 @@
1
1
  require 'active_record'
2
2
 
3
+ # This module extends ActiveRecord::Base to provide the
4
+ # .first_after_created_at(date) and .first_after_id(id) functions
3
5
  module FirstAfterCreatedAt
4
6
  def first_after_created_at(date)
5
- first_id = first.id
6
- last_id = last.id
7
- jump_size = (last_id - first_id) / 2
8
- center = first_after_id(first_id + jump_size)
9
- best_distance = 1/0.0
10
- new_center = nil
7
+ first = select(:id, :created_at).first
8
+ last = select(:id, :created_at).last
9
+ jump_size = (last.id - first.id) / 2
10
+ best = _best(last, _best(first, nil, date), date)
11
+ center = _first_after_id(first.id + jump_size)
12
+
11
13
  while jump_size != 0
12
- logger.debug('iterated')
13
- new_center =
14
- if center.created_at < date
15
- # move forward
16
- first_after_id(center.id + jump_size)
17
- else
18
- # move backwards
19
- first_after_id(center.id - jump_size)
20
- end
21
-
22
-
23
- distance = new_center.created_at - date
24
- if distance == 0
25
- return new_center
26
- elsif distance > 0 && distance < best_distance
27
- best = new_center
28
- best_distance = distance
29
- end
30
-
31
- break if new_center.id == center.id
14
+ jump_size /= 2
15
+ direction = center.created_at < date ? 1 : -1 # moving forward or backward
16
+ new_center = _first_after_id(center.id + jump_size * direction)
32
17
 
33
- center = new_center
18
+ best = _best(new_center, best, date)
34
19
 
35
- jump_size /= 2
20
+ center = new_center
36
21
  end
37
22
 
38
- best
23
+ find(best.id) if best
24
+ end
25
+
26
+ def _best(center, best, date)
27
+ distance = center.created_at - date
28
+ if distance >= 0 && (!best || distance < (best.created_at - date))
29
+ center
30
+ else
31
+ best
32
+ end
39
33
  end
40
34
 
41
- def first_after_id(id)
35
+ def _first_after_id(id)
42
36
  select(:id, :created_at).where('id >= ?', id).order('id asc').first
43
37
  end
44
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: first_after_created_at
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Glass
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-21 00:00:00.000000000 Z
11
+ date: 2017-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord