xapit 0.2.7 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/{CHANGELOG → CHANGELOG.rdoc} +7 -2
- data/Gemfile +19 -0
- data/LICENSE +4 -4
- data/README.rdoc +61 -108
- data/Rakefile +11 -10
- data/features/facets.feature +93 -82
- data/features/finding.feature +196 -138
- data/features/indexing.feature +35 -37
- data/features/remote_server.feature +10 -0
- data/features/step_definitions/xapit_steps.rb +53 -25
- data/features/suggestions.feature +20 -14
- data/features/support/env.rb +13 -6
- data/features/support/xapit_helpers.rb +8 -9
- data/lib/generators/xapit/install_generator.rb +14 -0
- data/lib/generators/xapit/templates/xapit.ru +6 -0
- data/lib/generators/xapit/templates/xapit.yml +11 -0
- data/lib/xapit.rb +106 -64
- data/lib/xapit/client/collection.rb +150 -0
- data/lib/xapit/client/facet.rb +11 -0
- data/lib/xapit/client/facet_option.rb +29 -0
- data/lib/xapit/client/index_builder.rb +67 -0
- data/lib/xapit/client/membership.rb +46 -0
- data/lib/xapit/client/model_adapters/abstract_model_adapter.rb +30 -0
- data/lib/xapit/client/model_adapters/active_record_adapter.rb +27 -0
- data/lib/xapit/client/model_adapters/default_model_adapter.rb +7 -0
- data/lib/xapit/client/railtie.rb +18 -0
- data/lib/xapit/client/remote_database.rb +21 -0
- data/lib/xapit/client/tasks.rb +18 -0
- data/lib/xapit/server/app.rb +27 -0
- data/lib/xapit/server/database.rb +47 -0
- data/lib/xapit/server/indexer.rb +138 -0
- data/lib/xapit/server/query.rb +240 -0
- data/spec/fixtures/blankdb/flintlock +0 -0
- data/spec/fixtures/blankdb/iamchert +1 -0
- data/spec/fixtures/blankdb/postlist.DB +0 -0
- data/spec/fixtures/blankdb/postlist.baseA +0 -0
- data/spec/fixtures/blankdb/record.DB +0 -0
- data/spec/fixtures/blankdb/record.baseA +0 -0
- data/spec/fixtures/blankdb/termlist.DB +0 -0
- data/spec/fixtures/blankdb/termlist.baseA +0 -0
- data/spec/fixtures/xapit.ru +13 -0
- data/spec/fixtures/xapit.yml +4 -0
- data/spec/spec_helper.rb +8 -9
- data/spec/support/spec_macros.rb +6 -0
- data/spec/{xapit_member.rb → support/xapit_member.rb} +14 -16
- data/spec/xapit/client/collection_spec.rb +63 -0
- data/spec/xapit/client/facet_option_spec.rb +26 -0
- data/spec/xapit/client/facet_spec.rb +13 -0
- data/spec/xapit/client/index_builder_spec.rb +66 -0
- data/spec/xapit/client/membership_spec.rb +43 -0
- data/spec/xapit/client/model_adapters/active_record_adapter_spec.rb +62 -0
- data/spec/xapit/client/model_adapters/default_model_adapter_spec.rb +7 -0
- data/spec/xapit/client/remote_database_spec.rb +19 -0
- data/spec/xapit/server/app_spec.rb +22 -0
- data/spec/xapit/server/database_spec.rb +37 -0
- data/spec/xapit/server/indexer_spec.rb +82 -0
- data/spec/xapit/server/query_spec.rb +43 -0
- data/spec/xapit/xapit_spec.rb +28 -0
- metadata +124 -93
- data/Manifest +0 -60
- data/features/sorting.feature +0 -29
- data/init.rb +0 -1
- data/install.rb +0 -8
- data/lib/xapit/adapters/abstract_adapter.rb +0 -47
- data/lib/xapit/adapters/active_record_adapter.rb +0 -20
- data/lib/xapit/adapters/data_mapper_adapter.rb +0 -10
- data/lib/xapit/collection.rb +0 -187
- data/lib/xapit/config.rb +0 -84
- data/lib/xapit/facet.rb +0 -67
- data/lib/xapit/facet_blueprint.rb +0 -59
- data/lib/xapit/facet_option.rb +0 -56
- data/lib/xapit/index_blueprint.rb +0 -147
- data/lib/xapit/indexers/abstract_indexer.rb +0 -116
- data/lib/xapit/indexers/classic_indexer.rb +0 -29
- data/lib/xapit/indexers/simple_indexer.rb +0 -38
- data/lib/xapit/membership.rb +0 -137
- data/lib/xapit/query.rb +0 -89
- data/lib/xapit/query_parsers/abstract_query_parser.rb +0 -174
- data/lib/xapit/query_parsers/classic_query_parser.rb +0 -29
- data/lib/xapit/query_parsers/simple_query_parser.rb +0 -75
- data/lib/xapit/rake_tasks.rb +0 -13
- data/rails_generators/xapit/USAGE +0 -13
- data/rails_generators/xapit/templates/setup_xapit.rb +0 -1
- data/rails_generators/xapit/templates/xapit.rake +0 -4
- data/rails_generators/xapit/xapit_generator.rb +0 -20
- data/spec/xapit/adapters/active_record_adapter_spec.rb +0 -31
- data/spec/xapit/adapters/data_mapper_adapter_spec.rb +0 -10
- data/spec/xapit/collection_spec.rb +0 -176
- data/spec/xapit/config_spec.rb +0 -62
- data/spec/xapit/facet_blueprint_spec.rb +0 -29
- data/spec/xapit/facet_option_spec.rb +0 -80
- data/spec/xapit/facet_spec.rb +0 -73
- data/spec/xapit/index_blueprint_spec.rb +0 -112
- data/spec/xapit/indexers/abstract_indexer_spec.rb +0 -111
- data/spec/xapit/indexers/classic_indexer_spec.rb +0 -35
- data/spec/xapit/indexers/simple_indexer_spec.rb +0 -69
- data/spec/xapit/membership_spec.rb +0 -55
- data/spec/xapit/query_parsers/abstract_query_parser_spec.rb +0 -60
- data/spec/xapit/query_parsers/classic_query_parser_spec.rb +0 -20
- data/spec/xapit/query_parsers/simple_query_parser_spec.rb +0 -86
- data/spec/xapit/query_spec.rb +0 -60
- data/tasks/spec.rb +0 -9
- data/tasks/xapit.rake +0 -1
- data/uninstall.rb +0 -5
- data/xapit.gemspec +0 -30
@@ -1,29 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
|
3
|
-
describe Xapit::FacetBlueprint do
|
4
|
-
it "should generate unique identifier based on attribute and value" do
|
5
|
-
facet1 = Xapit::FacetBlueprint.new(XapitMember, 0, :to_s)
|
6
|
-
facet2 = Xapit::FacetBlueprint.new(XapitMember, 0, :length)
|
7
|
-
facet1.identifiers_for("foo").first.length.should == 7
|
8
|
-
facet1.identifiers_for("foo").should_not == facet1.identifiers_for("bar")
|
9
|
-
facet1.identifiers_for("foo").should_not == facet2.identifiers_for("foo")
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should generate unique identifiers for each value returned" do
|
13
|
-
facet = Xapit::FacetBlueprint.new(XapitMember, 0, :to_a)
|
14
|
-
facet.identifiers_for(["foo", "bar"]).size.should == 2
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should humanize attribute for name if one isn't given" do
|
18
|
-
Xapit::FacetBlueprint.new(XapitMember, 0, :visible).name.should == "Visible"
|
19
|
-
end
|
20
|
-
|
21
|
-
it "should use custom name if given" do
|
22
|
-
Xapit::FacetBlueprint.new(XapitMember, 0, :visible, "custom").name.should == "custom"
|
23
|
-
end
|
24
|
-
|
25
|
-
it "should not have identifiers for blank values" do
|
26
|
-
facet = Xapit::FacetBlueprint.new(XapitMember, 0, :to_a)
|
27
|
-
facet.identifiers_for(["", nil, "bar"]).size.should == 1
|
28
|
-
end
|
29
|
-
end
|
@@ -1,80 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
|
3
|
-
describe Xapit::FacetOption do
|
4
|
-
it "should combine previous identifiers with current one on to_param" do
|
5
|
-
option = Xapit::FacetOption.new(nil, nil, nil)
|
6
|
-
option.existing_facet_identifiers = ["abc", "123"]
|
7
|
-
stub(option).identifier { "foo" }
|
8
|
-
option.to_param.should == "abc-123-foo"
|
9
|
-
end
|
10
|
-
|
11
|
-
it "should remove current identifier from previous identifiers if it exists" do
|
12
|
-
Xapit.setup(:breadcrumb_facets => false)
|
13
|
-
option = Xapit::FacetOption.new(nil, nil, nil)
|
14
|
-
option.existing_facet_identifiers = ["abc", "123", "foo"]
|
15
|
-
stub(option).identifier { "foo" }
|
16
|
-
option.to_param.should == "abc-123"
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should support breadcrumb style facets" do
|
20
|
-
Xapit.setup(:breadcrumb_facets => true)
|
21
|
-
option = Xapit::FacetOption.new(nil, nil, nil)
|
22
|
-
option.existing_facet_identifiers = ["abc", "123", "foo"]
|
23
|
-
stub(option).identifier { "123" }
|
24
|
-
option.to_param.should == "abc-123"
|
25
|
-
end
|
26
|
-
|
27
|
-
describe "with database" do
|
28
|
-
before(:each) do
|
29
|
-
XapitMember.xapit do |index|
|
30
|
-
index.facet :age, "Person Age"
|
31
|
-
index.facet :category
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should have identifier hashing name and value" do
|
36
|
-
option = Xapit::FacetOption.new("XapitMember", "age", "17")
|
37
|
-
option.identifier.should == "0c93ee1"
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should find facet option from database given id" do
|
41
|
-
doc = Xapian::Document.new
|
42
|
-
doc.data = "XapitMember|||age|||17"
|
43
|
-
doc.add_term("QXapit::FacetOption-abc123")
|
44
|
-
Xapit::Config.writable_database.add_document(doc)
|
45
|
-
option = Xapit::FacetOption.find("abc123")
|
46
|
-
option.name.should == "17"
|
47
|
-
option.facet.name.should == "Person Age"
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should save facet to database" do
|
51
|
-
Xapit::Config.writable_database # make sure there's a database setup in case we try to read from it
|
52
|
-
option = Xapit::FacetOption.new(nil, nil, nil)
|
53
|
-
option.facet = XapitMember.xapit_facet_blueprint("age")
|
54
|
-
option.name = "23"
|
55
|
-
option.save
|
56
|
-
Xapit::FacetOption.find(option.identifier).should_not be_nil
|
57
|
-
end
|
58
|
-
|
59
|
-
it "should not save facet if it already exists" do
|
60
|
-
doc = Xapian::Document.new
|
61
|
-
doc.data = "XapitMember|||age|||17"
|
62
|
-
doc.add_term("QXapit::FacetOption-abc123")
|
63
|
-
Xapit::Config.writable_database.add_document(doc)
|
64
|
-
stub(Xapit::Config.writable_database).add_document { raise "should not add doc" }
|
65
|
-
option = Xapit::FacetOption.new(XapitMember, nil, nil)
|
66
|
-
stub(option).identifier { "abc123" }
|
67
|
-
option.save
|
68
|
-
end
|
69
|
-
|
70
|
-
it "should find facet option which doesn't have a value" do
|
71
|
-
doc = Xapian::Document.new
|
72
|
-
doc.data = "XapitMember|||age|||"
|
73
|
-
doc.add_term("QXapit::FacetOption-abc123")
|
74
|
-
Xapit::Config.writable_database.add_document(doc)
|
75
|
-
option = Xapit::FacetOption.find("abc123")
|
76
|
-
option.name.should == ""
|
77
|
-
option.facet.name.should == "Person Age"
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
data/spec/xapit/facet_spec.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
|
3
|
-
describe Xapit::Facet do
|
4
|
-
describe "with database" do
|
5
|
-
before(:each) do
|
6
|
-
XapitMember.xapit do |index|
|
7
|
-
index.facet :visible
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
describe "indexed" do
|
12
|
-
before(:each) do
|
13
|
-
@visible1 = XapitMember.new(:visible => true)
|
14
|
-
@visible2 = XapitMember.new(:visible => true)
|
15
|
-
@invisible = XapitMember.new(:visible => false)
|
16
|
-
Xapit.index_all
|
17
|
-
end
|
18
|
-
|
19
|
-
describe "facet from empty search" do
|
20
|
-
before(:each) do
|
21
|
-
@facet = XapitMember.search("").facets.first
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should have the name of 'Visible'" do
|
25
|
-
@facet.name.should == 'Visible'
|
26
|
-
end
|
27
|
-
|
28
|
-
it "should have true and false options" do
|
29
|
-
@facet.options.map(&:name).sort.should == %w[false true]
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should have record count" do
|
33
|
-
@facet.options.detect { |o| o.name == 'true' }.count.should == 2
|
34
|
-
@facet.options.detect { |o| o.name == 'false' }.count.should == 1
|
35
|
-
end
|
36
|
-
|
37
|
-
it "should have identifier for options" do
|
38
|
-
blueprint = Xapit::FacetBlueprint.new(XapitMember, 0, :visible)
|
39
|
-
@facet.options.detect { |o| o.name == 'true' }.identifier.should == blueprint.identifiers_for(@visible1).first
|
40
|
-
@facet.options.detect { |o| o.name == 'false' }.identifier.should == blueprint.identifiers_for(@invisible).first
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should have matching identifiers" do
|
44
|
-
blueprint = Xapit::FacetBlueprint.new(XapitMember, 0, :visible)
|
45
|
-
hash = { blueprint.identifiers_for(@visible1).first => 2, blueprint.identifiers_for(@invisible).first => 1 }
|
46
|
-
@facet.matching_identifiers.should == hash
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should not include matching identifiers that are current" do
|
50
|
-
blueprint = Xapit::FacetBlueprint.new(XapitMember, 0, :visible)
|
51
|
-
@facet.existing_facet_identifiers = blueprint.identifiers_for(@visible1)
|
52
|
-
@facet.matching_identifiers.should == { blueprint.identifiers_for(@invisible).first => 1 }
|
53
|
-
end
|
54
|
-
|
55
|
-
it "should return identifier on to_param" do
|
56
|
-
blueprint = Xapit::FacetBlueprint.new(XapitMember, 0, :visible)
|
57
|
-
@facet.options.detect { |o| o.name == 'true' }.to_param.should == blueprint.identifiers_for(@visible1).first
|
58
|
-
end
|
59
|
-
|
60
|
-
it "should sort options in alphabetical order" do
|
61
|
-
@facet.options.first.name.should == 'false'
|
62
|
-
@facet.options.last.name.should == 'true'
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
it "should not list facets if only one option is found" do
|
67
|
-
blueprint = Xapit::FacetBlueprint.new(XapitMember, 0, :visible)
|
68
|
-
facets = XapitMember.search(:facets => blueprint.identifiers_for(@visible1)).facets
|
69
|
-
facets.should be_empty
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,112 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
|
3
|
-
describe Xapit::IndexBlueprint do
|
4
|
-
before(:each) do
|
5
|
-
XapitMember.xapit { } # call so methods are generated
|
6
|
-
@index = Xapit::IndexBlueprint.new(XapitMember)
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should remember text attributes" do
|
10
|
-
@index.text(:foo)
|
11
|
-
@index.text(:bar, :blah)
|
12
|
-
@index.text(:custom) { |t| t*t }
|
13
|
-
@index.text_attributes.keys.should include(:foo, :bar, :blah, :custom)
|
14
|
-
@index.text_attributes[:foo][:proc].should be_nil
|
15
|
-
@index.text_attributes[:custom][:proc].should be_kind_of(Proc)
|
16
|
-
end
|
17
|
-
|
18
|
-
it "should remember field attributes" do
|
19
|
-
@index.field(:foo)
|
20
|
-
@index.field(:bar, :blah)
|
21
|
-
@index.field_attributes.should include(:foo, :bar, :blah)
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should remember facets" do
|
25
|
-
@index.facet(:foo)
|
26
|
-
@index.facet(:bar, "Baz")
|
27
|
-
@index.facets.map(&:name).should == ["Foo", "Baz"]
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should remember sortable attributes" do
|
31
|
-
@index.sortable(:foo)
|
32
|
-
@index.sortable(:bar, :blah)
|
33
|
-
@index.sortable_attributes.should include(:foo, :bar, :blah)
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should have a sortable position offset by facets" do
|
37
|
-
@index.facet(:foo)
|
38
|
-
@index.facet(:test)
|
39
|
-
@index.sortable(:bar, :blah)
|
40
|
-
@index.position_of_sortable(:blah).should == 3
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should have a field position offset by facets + sortable" do
|
44
|
-
@index.facet(:foo)
|
45
|
-
@index.sortable(:bar, :blah)
|
46
|
-
@index.field(:bar, :blah)
|
47
|
-
@index.position_of_field(:blah).should == 4
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should index member document into database" do
|
51
|
-
XapitMember.new
|
52
|
-
@index.index_all
|
53
|
-
Xapit::Config.writable_database.doccount.should >= 1
|
54
|
-
Xapit::Config.writable_database.flush
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should remember all blueprints and index each of them" do
|
58
|
-
stub(Xapit::Config.writable_database).add_document
|
59
|
-
mock(@index).index_all
|
60
|
-
Xapit::IndexBlueprint.index_all
|
61
|
-
end
|
62
|
-
|
63
|
-
it "should pass in extra arguments to each method" do
|
64
|
-
index = Xapit::IndexBlueprint.new(XapitMember, :foo, :bar => :blah)
|
65
|
-
mock(XapitMember).find_each(:foo, :bar => :blah)
|
66
|
-
index.index_all
|
67
|
-
end
|
68
|
-
|
69
|
-
it "should add a record from the index" do
|
70
|
-
member = XapitMember.new(:name => "New Record!")
|
71
|
-
@index.text :name
|
72
|
-
@index.create_record(member.id)
|
73
|
-
XapitMember.search("New Record").should == [member]
|
74
|
-
end
|
75
|
-
|
76
|
-
it "should remove a record from the index" do
|
77
|
-
member = XapitMember.new(:name => "Bad Record!")
|
78
|
-
@index.text :name
|
79
|
-
@index.index_all
|
80
|
-
@index.destroy_record(member.id)
|
81
|
-
XapitMember.search("Bad Record").should == []
|
82
|
-
end
|
83
|
-
|
84
|
-
it "should update a record in the index" do
|
85
|
-
member = XapitMember.new(:name => "New Record!")
|
86
|
-
@index.text :name
|
87
|
-
@index.index_all
|
88
|
-
member.update_attribute(:name, "Changed Record!")
|
89
|
-
@index.update_record(member.id)
|
90
|
-
XapitMember.search("Changed Record").should == [member]
|
91
|
-
end
|
92
|
-
|
93
|
-
it "should not create record index if member isn't found" do
|
94
|
-
Xapit::Config.writable_database # make sure the database is built
|
95
|
-
member = XapitMember.new(:name => "New Record!")
|
96
|
-
stub(XapitMember).find { nil }
|
97
|
-
@index.text :name
|
98
|
-
@index.create_record(member.id)
|
99
|
-
XapitMember.search("New Record").should be_empty
|
100
|
-
end
|
101
|
-
|
102
|
-
it "should remove record from index when updating a member which doesn't exist" do
|
103
|
-
member = XapitMember.new(:name => "New Record!")
|
104
|
-
@index.text :name
|
105
|
-
@index.index_all
|
106
|
-
stub(XapitMember).find { nil }
|
107
|
-
member.update_attribute(:name, "Changed Record!")
|
108
|
-
@index.update_record(member.id)
|
109
|
-
XapitMember.search("New Record").should be_empty
|
110
|
-
XapitMember.search("Changed Record").should be_empty
|
111
|
-
end
|
112
|
-
end
|
@@ -1,111 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
-
|
3
|
-
describe Xapit::AbstractIndexer do
|
4
|
-
before(:each) do
|
5
|
-
XapitMember.xapit { } # to ensure methods are included
|
6
|
-
@index = Xapit::IndexBlueprint.new(XapitMember)
|
7
|
-
@indexer = Xapit::SimpleIndexer.new(@index)
|
8
|
-
end
|
9
|
-
|
10
|
-
it "should map field to term with 'X' prefix" do
|
11
|
-
member = Object.new
|
12
|
-
stub(member).category { "Water" }
|
13
|
-
@index.field(:category)
|
14
|
-
@indexer.field_terms(member).should == %w[Xcategory-water]
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should add terms separately when array is returned" do
|
18
|
-
member = Object.new
|
19
|
-
stub(member).category { ["Water", "Liquid"] }
|
20
|
-
@index.field(:category)
|
21
|
-
@indexer.field_terms(member).should == %w[Xcategory-water Xcategory-liquid]
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should have base terms with class name and id" do
|
25
|
-
member = Object.new
|
26
|
-
stub(member).id { 123 }
|
27
|
-
@indexer.base_terms(member).should == %w[CObject QObject-123]
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should add terms, values and options for facets" do
|
31
|
-
Xapit::Config.writable_database # force xapit to use a writable database at the beginning
|
32
|
-
stub(XapitMember).xapit_index_blueprint { @index }
|
33
|
-
member = XapitMember.new(:foo => ["ABC", "DEF"])
|
34
|
-
ids = Xapit::FacetBlueprint.new(XapitMember, 0, :foo).identifiers_for(member)
|
35
|
-
@index.facet(:foo)
|
36
|
-
@indexer.facet_terms(member).should == ids.map { |id| "F#{id}" }
|
37
|
-
@indexer.values(member).should == [ids.join('-')]
|
38
|
-
@indexer.save_facet_options_for(member)
|
39
|
-
ids.map { |id| Xapit::FacetOption.find(id).name }.should == ["ABC", "DEF"]
|
40
|
-
end
|
41
|
-
|
42
|
-
it "should add values for sortable fields" do
|
43
|
-
member = Object.new
|
44
|
-
stub(member).name { "Foo" }
|
45
|
-
@index.sortable(:name)
|
46
|
-
@indexer.values(member).should == ["foo"]
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should add terms and values to xapian document" do
|
50
|
-
member = Object.new
|
51
|
-
stub(member).id { 123 }
|
52
|
-
stub(@indexer).values.returns(%w[value list])
|
53
|
-
stub(@indexer).other_terms { %w[term list] }
|
54
|
-
doc = @indexer.document_for(member)
|
55
|
-
doc.should be_kind_of(Xapian::Document)
|
56
|
-
doc.data.should == "Object-123"
|
57
|
-
doc.values.map(&:value).sort.should == %w[value list].sort
|
58
|
-
doc.terms.map(&:term).sort.should == %w[term list].sort
|
59
|
-
end
|
60
|
-
|
61
|
-
it "should convert time to integer before saving as field term" do
|
62
|
-
member = Object.new
|
63
|
-
stub(member).created_at { Time.now }
|
64
|
-
@index.field(:created_at)
|
65
|
-
@indexer.field_terms(member).should == ["Xcreated_at-#{member.created_at.to_i}"]
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should convert date to time then integer before saving as field term" do
|
69
|
-
member = Object.new
|
70
|
-
stub(member).created_on { Date.today }
|
71
|
-
@index.field(:created_on)
|
72
|
-
@indexer.field_terms(member).should == ["Xcreated_on-#{member.created_on.to_time.to_i}"]
|
73
|
-
end
|
74
|
-
|
75
|
-
it "should use sortable_serialze for numeric sortable" do
|
76
|
-
member = Object.new
|
77
|
-
stub(member).age { 7.89 }
|
78
|
-
@index.sortable(:age)
|
79
|
-
@indexer.values(member).should == [Xapian.sortable_serialise(7.89)]
|
80
|
-
end
|
81
|
-
|
82
|
-
it "should only use first value if sortable attribute is an array" do
|
83
|
-
member = Object.new
|
84
|
-
stub(member).age { [1, 2] }
|
85
|
-
@index.sortable(:age)
|
86
|
-
@indexer.values(member).should == [Xapian.sortable_serialise(1)]
|
87
|
-
end
|
88
|
-
|
89
|
-
it "should add sortable_serialze value for numeric field" do
|
90
|
-
member = Object.new
|
91
|
-
stub(member).age { [1, 2] }
|
92
|
-
@index.field(:age)
|
93
|
-
@indexer.values(member).should == [Xapian.sortable_serialise(1)]
|
94
|
-
end
|
95
|
-
|
96
|
-
it "should use sortable_serialze for date field" do
|
97
|
-
date = Date.today
|
98
|
-
member = Object.new
|
99
|
-
stub(member).age { date }
|
100
|
-
@index.field(:age)
|
101
|
-
@indexer.values(member).should == [Xapian.sortable_serialise(date.to_time.to_i)]
|
102
|
-
end
|
103
|
-
|
104
|
-
it "should use sortable_serialze for time field" do
|
105
|
-
time = Time.now
|
106
|
-
member = Object.new
|
107
|
-
stub(member).age { time }
|
108
|
-
@index.field(:age)
|
109
|
-
@indexer.values(member).should == [Xapian.sortable_serialise(time.to_i)]
|
110
|
-
end
|
111
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
-
|
3
|
-
describe Xapit::ClassicIndexer do
|
4
|
-
before(:each) do
|
5
|
-
@index = Xapit::IndexBlueprint.new(XapitMember)
|
6
|
-
@indexer = Xapit::ClassicIndexer.new(@index)
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should add text terms to document when indexing attributes" do
|
10
|
-
member = Object.new
|
11
|
-
stub(member).name { "jumping high" }
|
12
|
-
@index.text(:name)
|
13
|
-
document = Xapian::Document.new
|
14
|
-
@indexer.index_text_attributes(member, document)
|
15
|
-
document.terms.map(&:term).sort.should == %w[Zjump Zhigh jumping high].sort
|
16
|
-
end
|
17
|
-
|
18
|
-
it "should use given block to generate text terms" do
|
19
|
-
member = Object.new
|
20
|
-
stub(member).name { "foobar" }
|
21
|
-
@index.text(:name) { |t| [t.length] }
|
22
|
-
document = Xapian::Document.new
|
23
|
-
@indexer.index_text_attributes(member, document)
|
24
|
-
document.terms.map(&:term).sort.should == %w[6].sort
|
25
|
-
end
|
26
|
-
|
27
|
-
it "should return terms separated by array" do
|
28
|
-
member = Object.new
|
29
|
-
stub(member).description { ["foo bar", 6, "", nil] }
|
30
|
-
@index.text(:description)
|
31
|
-
document = Xapian::Document.new
|
32
|
-
@indexer.index_text_attributes(member, document)
|
33
|
-
document.terms.map(&:term).sort.should == ["foo bar", "6"].sort
|
34
|
-
end
|
35
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
-
|
3
|
-
describe Xapit::SimpleIndexer do
|
4
|
-
before(:each) do
|
5
|
-
@index = Xapit::IndexBlueprint.new(XapitMember)
|
6
|
-
@indexer = Xapit::SimpleIndexer.new(@index)
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should return terms for text attributes" do
|
10
|
-
member = Object.new
|
11
|
-
stub(member).description { "This is a test" }
|
12
|
-
@index.text(:description)
|
13
|
-
@indexer.terms_for_attribute(member, :description, {}).should == %w[this is a test]
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should return text terms with stemming added" do
|
17
|
-
member = Object.new
|
18
|
-
stub(member).description { "jumping high" }
|
19
|
-
@index.text(:description)
|
20
|
-
@indexer.stemmed_terms_for_attribute(member, :description, {}).should == %w[Zjump Zhigh]
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should convert attribute to string when converting text to terms" do
|
24
|
-
member = Object.new
|
25
|
-
stub(member).num { 123 }
|
26
|
-
@index.text(:num)
|
27
|
-
@indexer.terms_for_attribute(member, :num, {}).should == %w[123]
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should add text terms to document when indexing attributes" do
|
31
|
-
@index.text(:description)
|
32
|
-
stub(@indexer).terms_for_attribute { %w[term list] }
|
33
|
-
document = Xapian::Document.new
|
34
|
-
@indexer.index_text_attributes(nil, document)
|
35
|
-
document.terms.map(&:term).sort.should == %w[Zlist Zterm list term].sort
|
36
|
-
end
|
37
|
-
|
38
|
-
it "should use given block to generate text terms" do
|
39
|
-
member = Object.new
|
40
|
-
stub(member).name { "foobar" }
|
41
|
-
proc = lambda { |t| [t.length] }
|
42
|
-
@indexer.terms_for_attribute(member, :name, { :proc => proc }).should == ["6"]
|
43
|
-
end
|
44
|
-
|
45
|
-
it "should increment term frequency by weight option" do
|
46
|
-
member = Object.new
|
47
|
-
stub(member).description { "This is a test" }
|
48
|
-
@index.text(:description, :weight => 10)
|
49
|
-
document = Xapian::Document.new
|
50
|
-
@indexer.index_text_attributes(member, document)
|
51
|
-
document.terms.first.wdf.should == 10
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should increment term frequency by weight option" do
|
55
|
-
member = Object.new
|
56
|
-
stub(member).description { "This is a test" }
|
57
|
-
@index.text(:description, :weight => 10)
|
58
|
-
document = Xapian::Document.new
|
59
|
-
@indexer.index_text_attributes(member, document)
|
60
|
-
document.terms.first.wdf.should == 10
|
61
|
-
end
|
62
|
-
|
63
|
-
it "should return terms separated by array" do
|
64
|
-
member = Object.new
|
65
|
-
stub(member).description { ["foo bar", 6, "", nil] }
|
66
|
-
@index.text(:description)
|
67
|
-
@indexer.terms_for_attribute(member, :description, {}).should == ["foo bar", "6"]
|
68
|
-
end
|
69
|
-
end
|