picky 3.1.2 → 3.1.3

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.
@@ -13,6 +13,8 @@ module Picky
13
13
  #
14
14
  class Basic
15
15
 
16
+ include Helpers::File
17
+
16
18
  attr_reader :cache_path, # This index file's location.
17
19
  :mapping_file # The index file's mapping file (loaded into memory for quick access).
18
20
 
@@ -34,6 +36,50 @@ module Picky
34
36
  :index
35
37
  end
36
38
 
39
+ # Will copy the index file to a location that
40
+ # is in a directory named "backup" right under
41
+ # the directory the index file is in.
42
+ #
43
+ def backup
44
+ mapping_file.backup
45
+
46
+ prepare_backup backup_directory(cache_path)
47
+ FileUtils.cp cache_path, target, verbose: true
48
+ end
49
+
50
+ # Copies the file from its backup location back
51
+ # to the original location.
52
+ #
53
+ def restore
54
+ mapping_file.restore
55
+
56
+ FileUtils.cp backup_file_path_of(cache_path), cache_path, verbose: true
57
+ end
58
+
59
+ # Deletes the file.
60
+ #
61
+ def delete
62
+ mapping_file.delete
63
+
64
+ `rm -Rf #{cache_path}`
65
+ end
66
+
67
+ # Is this cache file suspiciously small?
68
+ # (less than 8 Bytes of size)
69
+ #
70
+ def cache_small?
71
+ size_of(cache_path) < 8
72
+ end
73
+
74
+ # Is the cache ok? (existing and larger than
75
+ # zero Bytes in size)
76
+ #
77
+ # A small cache is still ok.
78
+ #
79
+ def cache_ok?
80
+ size_of(cache_path) > 0
81
+ end
82
+
37
83
  end
38
84
 
39
85
  end
@@ -0,0 +1,43 @@
1
+ module Picky
2
+
3
+ module Backends
4
+
5
+ module Helpers
6
+
7
+ # Common file helpers.
8
+ #
9
+ module File
10
+
11
+ # The backup directory of this file.
12
+ # Equal to the file's dirname plus /backup
13
+ #
14
+ def backup_directory path
15
+ ::File.join ::File.dirname(path), 'backup'
16
+ end
17
+
18
+ # Prepares the backup directory for the file.
19
+ #
20
+ def prepare_backup target
21
+ FileUtils.mkdir target unless Dir.exists?(target)
22
+ end
23
+
24
+ # The backup filename.
25
+ #
26
+ def backup_file_path_of path
27
+ dir, name = ::File.split path
28
+ ::File.join dir, 'backup', name
29
+ end
30
+
31
+ # Extracts the size of the file in Bytes.
32
+ #
33
+ def size_of path
34
+ `ls -l #{path} | awk '{print $5}'`.to_i
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -13,6 +13,8 @@ module Picky
13
13
  #
14
14
  class Basic
15
15
 
16
+ include Helpers::File
17
+
16
18
  # This file's location.
17
19
  #
18
20
  attr_reader :cache_path
@@ -39,20 +41,6 @@ module Picky
39
41
  FileUtils.cp cache_path, target, verbose: true
40
42
  end
41
43
 
42
- # The backup directory of this file.
43
- # Equal to the file's dirname plus /backup
44
- #
45
-
46
- def backup_directory
47
- ::File.join ::File.dirname(cache_path), 'backup'
48
- end
49
-
50
- # Prepares the backup directory for the file.
51
- #
52
- def prepare_backup target
53
- FileUtils.mkdir target unless Dir.exists?(target)
54
- end
55
-
56
44
  # Copies the file from its backup location back
57
45
  # to the original location.
58
46
  #
@@ -60,13 +48,6 @@ module Picky
60
48
  FileUtils.cp backup_file_path_of(cache_path), cache_path, verbose: true
61
49
  end
62
50
 
63
- # The backup filename.
64
- #
65
- def backup_file_path_of path
66
- dir, name = ::File.split path
67
- ::File.join dir, 'backup', name
68
- end
69
-
70
51
  # Deletes the file.
71
52
  #
72
53
  def delete
@@ -82,6 +63,7 @@ module Picky
82
63
  def cache_small?
83
64
  size_of(cache_path) < 8
84
65
  end
66
+
85
67
  # Is the cache ok? (existing and larger than
86
68
  # zero Bytes in size)
87
69
  #
@@ -90,11 +72,6 @@ module Picky
90
72
  def cache_ok?
91
73
  size_of(cache_path) > 0
92
74
  end
93
- # Extracts the size of the file in Bytes.
94
- #
95
- def size_of path
96
- `ls -l #{path} | awk '{print $5}'`.to_i
97
- end
98
75
 
99
76
  #
100
77
  #
data/lib/picky/loader.rb CHANGED
@@ -111,6 +111,7 @@ module Picky
111
111
 
112
112
  # Index store handling.
113
113
  #
114
+ load_relative 'backends/helpers/file'
114
115
  load_relative 'backends/backend'
115
116
 
116
117
  load_relative 'backends/redis'
@@ -52,13 +52,8 @@ module Picky
52
52
 
53
53
  #
54
54
  #
55
- def keep identifiers = [] # categories
56
- @combinations.keep identifiers
57
- end
58
- #
59
- #
60
- def remove identifiers = [] # categories
61
- @combinations.remove identifiers
55
+ def remove categories = []
56
+ @combinations.remove categories
62
57
  end
63
58
 
64
59
  # Sort highest score first.
@@ -38,19 +38,12 @@ module Picky
38
38
  @allocations = @allocations.shift amount
39
39
  end
40
40
 
41
- # Keeps combinations.
42
- #
43
- # Only those passed in remain.
44
- #
45
- def keep identifiers = []
46
- @allocations.each { |allocation| allocation.keep identifiers } unless identifiers.empty?
47
- end
48
41
  # Removes combinations.
49
42
  #
50
43
  # Only those passed in are removed.
51
44
  #
52
- def remove identifiers = []
53
- @allocations.each { |allocation| allocation.remove identifiers } unless identifiers.empty?
45
+ def remove categories = []
46
+ @allocations.each { |allocation| allocation.remove categories } unless categories.empty?
54
47
  end
55
48
 
56
49
  # Returns the top amount ids.
@@ -61,12 +61,6 @@ module Picky
61
61
  "#{bundle.identifier}:#{token.identifier}"
62
62
  end
63
63
 
64
- # Is the identifier in the given identifiers?
65
- #
66
- def in? identifiers
67
- identifiers.include? identifier
68
- end
69
-
70
64
  # Note: Required for uniq!
71
65
  #
72
66
  def hash
@@ -37,26 +37,15 @@ module Picky
37
37
  weights.score_for @combinations
38
38
  end
39
39
 
40
- # Filters the tokens and identifiers such that only identifiers
41
- # that are passed in, remain, including their tokens.
40
+ # Filters the tokens and categories such that categories
41
+ # that are passed in, are removed.
42
42
  #
43
43
  # Note: This method is not totally independent of the calculate_ids one.
44
44
  # Since identifiers are only nullified, we need to not include the
45
45
  # ids that have an associated identifier that is nil.
46
46
  #
47
- def keep identifiers = []
48
- @combinations.reject! { |combination| !combination.in?(identifiers) }
49
- end
50
-
51
- # Filters the tokens and identifiers such that identifiers
52
- # that are passed in, are removed, including their tokens.
53
- #
54
- # Note: This method is not totally independent of the calculate_ids one.
55
- # Since identifiers are only nullified, we need to not include the
56
- # ids that have an associated identifier that is nil.
57
- #
58
- def remove identifiers = []
59
- @combinations.reject! { |combination| combination.in?(identifiers) }
47
+ def remove categories = []
48
+ @combinations.reject! { |combination| categories.include?(combination.category) }
60
49
  end
61
50
 
62
51
  #
@@ -13,7 +13,8 @@ module Picky
13
13
  #
14
14
  class Indexes
15
15
 
16
- attr_reader :indexes
16
+ attr_reader :indexes,
17
+ :ignored_categories
17
18
 
18
19
  # Creates a new Query::Indexes.
19
20
  #
@@ -24,10 +25,11 @@ module Picky
24
25
  IndexesCheck.check_backend_types indexes
25
26
 
26
27
  @indexes = indexes
27
- @mapper = Query::QualifierCategoryMapper.new
28
+
28
29
  map_categories
29
30
  end
30
31
  def map_categories
32
+ @mapper = Query::QualifierCategoryMapper.new
31
33
  @indexes.each do |index|
32
34
  index.each_category do |category|
33
35
  @mapper.add category
@@ -35,6 +37,21 @@ module Picky
35
37
  end
36
38
  end
37
39
 
40
+ # Ignore the categories with these qualifiers.
41
+ #
42
+ # Example:
43
+ # search = Search.new(index1, index2, index3) do
44
+ # ignore :name, :first_name
45
+ # end
46
+ #
47
+ # Cleans up / optimizes after being called.
48
+ #
49
+ def ignore *qualifiers
50
+ @ignored_categories ||= []
51
+ @ignored_categories += qualifiers.map { |qualifier| @mapper.map qualifier }.compact
52
+ @ignored_categories.uniq!
53
+ end
54
+
38
55
  # Returns a number of prepared (sorted, reduced etc.) allocations for the given tokens.
39
56
  #
40
57
  def prepared_allocations_for tokens, weights = {}
@@ -57,9 +74,9 @@ module Picky
57
74
  #
58
75
  # allocations.reduce_to some_amount
59
76
 
60
- # Remove identifiers from allocations.
77
+ # Remove categories from allocations.
61
78
  #
62
- # allocations.remove some_array_of_identifiers_to_remove
79
+ allocations.remove ignored_categories if ignored_categories
63
80
 
64
81
  allocations
65
82
  end
data/lib/picky/search.rb CHANGED
@@ -21,11 +21,13 @@ module Picky
21
21
  attr_accessor :tokenizer,
22
22
  :weights
23
23
 
24
+ delegate :ignore,
25
+ :to => :indexes
26
+
24
27
  # Takes:
25
28
  # * A number of indexes
26
29
  #
27
- # TODO Add identifiers_to_remove (rename) and reduce_allocations_to_amount (rename).
28
- # TODO categories_to_remove ?
30
+ # TODO Add reduce_allocations_to_amount (rename).
29
31
  #
30
32
  # It is also possible to define the tokenizer and weights like so.
31
33
  # Example:
@@ -73,6 +73,7 @@ describe Picky::Application do
73
73
 
74
74
  buks_search = Picky::Search.new(books_index) do
75
75
  searching removes_characters: /[buks]/
76
+ ignore :author
76
77
  end
77
78
  route %r{^/buks} => buks_search
78
79
  end
@@ -12,7 +12,7 @@ describe Picky::Backends::Memory::Basic do
12
12
 
13
13
  describe 'backup_directory' do
14
14
  it "returns the cache path's backup path" do
15
- file.backup_directory.should == 'some/cache/path/to/backup'
15
+ file.backup_directory('some/cache/path/to/file').should == 'some/cache/path/to/backup'
16
16
  end
17
17
  end
18
18
 
@@ -43,17 +43,9 @@ describe Picky::Query::Allocation do
43
43
 
44
44
  describe 'remove' do
45
45
  it 'should delegate to the combinations' do
46
- @combinations.should_receive(:remove).once.with [:some_identifiers]
46
+ @combinations.should_receive(:remove).once.with [:some_categories]
47
47
 
48
- @allocation.remove [:some_identifiers]
49
- end
50
- end
51
-
52
- describe 'keep' do
53
- it 'should delegate to the combinations' do
54
- @combinations.should_receive(:keep).once.with [:some_identifiers]
55
-
56
- @allocation.keep [:some_identifiers]
48
+ @allocation.remove [:some_categories]
57
49
  end
58
50
  end
59
51
 
@@ -31,39 +31,13 @@ describe Picky::Query::Allocations do
31
31
  @allocations.remove
32
32
  end
33
33
  end
34
- context 'identifiers not empty' do
34
+ context 'categories not empty' do
35
35
  it 'should remove each' do
36
- @allocation1.should_receive(:remove).once.with :some_identifier
37
- @allocation2.should_receive(:remove).once.with :some_identifier
38
- @allocation3.should_receive(:remove).once.with :some_identifier
36
+ @allocation1.should_receive(:remove).once.with :some_category
37
+ @allocation2.should_receive(:remove).once.with :some_category
38
+ @allocation3.should_receive(:remove).once.with :some_category
39
39
 
40
- @allocations.remove :some_identifier
41
- end
42
- end
43
- end
44
-
45
- describe 'keep' do
46
- before(:each) do
47
- @allocation1 = stub :allocation1
48
- @allocation2 = stub :allocation2
49
- @allocation3 = stub :allocation3
50
- @allocations = described_class.new [@allocation1, @allocation2, @allocation3]
51
- end
52
- context 'identifiers empty' do
53
- it 'should do nothing' do
54
- @allocation1.should_receive(:keep).never
55
- @allocation2.should_receive(:keep).never
56
-
57
- @allocations.keep
58
- end
59
- end
60
- context 'identifiers not empty' do
61
- it 'should filter each' do
62
- @allocation1.should_receive(:keep).once.with :some_identifier
63
- @allocation2.should_receive(:keep).once.with :some_identifier
64
- @allocation3.should_receive(:keep).once.with :some_identifier
65
-
66
- @allocations.keep :some_identifier
40
+ @allocations.remove :some_category
67
41
  end
68
42
  end
69
43
  end
@@ -26,18 +26,6 @@ describe Picky::Query::Combination do
26
26
  end
27
27
  end
28
28
 
29
- describe 'in?' do
30
- before(:each) do
31
- @combination.stub! :identifier => :some_identifier
32
- end
33
- it 'should check if the given identifiers include the identifier' do
34
- @combination.in?([:some_other_identifier, :some_identifier, :some_other_identifier]).should == true
35
- end
36
- it 'should check if the given identifiers include the identifier' do
37
- @combination.in?([:some_other_identifier, :some_other_identifier]).should == false
38
- end
39
- end
40
-
41
29
  describe 'to_result' do
42
30
  context 'functional with qualifier' do
43
31
  before(:each) do
@@ -80,27 +80,14 @@ describe Picky::Query::Combinations do
80
80
 
81
81
  describe 'remove' do
82
82
  before(:each) do
83
- @combination1 = stub :combination1, :in? => false
84
- @combination2 = stub :combination2, :in? => true
85
- @combination3 = stub :combination3, :in? => true
83
+ @combination1 = stub :combination1, :category => :other
84
+ @combination2 = stub :combination2, :category => :to_remove
85
+ @combination3 = stub :combination3, :category => :to_remove
86
86
 
87
87
  @combinations = described_class.new [@combination1, @combination2, @combination3]
88
88
  end
89
89
  it 'should remove the combinations' do
90
- @combinations.remove([:any]).should == [@combination1]
91
- end
92
- end
93
-
94
- describe 'keep' do
95
- before(:each) do
96
- @combination1 = stub :combination1, :in? => false
97
- @combination2 = stub :combination2, :in? => true
98
- @combination3 = stub :combination3, :in? => true
99
-
100
- @combinations = described_class.new [@combination1, @combination2, @combination3]
101
- end
102
- it 'should filter the combinations' do
103
- @combinations.keep([:any]).should == [@combination2, @combination3]
90
+ @combinations.remove([:to_remove]).should == [@combination1]
104
91
  end
105
92
  end
106
93
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: picky
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 3.1.2
5
+ version: 3.1.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Florian Hanke
@@ -32,7 +32,7 @@ dependencies:
32
32
  requirements:
33
33
  - - "="
34
34
  - !ruby/object:Gem::Version
35
- version: 3.1.2
35
+ version: 3.1.3
36
36
  type: :development
37
37
  version_requirements: *id002
38
38
  description: Fast Ruby semantic text search engine with comfortable single field interface.
@@ -55,6 +55,7 @@ files:
55
55
  - lib/picky/backends/file/basic.rb
56
56
  - lib/picky/backends/file/json.rb
57
57
  - lib/picky/backends/file.rb
58
+ - lib/picky/backends/helpers/file.rb
58
59
  - lib/picky/backends/memory/basic.rb
59
60
  - lib/picky/backends/memory/json.rb
60
61
  - lib/picky/backends/memory/marshal.rb