dnif 0.0.1.beta.2 → 0.0.1.beta.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.
- data/README.rdoc +2 -0
- data/dnif.gemspec +2 -2
- data/lib/dnif/document.rb +5 -4
- data/lib/dnif/indexer.rb +4 -3
- data/lib/dnif/schema.rb +2 -11
- data/lib/dnif/search.rb +13 -8
- data/test/fixtures/sphinx_1.xml +2 -1
- data/test/fixtures/sphinx_2.xml +2 -1
- data/test/fixtures/sphinx_3.xml +2 -1
- data/test/fixtures/sphinx_4.xml +2 -1
- data/test/fixtures/sphinx_5.xml +2 -1
- data/test/test_helper.rb +1 -0
- data/test/unit/test_indexer.rb +17 -0
- data/test/unit/test_search.rb +42 -21
- metadata +3 -3
data/README.rdoc
CHANGED
@@ -38,6 +38,8 @@ dnif is a gem to index data using ActiveRecord finders (for now), letting you in
|
|
38
38
|
- Improve test suite
|
39
39
|
- Index in chunks
|
40
40
|
- Support to delta index (or something like that)
|
41
|
+
- Remove the class_name (seems not be necessary anymore)
|
42
|
+
- Move this TODO to Issues
|
41
43
|
|
42
44
|
== Maintainer
|
43
45
|
|
data/dnif.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{dnif}
|
8
|
-
s.version = "0.0.1.beta.
|
8
|
+
s.version = "0.0.1.beta.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Rafael Souza"]
|
12
|
-
s.date = %q{2010-07-
|
12
|
+
s.date = %q{2010-07-15}
|
13
13
|
s.description = %q{dnif is a gem to index data using ActiveRecord finders, letting you index your custom methods and not only your table fields}
|
14
14
|
s.email = %q{me@rafaelss.com}
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/dnif/document.rb
CHANGED
@@ -23,7 +23,8 @@ module Dnif
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
xml.class_id(
|
26
|
+
xml.class_id(@object.indexes.keys.index(@object.class.name))
|
27
|
+
xml.class_name(encoded_class_name)
|
27
28
|
|
28
29
|
attributes = []
|
29
30
|
@object.indexes.values.each do |index|
|
@@ -53,12 +54,12 @@ module Dnif
|
|
53
54
|
|
54
55
|
private
|
55
56
|
|
56
|
-
def
|
57
|
-
@
|
57
|
+
def encoded_class_name
|
58
|
+
@encoded_class_name ||= Dnif::MultiAttribute.encode(@object.class.name)
|
58
59
|
end
|
59
60
|
|
60
61
|
def document_id
|
61
|
-
@object.id +
|
62
|
+
@object.id + encoded_class_name.split(',').sum { |c| c.to_i }
|
62
63
|
end
|
63
64
|
end
|
64
65
|
end
|
data/lib/dnif/indexer.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
module Dnif
|
2
2
|
module Indexer
|
3
3
|
|
4
|
+
@@indexes ||= {}
|
5
|
+
|
4
6
|
def define_index(&block)
|
5
|
-
|
6
|
-
@@indexes[self.name] = Dnif::Index.new(&block)
|
7
|
+
indexes[self.name] = Dnif::Index.new(&block)
|
7
8
|
|
8
9
|
include InstanceMethods
|
9
10
|
end
|
@@ -48,4 +49,4 @@ module Dnif
|
|
48
49
|
end
|
49
50
|
end
|
50
51
|
|
51
|
-
ActiveRecord::Base.extend(Dnif::Indexer)
|
52
|
+
ActiveRecord::Base.extend(Dnif::Indexer) if defined?(ActiveRecord::Base)
|
data/lib/dnif/schema.rb
CHANGED
@@ -8,16 +8,6 @@ module Dnif
|
|
8
8
|
def generate
|
9
9
|
xml = Builder::XmlMarkup.new(:indent => 2)
|
10
10
|
xml.sphinx(:schema) do
|
11
|
-
# fields = @klass.indexes[@klass.name].fields.map do |name|
|
12
|
-
# xml.sphinx(:field, :name => name)
|
13
|
-
# name
|
14
|
-
# end
|
15
|
-
#
|
16
|
-
# attributes = @klass.indexes[@klass.name].attributes.map do |name, type|
|
17
|
-
# xml.sphinx(:attr, :name => name, :type => attribute_type(type))
|
18
|
-
# name
|
19
|
-
# end
|
20
|
-
|
21
11
|
fields = []
|
22
12
|
@klass.indexes.values.each do |index|
|
23
13
|
(index.fields - fields).each do |name|
|
@@ -26,7 +16,8 @@ module Dnif
|
|
26
16
|
end
|
27
17
|
end
|
28
18
|
|
29
|
-
xml.sphinx(:attr, :name => "class_id", :type => "
|
19
|
+
xml.sphinx(:attr, :name => "class_id", :type => "int")
|
20
|
+
xml.sphinx(:attr, :name => "class_name", :type => "multi")
|
30
21
|
|
31
22
|
attributes = []
|
32
23
|
@klass.indexes.values.each do |index|
|
data/lib/dnif/search.rb
CHANGED
@@ -3,20 +3,25 @@ module Dnif
|
|
3
3
|
def self.search(query, options = {})
|
4
4
|
options.reverse_merge!(:index => '*')
|
5
5
|
|
6
|
-
if options[:
|
7
|
-
|
8
|
-
|
6
|
+
if options[:classes]
|
7
|
+
ids = if options[:classes].is_a?(Array)
|
8
|
+
options[:classes].map { |name| ActiveRecord::Base.indexes.keys.index(name) }
|
9
|
+
else
|
10
|
+
[ActiveRecord::Base.indexes.keys.index(options[:classes])]
|
11
|
+
end
|
12
|
+
|
13
|
+
client.filters = [Riddle::Client::Filter.new("class_id", ids)]
|
9
14
|
end
|
10
15
|
|
11
16
|
results = client.query(query, options[:index])
|
12
17
|
raise results[:error] if results[:error]
|
13
18
|
|
14
19
|
models = results[:matches].inject({}) do |memo, match|
|
15
|
-
|
16
|
-
class_name = Dnif::MultiAttribute.decode(
|
20
|
+
encoded_class_name = match[:attributes]["class_name"].split(',').flatten
|
21
|
+
class_name = Dnif::MultiAttribute.decode(encoded_class_name)
|
17
22
|
|
18
23
|
memo[class_name] ||= []
|
19
|
-
memo[class_name] << (match[:doc] -
|
24
|
+
memo[class_name] << (match[:doc] - encoded_class_name.sum { |c| c.to_i })
|
20
25
|
memo
|
21
26
|
end
|
22
27
|
|
@@ -45,9 +50,9 @@ module Dnif
|
|
45
50
|
module Search
|
46
51
|
|
47
52
|
def search(query)
|
48
|
-
Dnif.search(query, :
|
53
|
+
Dnif.search(query, :classes => self.name)
|
49
54
|
end
|
50
55
|
end
|
51
56
|
end
|
52
57
|
|
53
|
-
ActiveRecord::Base.extend(Dnif::Search)
|
58
|
+
ActiveRecord::Base.extend(Dnif::Search) if defined?(ActiveRecord::Base)
|
data/test/fixtures/sphinx_1.xml
CHANGED
@@ -5,7 +5,8 @@
|
|
5
5
|
<sphinx:field name="full_name"/>
|
6
6
|
<sphinx:field name="title"/>
|
7
7
|
<sphinx:field name="buyer"/>
|
8
|
-
<sphinx:attr name="class_id" type="
|
8
|
+
<sphinx:attr name="class_id" type="int"/>
|
9
|
+
<sphinx:attr name="class_name" type="multi"/>
|
9
10
|
<sphinx:attr name="active" type="bool"/>
|
10
11
|
<sphinx:attr name="clicked" type="int"/>
|
11
12
|
<sphinx:attr name="published_at" type="timestamp"/>
|
data/test/fixtures/sphinx_2.xml
CHANGED
data/test/fixtures/sphinx_3.xml
CHANGED
data/test/fixtures/sphinx_4.xml
CHANGED
@@ -3,7 +3,8 @@
|
|
3
3
|
<sphinx:field name="full_name"/>
|
4
4
|
<sphinx:field name="title"/>
|
5
5
|
<sphinx:field name="buyer"/>
|
6
|
-
<sphinx:attr name="class_id" type="
|
6
|
+
<sphinx:attr name="class_id" type="int"/>
|
7
|
+
<sphinx:attr name="class_name" type="multi"/>
|
7
8
|
<sphinx:attr name="active" type="bool"/>
|
8
9
|
<sphinx:attr name="clicked" type="int"/>
|
9
10
|
<sphinx:attr name="published_at" type="timestamp"/>
|
data/test/fixtures/sphinx_5.xml
CHANGED
data/test/test_helper.rb
CHANGED
data/test/unit/test_indexer.rb
CHANGED
@@ -11,6 +11,23 @@ class TestIndexer < Test::Unit::TestCase
|
|
11
11
|
DatabaseCleaner.clean
|
12
12
|
end
|
13
13
|
|
14
|
+
test ".define_index" do
|
15
|
+
klass = Class.new
|
16
|
+
klass.extend(Dnif::Indexer)
|
17
|
+
klass.stubs(:name).returns("Klass")
|
18
|
+
klass.define_index do
|
19
|
+
field :a
|
20
|
+
attribute :b, :type => :integer
|
21
|
+
where "c"
|
22
|
+
end
|
23
|
+
|
24
|
+
assert_equal [:a], klass.indexes["Klass"].fields
|
25
|
+
assert_equal({ :b => :integer }, klass.indexes["Klass"].attributes)
|
26
|
+
assert_equal "c", klass.indexes["Klass"].conditions
|
27
|
+
|
28
|
+
klass.indexes.delete("Klass")
|
29
|
+
end
|
30
|
+
|
14
31
|
test "objects without index should not have dnif included" do
|
15
32
|
assert_false Post.new.respond_to?(:to_sphinx)
|
16
33
|
assert_false Post.respond_to?(:to_sphinx)
|
data/test/unit/test_search.rb
CHANGED
@@ -40,12 +40,12 @@ class TestSearch < Test::Unit::TestCase
|
|
40
40
|
:matches => [{
|
41
41
|
:doc => 2983,
|
42
42
|
:attributes => {
|
43
|
-
"
|
43
|
+
"class_name" => "336,623,883,1140"
|
44
44
|
}
|
45
45
|
}, {
|
46
46
|
:doc => 7893,
|
47
47
|
:attributes => {
|
48
|
-
"
|
48
|
+
"class_name" => "323,623,877,1133,1381,1646,1908"
|
49
49
|
}
|
50
50
|
}]
|
51
51
|
}
|
@@ -60,36 +60,57 @@ class TestSearch < Test::Unit::TestCase
|
|
60
60
|
end
|
61
61
|
|
62
62
|
test ".search through models" do
|
63
|
-
|
63
|
+
riddle = mock("Riddle")
|
64
|
+
riddle.expects(:query).with("post", "*").returns(results_for_post)
|
65
|
+
riddle.expects(:query).with("comment", "*").returns(results_for_comment)
|
66
|
+
riddle.expects(:filters=).twice.returns([])
|
67
|
+
Dnif.expects(:client).times(4).returns(riddle)
|
68
|
+
|
69
|
+
ActiveRecord::Base.expects(:indexes).twice.returns({ "Post" => mock, "Comment" => mock })
|
70
|
+
|
71
|
+
Riddle::Client::Filter.expects(:new).with("class_id", [0])
|
72
|
+
Riddle::Client::Filter.expects(:new).with("class_id", [1])
|
73
|
+
|
74
|
+
Post.expects(:find_all_by_id).once.with([1])
|
75
|
+
Comment.expects(:find_all_by_id).once.with([2])
|
76
|
+
|
77
|
+
Post.search("post")
|
78
|
+
Comment.search("comment")
|
79
|
+
end
|
80
|
+
|
81
|
+
test "search only in specified models" do
|
82
|
+
riddle = mock("Riddle")
|
83
|
+
riddle.expects(:query).with("post", "*").returns(results_for_post)
|
84
|
+
riddle.expects(:filters=).returns([])
|
85
|
+
Dnif.expects(:client).times(2).returns(riddle)
|
86
|
+
|
87
|
+
ActiveRecord::Base.expects(:indexes).returns({ "Post" => mock })
|
88
|
+
|
89
|
+
Riddle::Client::Filter.expects(:new).with("class_id", [0])
|
90
|
+
Post.expects(:find_all_by_id).once.with([1])
|
91
|
+
|
92
|
+
Dnif.search("post", :classes => "Post")
|
93
|
+
end
|
94
|
+
|
95
|
+
def results_for_post
|
96
|
+
{
|
64
97
|
:matches => [{
|
65
98
|
:doc => 2983,
|
66
99
|
:attributes => {
|
67
|
-
"
|
100
|
+
"class_name" => "336,623,883,1140"
|
68
101
|
}
|
69
102
|
}]
|
70
103
|
}
|
71
|
-
|
104
|
+
end
|
105
|
+
|
106
|
+
def results_for_comment
|
107
|
+
{
|
72
108
|
:matches => [{
|
73
109
|
:doc => 7893,
|
74
110
|
:attributes => {
|
75
|
-
"
|
111
|
+
"class_name" => "323,623,877,1133,1381,1646,1908"
|
76
112
|
}
|
77
113
|
}]
|
78
114
|
}
|
79
|
-
|
80
|
-
riddle = mock("Riddle")
|
81
|
-
riddle.expects(:query).with("post", "*").returns(results_for_post)
|
82
|
-
riddle.expects(:query).with("comment", "*").returns(results_for_comment)
|
83
|
-
riddle.expects(:filters).twice.returns([])
|
84
|
-
Dnif.expects(:client).times(4).returns(riddle)
|
85
|
-
|
86
|
-
Riddle::Client::Filter.expects(:new).with("class_id", [336, 623, 883, 1140])
|
87
|
-
Riddle::Client::Filter.expects(:new).with("class_id", [323, 623, 877, 1133, 1381, 1646, 1908])
|
88
|
-
|
89
|
-
Post.expects(:find_all_by_id).once.with([1])
|
90
|
-
Comment.expects(:find_all_by_id).once.with([2])
|
91
|
-
|
92
|
-
Post.search("post")
|
93
|
-
Comment.search("comment")
|
94
115
|
end
|
95
116
|
end
|
metadata
CHANGED
@@ -7,8 +7,8 @@ version: !ruby/object:Gem::Version
|
|
7
7
|
- 0
|
8
8
|
- 1
|
9
9
|
- beta
|
10
|
-
-
|
11
|
-
version: 0.0.1.beta.
|
10
|
+
- 3
|
11
|
+
version: 0.0.1.beta.3
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- Rafael Souza
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-07-
|
19
|
+
date: 2010-07-15 00:00:00 -03:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|