dnif 0.0.1.beta.2 → 0.0.1.beta.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|