picky 4.5.6 → 4.5.7
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.
data/lib/picky/category.rb
CHANGED
@@ -14,13 +14,15 @@ module Picky
|
|
14
14
|
:prepared,
|
15
15
|
:backend
|
16
16
|
|
17
|
-
#
|
17
|
+
# Parameters:
|
18
18
|
# * name: Category name to use as identifier and file names.
|
19
19
|
# * index: Index to which this category is attached to.
|
20
20
|
#
|
21
21
|
# Options:
|
22
|
-
# * partial: Partial::None.new, Partial::Substring.new(from:start_char, to:up_to_char)
|
23
|
-
#
|
22
|
+
# * partial: Partial::None.new, Partial::Substring.new(from:start_char, to:up_to_char)
|
23
|
+
# (defaults from:-3, to:-1)
|
24
|
+
# * similarity: Similarity::None.new (default),
|
25
|
+
# Similarity::DoubleMetaphone.new(amount_of_similarly_linked_words)
|
24
26
|
# * from: The source category identifier to take the data from.
|
25
27
|
# * key_format: What this category's keys are formatted with (default is :to_i)
|
26
28
|
# * backend: The backend to use. Default is Backends::Memory.new.
|
@@ -28,10 +30,11 @@ module Picky
|
|
28
30
|
# * qualifiers: Which qualifiers can be used to predefine the category. E.g. "title:bla".
|
29
31
|
#
|
30
32
|
# Advanced Options:
|
31
|
-
# * weight: Query::Weights.new( [:category1, :category2] => +2, ... )
|
32
|
-
# * tokenizer: Use a subclass of Tokenizers::Base that implements #tokens_for and #empty_tokens.
|
33
|
-
# * use_symbols: Whether to use symbols internally instead of strings.
|
34
33
|
# * source: Use if the category should use a different source.
|
34
|
+
# * tokenizer: Use a subclass of Tokenizers::Base that implements #tokens_for and #empty_tokens.
|
35
|
+
# * weight: Weights::Logarithmic.new, Weights::Constant.new(int = 0),
|
36
|
+
# Weights::Dynamic.new(&block) or an object that responds
|
37
|
+
# to #weight_for(amount_of_ids_for_token) and returns a float.
|
35
38
|
#
|
36
39
|
def initialize name, index, options = {}
|
37
40
|
@name = name
|
@@ -3,24 +3,40 @@ module Picky
|
|
3
3
|
module Generators
|
4
4
|
|
5
5
|
module Weights
|
6
|
-
|
6
|
+
|
7
7
|
# Uses a logarithmic weight.
|
8
|
+
#
|
9
|
+
# If given a constant, this will be added to the weight.
|
10
|
+
#
|
8
11
|
# If for a key k we have x ids, the weight is:
|
9
12
|
# w(x): log(x)
|
10
13
|
# Special case: If x < 1, then we use 0.
|
11
14
|
#
|
12
15
|
class Logarithmic < Strategy
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
16
|
+
|
17
|
+
def initialize constant = 0.0
|
18
|
+
# Note: Optimisation since it is called
|
19
|
+
# once per indexed object.
|
20
|
+
#
|
21
|
+
if constant == 0.0
|
22
|
+
def weight_for amount
|
23
|
+
return 0 if amount < 1
|
24
|
+
Math.log(amount).round 3
|
25
|
+
end
|
26
|
+
else
|
27
|
+
@constant = constant
|
28
|
+
# Sets the weight value.
|
29
|
+
#
|
30
|
+
# If the size is 0 or one, we would get -Infinity or 0.0.
|
31
|
+
# Thus we do not set a value if there is just one. The default, dynamically, is 0.
|
32
|
+
#
|
33
|
+
# BUT: We need the value, even if 0. To designate that there IS a weight!
|
34
|
+
#
|
35
|
+
def weight_for amount
|
36
|
+
return @constant if amount < 1
|
37
|
+
@constant + Math.log(amount).round(3)
|
38
|
+
end
|
39
|
+
end
|
24
40
|
end
|
25
41
|
|
26
42
|
end
|
@@ -19,6 +19,14 @@ describe Picky::API::Category::Weight do
|
|
19
19
|
object.extract_weight(nil).should == Picky::Weights::Default
|
20
20
|
end
|
21
21
|
end
|
22
|
+
context 'with a number' do
|
23
|
+
it 'returns a logarithmic weighter' do
|
24
|
+
object.extract_weight(7.3).should be_kind_of(Picky::Weights::Logarithmic)
|
25
|
+
end
|
26
|
+
it 'returns a logarithmic weighter' do
|
27
|
+
object.extract_weight(3.14).weight_for(10).should == 5.443 # ln(10) + 3.14 = 2.3025 + 3.14
|
28
|
+
end
|
29
|
+
end
|
22
30
|
context 'with a weight object' do
|
23
31
|
let(:weighter) do
|
24
32
|
Class.new do
|
@@ -2,23 +2,47 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Picky::Generators::Weights::Logarithmic do
|
4
4
|
|
5
|
-
|
5
|
+
describe 'with defaults' do
|
6
|
+
let(:logarithmic) { described_class.new }
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
describe 'saved?' do
|
9
|
+
it 'is correct' do
|
10
|
+
logarithmic.saved?.should == true
|
11
|
+
end
|
10
12
|
end
|
11
|
-
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
describe 'weight_for' do
|
15
|
+
it 'is 0 for 0' do
|
16
|
+
logarithmic.weight_for(0).should == 0
|
17
|
+
end
|
18
|
+
it 'is 0 for 1' do
|
19
|
+
logarithmic.weight_for(1).should == 0
|
20
|
+
end
|
21
|
+
it 'is log(x) for x' do
|
22
|
+
logarithmic.weight_for(1234).should == Math.log(1234).round(3)
|
23
|
+
end
|
16
24
|
end
|
17
|
-
|
18
|
-
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'with constant' do
|
28
|
+
let(:logarithmic) { described_class.new(3.5) }
|
29
|
+
|
30
|
+
describe 'saved?' do
|
31
|
+
it 'is correct' do
|
32
|
+
logarithmic.saved?.should == true
|
33
|
+
end
|
19
34
|
end
|
20
|
-
|
21
|
-
|
35
|
+
|
36
|
+
describe 'weight_for' do
|
37
|
+
it 'is 0 for 0' do
|
38
|
+
logarithmic.weight_for(0).should == 3.5
|
39
|
+
end
|
40
|
+
it 'is 0 for 1' do
|
41
|
+
logarithmic.weight_for(1).should == 3.5
|
42
|
+
end
|
43
|
+
it 'is log(x) for x' do
|
44
|
+
logarithmic.weight_for(1234).should == Math.log(1234).round(3) + 3.5
|
45
|
+
end
|
22
46
|
end
|
23
47
|
end
|
24
48
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: picky
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.5.
|
4
|
+
version: 4.5.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70151588753500 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,21 +21,21 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70151588753500
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: picky-client
|
27
|
-
requirement: &
|
27
|
+
requirement: &70151588752540 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 4.5.
|
32
|
+
version: 4.5.7
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70151588752540
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: text
|
38
|
-
requirement: &
|
38
|
+
requirement: &70151588750500 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70151588750500
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: multi_json
|
49
|
-
requirement: &
|
49
|
+
requirement: &70151588748300 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70151588748300
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: activesupport
|
60
|
-
requirement: &
|
60
|
+
requirement: &70151588762580 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '3.0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70151588762580
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: procrastinate
|
71
|
-
requirement: &
|
71
|
+
requirement: &70151588760860 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0.4'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70151588760860
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: rack_fast_escape
|
82
|
-
requirement: &
|
82
|
+
requirement: &70151588759980 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70151588759980
|
91
91
|
description: Fast Ruby semantic text search engine with comfortable single field interface.
|
92
92
|
email: florian.hanke+picky@gmail.com
|
93
93
|
executables:
|