ximate 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6701f4492e8a2bdfb6172881723dfd260ca05086
4
+ data.tar.gz: 33d89743a8233d50c137ed750f8501e019760d4b
5
+ SHA512:
6
+ metadata.gz: b4360ef2a9467614f7bb722fc01c21c0992639a8e464f06180a239a0810c1858d50a4b9a2818f5f79ecb7b9553f75dab939b16d782e499e07904e13a28681bf0
7
+ data.tar.gz: b3781c4999b35bdabb504d813ad34f993acbfdbe0a8bb2c9f07efb42a06248edb202919ede79b97899430e241179fdddfb75b5f04b55d004edb415cc42b3c6c1
data/.gitignore CHANGED
@@ -1,5 +1,6 @@
1
1
  *.gem
2
2
  .bundle
3
+ .redcar
3
4
  Gemfile.lock
4
5
  ext/*.bundle
5
6
  ext/*.o
data/README.rdoc CHANGED
@@ -42,13 +42,10 @@ Then you can perform a search
42
42
  Post.asearch('Hello world').where(:public => true).limit(5)
43
43
 
44
44
  +asearch+ method is chainable with the usual activerecord methods.
45
- You can also order the results by rank (calculate by ximate)
46
-
47
- Post.asearch('Hello world').order('rank DESC').where(:public => true)
48
45
 
49
46
  The cool stuff is that if you search with
50
47
 
51
- Post.asearch('Hello worlds').order('rank DESC').where(:public => true)
48
+ Post.asearch('Hello worlds').where(:public => true)
52
49
 
53
50
  the results will be the same!
54
51
  The error allowed by Ximate can be expressed as a percentage by setting the option <tt>Ximate::OPTIONS[:match_error_percent]</tt>.
@@ -58,9 +55,19 @@ Finally you can set some Ximate options in your initializers.
58
55
 
59
56
  Ximate::OPTIONS[:match_error_percent] = 20
60
57
  Ximate::OPTIONS[:ignore_word_short_than] = 2
58
+ Ximate::OPTIONS[:async] = false
61
59
  Ximate::OPTIONS[:logger] = true
62
60
  Ximate::OPTIONS[:debug] = false
63
61
 
62
+ === Ordering
63
+
64
+ You can order the results by rank (calculate by Ximate)
65
+
66
+ Post.asearch('Hello world').order('rank DESC').where(:public => true)
67
+
68
+ Unfortunately to do this, Ximate use the +FIELD+ function supported only by MySQL.
69
+ So <b>the ordering by rank works only with MySQL</b>.
70
+
64
71
  == Questions or problems?
65
72
 
66
73
  If you have any issues please add an {issue on
data/ext/extconf.rb CHANGED
@@ -2,31 +2,27 @@ ENV['RC_ARCHS'] = '' if RUBY_PLATFORM =~ /darwin/
2
2
 
3
3
  require 'mkmf'
4
4
 
5
- LIBDIR = Config::CONFIG['libdir']
6
- INCLUDEDIR = Config::CONFIG['includedir']
7
-
8
- HEADER_DIRS = [
9
- # First search /opt/local for macports
5
+ INCLUDE_DIRS = [
6
+ # Check the ruby install locations
7
+ RbConfig::CONFIG['includedir'],
8
+ # First earch /opt/local for macports
10
9
  '/opt/local/include',
11
10
  # Then search /usr/local for people that installed from source
12
11
  '/usr/local/include',
13
- # Check the ruby install locations
14
- INCLUDEDIR,
15
12
  # Finally fall back to /usr
16
13
  '/usr/include',
17
14
  ]
18
15
 
19
16
  LIB_DIRS = [
17
+ # Check the ruby install locations
18
+ RbConfig::CONFIG['libdir'],
20
19
  # First search /opt/local for macports
21
20
  '/opt/local/lib',
22
21
  # Then search /usr/local for people that installed from source
23
22
  '/usr/local/lib',
24
- # Check the ruby install locations
25
- LIBDIR,
26
23
  # Finally fall back to /usr
27
24
  '/usr/lib',
28
25
  ]
29
26
 
30
- dir_config('fuzzy_search', HEADER_DIRS, LIB_DIRS)
31
-
32
- create_makefile('fuzzy_search/fuzzy_search')
27
+ #dir_config('fuzzy_search', HEADER_DIRS, LIB_DIRS)
28
+ create_makefile('fuzzy_search/fuzzy_search')
@@ -3,15 +3,10 @@ module ActiveRecord
3
3
  class Relation
4
4
  attr_accessor :ranks
5
5
 
6
- alias_method :orig_initialize, :initialize
7
6
  alias_method :orig_order, :order
8
7
 
9
- def initialize(klass, table)
10
- @ranks = {}
11
- orig_initialize(klass, table)
12
- end
13
-
14
8
  def order(*args)
9
+ @ranks ||= {}
15
10
  if args[0] =~ /^rank/i
16
11
  unless @ranks.empty?
17
12
  tokens = args[0].split(' ')
@@ -29,4 +24,4 @@ module ActiveRecord
29
24
 
30
25
  end
31
26
 
32
- end
27
+ end
data/lib/ximate/search.rb CHANGED
@@ -3,6 +3,7 @@ module Ximate
3
3
  DATA = {}
4
4
  OPTIONS = {:match_error_percent => 20,
5
5
  :ignore_word_short_than => 2,
6
+ :async => false,
6
7
  :logger => true,
7
8
  :debug => false}
8
9
 
@@ -23,11 +24,17 @@ module Ximate
23
24
 
24
25
  after_save { |proc| proc.update_index(I18n.locale, &block) }
25
26
 
26
- now = Time.now
27
- self.to_s.classify.constantize.all.each do |p|
28
- p.update_index(locale, &block)
27
+ calculate_indices = Proc.new do
28
+ now = Time.now
29
+ self.to_s.classify.constantize.find_in_batches(batch_size: 100) do |group|
30
+ group.each do |p|
31
+ p.update_index(locale, &block)
32
+ end
33
+ end
34
+ puts "\b\b=> Build XIMATE hash data for '#{table}' in #{Time.now - now}s." if OPTIONS[:logger]
29
35
  end
30
- puts "\b\b=> Build XIMATE hash data for '#{table}' in #{Time.now - now}s." if OPTIONS[:logger]
36
+
37
+ OPTIONS[:async] ? Thread.new{calculate_indices.call} : calculate_indices.call
31
38
  end
32
39
  end
33
40
  end
@@ -55,8 +62,8 @@ module Ximate
55
62
  end
56
63
  end
57
64
  end
58
- return where('1 = 0') if matches.empty?
59
- rel = scoped
65
+ return none if matches.empty?
66
+ rel = all
60
67
  rel.ranks = matches
61
68
  rel.where("#{table}.id IN (#{matches.keys.join(',')})")
62
69
  # select("*, #{gen_if_select(matches)} AS RANK").where("#{table}.id IN (#{matches.keys.join(',')})")
@@ -111,4 +118,4 @@ module Ximate
111
118
 
112
119
  end
113
120
 
114
- end
121
+ end
@@ -1,3 +1,3 @@
1
1
  module Ximate
2
- VERSION = '0.2.4'
2
+ VERSION = '0.3.0'
3
3
  end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ximate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
5
- prerelease:
4
+ version: 0.3.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Enrico Pilotto
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2011-11-04 00:00:00.000000000Z
11
+ date: 2017-02-13 00:00:00.000000000 Z
13
12
  dependencies: []
14
13
  description: Approximate fuzzy search for Ruby on Rails activerecord models.
15
14
  email:
@@ -19,7 +18,7 @@ extensions:
19
18
  - ext/extconf.rb
20
19
  extra_rdoc_files: []
21
20
  files:
22
- - .gitignore
21
+ - ".gitignore"
23
22
  - Gemfile
24
23
  - README.rdoc
25
24
  - Rakefile
@@ -35,27 +34,26 @@ files:
35
34
  homepage: https://github.com/pioz/ximate
36
35
  licenses:
37
36
  - MIT
37
+ metadata: {}
38
38
  post_install_message:
39
39
  rdoc_options: []
40
40
  require_paths:
41
41
  - lib
42
42
  - ext
43
43
  required_ruby_version: !ruby/object:Gem::Requirement
44
- none: false
45
44
  requirements:
46
- - - ! '>='
45
+ - - ">="
47
46
  - !ruby/object:Gem::Version
48
47
  version: '0'
49
48
  required_rubygems_version: !ruby/object:Gem::Requirement
50
- none: false
51
49
  requirements:
52
- - - ! '>='
50
+ - - ">="
53
51
  - !ruby/object:Gem::Version
54
52
  version: '0'
55
53
  requirements: []
56
54
  rubyforge_project: ximate
57
- rubygems_version: 1.8.6
55
+ rubygems_version: 2.6.8
58
56
  signing_key:
59
- specification_version: 3
57
+ specification_version: 4
60
58
  summary: Approximate fuzzy search for Ruby on Rails
61
59
  test_files: []