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
data/Manifest
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
CHANGELOG
|
2
|
-
features/facets.feature
|
3
|
-
features/finding.feature
|
4
|
-
features/indexing.feature
|
5
|
-
features/sorting.feature
|
6
|
-
features/step_definitions/common_steps.rb
|
7
|
-
features/step_definitions/xapit_steps.rb
|
8
|
-
features/suggestions.feature
|
9
|
-
features/support/env.rb
|
10
|
-
features/support/xapit_helpers.rb
|
11
|
-
init.rb
|
12
|
-
install.rb
|
13
|
-
lib/xapit/adapters/abstract_adapter.rb
|
14
|
-
lib/xapit/adapters/active_record_adapter.rb
|
15
|
-
lib/xapit/adapters/data_mapper_adapter.rb
|
16
|
-
lib/xapit/collection.rb
|
17
|
-
lib/xapit/config.rb
|
18
|
-
lib/xapit/facet.rb
|
19
|
-
lib/xapit/facet_blueprint.rb
|
20
|
-
lib/xapit/facet_option.rb
|
21
|
-
lib/xapit/index_blueprint.rb
|
22
|
-
lib/xapit/indexers/abstract_indexer.rb
|
23
|
-
lib/xapit/indexers/classic_indexer.rb
|
24
|
-
lib/xapit/indexers/simple_indexer.rb
|
25
|
-
lib/xapit/membership.rb
|
26
|
-
lib/xapit/query.rb
|
27
|
-
lib/xapit/query_parsers/abstract_query_parser.rb
|
28
|
-
lib/xapit/query_parsers/classic_query_parser.rb
|
29
|
-
lib/xapit/query_parsers/simple_query_parser.rb
|
30
|
-
lib/xapit/rake_tasks.rb
|
31
|
-
lib/xapit.rb
|
32
|
-
LICENSE
|
33
|
-
Manifest
|
34
|
-
rails_generators/xapit/templates/setup_xapit.rb
|
35
|
-
rails_generators/xapit/templates/xapit.rake
|
36
|
-
rails_generators/xapit/USAGE
|
37
|
-
rails_generators/xapit/xapit_generator.rb
|
38
|
-
Rakefile
|
39
|
-
README.rdoc
|
40
|
-
spec/spec_helper.rb
|
41
|
-
spec/xapit/adapters/active_record_adapter_spec.rb
|
42
|
-
spec/xapit/adapters/data_mapper_adapter_spec.rb
|
43
|
-
spec/xapit/collection_spec.rb
|
44
|
-
spec/xapit/config_spec.rb
|
45
|
-
spec/xapit/facet_blueprint_spec.rb
|
46
|
-
spec/xapit/facet_option_spec.rb
|
47
|
-
spec/xapit/facet_spec.rb
|
48
|
-
spec/xapit/index_blueprint_spec.rb
|
49
|
-
spec/xapit/indexers/abstract_indexer_spec.rb
|
50
|
-
spec/xapit/indexers/classic_indexer_spec.rb
|
51
|
-
spec/xapit/indexers/simple_indexer_spec.rb
|
52
|
-
spec/xapit/membership_spec.rb
|
53
|
-
spec/xapit/query_parsers/abstract_query_parser_spec.rb
|
54
|
-
spec/xapit/query_parsers/classic_query_parser_spec.rb
|
55
|
-
spec/xapit/query_parsers/simple_query_parser_spec.rb
|
56
|
-
spec/xapit/query_spec.rb
|
57
|
-
spec/xapit_member.rb
|
58
|
-
tasks/spec.rb
|
59
|
-
tasks/xapit.rake
|
60
|
-
uninstall.rb
|
data/features/sorting.feature
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
Background:
|
2
|
-
Given an empty database at "tmp/xapiandatabase"
|
3
|
-
|
4
|
-
Scenario: Query for All Records Sorted by Name
|
5
|
-
Given indexed records named "Zebra, Apple, Banana"
|
6
|
-
When I query "" sorted by name
|
7
|
-
Then I should find records named "Apple, Banana, Zebra"
|
8
|
-
|
9
|
-
Scenario: Query for All Records Sorted by Age then Name
|
10
|
-
Given the following indexed records
|
11
|
-
| name | age |
|
12
|
-
| Banana | 23 |
|
13
|
-
| Zebra | 17 |
|
14
|
-
| Apple | 17 |
|
15
|
-
When I query "" sorted by age, name
|
16
|
-
Then I should find records named "Apple, Zebra, Banana"
|
17
|
-
|
18
|
-
Scenario: Query for All Records Sorted by Name Descending
|
19
|
-
Given indexed records named "Zebra, Apple, Banana"
|
20
|
-
When I query "" sorted by name descending
|
21
|
-
Then I should find records named "Zebra, Banana, Apple"
|
22
|
-
|
23
|
-
Scenario: Query for Records Sorted Numerically
|
24
|
-
Given the following indexed records
|
25
|
-
| name | age |
|
26
|
-
| Banana | 9 |
|
27
|
-
| Zebra | 10 |
|
28
|
-
When I query "" sorted by age, name
|
29
|
-
Then I should find records named "Banana, Zebra"
|
data/init.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'xapit'
|
data/install.rb
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
require 'ftools'
|
2
|
-
|
3
|
-
source = File.join(File.dirname(__FILE__), '/rails_generators/xapit/templates/setup_xapit.rb')
|
4
|
-
destination = "#{Rails.root}/config/initializers/setup_xapit.rb"
|
5
|
-
unless File.exist? destination
|
6
|
-
puts "Adding config/initializers/setup_xapit.rb"
|
7
|
-
File.copy(source, destination)
|
8
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module Xapit
|
2
|
-
# Adapters are used to support multiple ORMs (ActiveRecord, Datamapper, Sequel, etc.).
|
3
|
-
# It abstracts out all find calls so they can be handled differently for each ORM.
|
4
|
-
# To create your own adapter, subclass AbstractAdapter and override the placeholder methods.
|
5
|
-
# See ActiveRecordAdapter for an example.
|
6
|
-
class AbstractAdapter
|
7
|
-
def self.inherited(subclass)
|
8
|
-
@subclasses ||= []
|
9
|
-
@subclasses << subclass
|
10
|
-
end
|
11
|
-
|
12
|
-
# Returns all adapter classes.
|
13
|
-
def self.subclasses
|
14
|
-
@subclasses
|
15
|
-
end
|
16
|
-
|
17
|
-
# Sets the @target instance, this is the class the adapter needs to forward
|
18
|
-
# its messages to.
|
19
|
-
def initialize(target)
|
20
|
-
@target = target
|
21
|
-
end
|
22
|
-
|
23
|
-
# Used to determine if the given adapter should be used for the passed in class.
|
24
|
-
# Usually one will see if it inherits from another class (ActiveRecord::Base)
|
25
|
-
def self.for_class?(member_class)
|
26
|
-
raise "To be implemented in subclass"
|
27
|
-
end
|
28
|
-
|
29
|
-
# Fetch a single record by the given id.
|
30
|
-
# The args are the same as those passed from the XapitMember#xapit call.
|
31
|
-
def find_single(id, *args)
|
32
|
-
raise "To be implemented in subclass"
|
33
|
-
end
|
34
|
-
|
35
|
-
# Fetch multiple records from the passed in array of ids.
|
36
|
-
def find_multiple(ids)
|
37
|
-
raise "To be implemented in subclass"
|
38
|
-
end
|
39
|
-
|
40
|
-
# Iiterate through all records using the given parameters.
|
41
|
-
# It should yield to the block and pass in each record individually.
|
42
|
-
# The args are the same as those passed from the XapitMember#xapit call.
|
43
|
-
def find_each(*args, &block)
|
44
|
-
raise "To be implemented in subclass"
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Xapit
|
2
|
-
# This adapter is used for all ActiveRecord models. See AbstractAdapter for details.
|
3
|
-
class ActiveRecordAdapter < AbstractAdapter
|
4
|
-
def self.for_class?(member_class)
|
5
|
-
member_class.ancestors.map(&:to_s).include? "ActiveRecord::Base"
|
6
|
-
end
|
7
|
-
|
8
|
-
def find_single(id, *args)
|
9
|
-
@target.find_by_id(id, *args)
|
10
|
-
end
|
11
|
-
|
12
|
-
def find_multiple(ids)
|
13
|
-
@target.find(ids)
|
14
|
-
end
|
15
|
-
|
16
|
-
def find_each(*args, &block)
|
17
|
-
@target.find_each(*args, &block)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
module Xapit
|
2
|
-
# This adapter is used for all DataMapper models. See AbstractAdapter for details.
|
3
|
-
class DataMapperAdapter < AbstractAdapter
|
4
|
-
def self.for_class?(member_class)
|
5
|
-
member_class.ancestors.map(&:to_s).include? "DataMapper::Resource"
|
6
|
-
end
|
7
|
-
|
8
|
-
# TODO override the rest of the methods here...
|
9
|
-
end
|
10
|
-
end
|
data/lib/xapit/collection.rb
DELETED
@@ -1,187 +0,0 @@
|
|
1
|
-
module Xapit
|
2
|
-
# This is the object which is returned when performing a search. It behaves like an array, so you do not need
|
3
|
-
# to worry about fetching the results separately. Just loop through this collection.
|
4
|
-
#
|
5
|
-
# The results are lazy loading, meaning it does not perform the query on the database until it has to.
|
6
|
-
# This allows you to string queries onto one another.
|
7
|
-
#
|
8
|
-
# Article.search("kite").search("sky") # only performs one query
|
9
|
-
#
|
10
|
-
# This class is compatible with will_paginate; you can pass it to the will_paginate helper in the view.
|
11
|
-
class Collection
|
12
|
-
NON_DELEGATE_METHODS = %w(nil? send object_id class extend size paginate first last empty? respond_to?).to_set
|
13
|
-
[].methods.each do |m|
|
14
|
-
delegate m, :to => :results unless m =~ /^__/ || NON_DELEGATE_METHODS.include?(m.to_s)
|
15
|
-
end
|
16
|
-
delegate :query, :base_query, :base_query=, :extra_queries, :extra_queries=, :to => :@query_parser
|
17
|
-
|
18
|
-
def self.search_similar(member, *args)
|
19
|
-
collection = new(member.class, *args)
|
20
|
-
indexer = SimpleIndexer.new(member.class.xapit_index_blueprint)
|
21
|
-
terms = indexer.text_terms(member) + indexer.field_terms(member)
|
22
|
-
query = collection.base_query.and_query(terms, :or).not_query("Q#{member.class}-#{member.id}")
|
23
|
-
collection.base_query = query
|
24
|
-
collection
|
25
|
-
end
|
26
|
-
|
27
|
-
def initialize(*args)
|
28
|
-
@query_parser = Config.query_parser.new(*args)
|
29
|
-
end
|
30
|
-
|
31
|
-
# Returns an array of results. You should not need to call this directly because most methods are
|
32
|
-
# automatically delegated to this array.
|
33
|
-
def results
|
34
|
-
@results ||= fetch_results
|
35
|
-
end
|
36
|
-
|
37
|
-
# The number of total records found despite any pagination settings.
|
38
|
-
def size
|
39
|
-
@query_parser.query.count
|
40
|
-
end
|
41
|
-
alias_method :total_entries, :size # alias to total_entries to support will_paginate
|
42
|
-
|
43
|
-
# Returns true if no results are found.
|
44
|
-
def empty?
|
45
|
-
@results ? @results.empty? : size.zero?
|
46
|
-
end
|
47
|
-
|
48
|
-
# The first record in the result set.
|
49
|
-
def first
|
50
|
-
fetch_results(:offset => 0, :limit => 1).first
|
51
|
-
end
|
52
|
-
|
53
|
-
# The last record in the result set.
|
54
|
-
def last
|
55
|
-
fetch_results(:offset => size-1, :limit => 1).last
|
56
|
-
end
|
57
|
-
|
58
|
-
# Perform another search on this one, inheriting all options already passed.
|
59
|
-
# See Xapit::Membership for search options.
|
60
|
-
#
|
61
|
-
# Article.search("kite").search("sky") # only performs one query
|
62
|
-
#
|
63
|
-
def search(*args)
|
64
|
-
options = args.extract_options!
|
65
|
-
collection = Collection.new(@query_parser.member_class, args[0].to_s, @query_parser.options.merge(options))
|
66
|
-
collection.base_query = @query_parser.query
|
67
|
-
collection
|
68
|
-
end
|
69
|
-
|
70
|
-
# Chain another search returning all records matched by either this search or the previous search
|
71
|
-
# Inherits all options passed in earlier search (such as :page and :order)
|
72
|
-
# See Xapit::Membership for search options.
|
73
|
-
#
|
74
|
-
# Article.search("kite").or_search(:conditions => { :priority => 1 })
|
75
|
-
#
|
76
|
-
def or_search(*args)
|
77
|
-
options = args.extract_options!
|
78
|
-
collection = Collection.new(@query_parser.member_class, args[0].to_s, @query_parser.options.merge(options))
|
79
|
-
collection.base_query = @query_parser.base_query
|
80
|
-
collection.extra_queries = @query_parser.extra_queries
|
81
|
-
collection.extra_queries << @query_parser.primary_query
|
82
|
-
collection
|
83
|
-
end
|
84
|
-
|
85
|
-
# The page number we are currently on.
|
86
|
-
def current_page
|
87
|
-
@query_parser.current_page
|
88
|
-
end
|
89
|
-
|
90
|
-
# How many records to display on each page, defaults to 20. Sets with :per_page option when performing search.
|
91
|
-
def per_page
|
92
|
-
@query_parser.per_page
|
93
|
-
end
|
94
|
-
|
95
|
-
# The offset for the current page
|
96
|
-
def offset
|
97
|
-
@query_parser.offset
|
98
|
-
end
|
99
|
-
|
100
|
-
# Total number of pages with found results.
|
101
|
-
def total_pages
|
102
|
-
(size / per_page.to_f).ceil
|
103
|
-
end
|
104
|
-
|
105
|
-
# The previous page number. Returns nil if on first page.
|
106
|
-
def previous_page
|
107
|
-
current_page > 1 ? (current_page - 1) : nil
|
108
|
-
end
|
109
|
-
|
110
|
-
# The next page number. Returns nil if on last page.
|
111
|
-
def next_page
|
112
|
-
current_page < total_pages ? (current_page + 1): nil
|
113
|
-
end
|
114
|
-
|
115
|
-
# Xapit::Facet objects matching this search query. See class for details.
|
116
|
-
def facets
|
117
|
-
all_facets.select do |facet|
|
118
|
-
facet.options.size > 0
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
# Xapit::FacetOption objects which are currently applied to search (through :facets option). Use this to
|
123
|
-
# display the facets which are currently applied.
|
124
|
-
#
|
125
|
-
# <% for option in @articles.applied_facet_options %>
|
126
|
-
# <%=h option.name %>
|
127
|
-
# <%= link_to "remove", :overwrite_params => { :facets => option } %>
|
128
|
-
# <% end %>
|
129
|
-
#
|
130
|
-
# If you set :breadcrumb_facets option to true in Config#setup the link will drop leftover facets
|
131
|
-
# instead of removing the current one. This makes it easy to add a breadcrumb style interface.
|
132
|
-
#
|
133
|
-
# Xapit.setup(:breadcrumb_facets => true)
|
134
|
-
# <% for option in @articles.applied_facet_options %>
|
135
|
-
# <%= link_to h(option.name), :overwrite_params => { :facets => option } %> >
|
136
|
-
# <% end %>
|
137
|
-
#
|
138
|
-
def applied_facet_options
|
139
|
-
@query_parser.facet_identifiers.map do |identifier|
|
140
|
-
option = FacetOption.find(identifier)
|
141
|
-
option.existing_facet_identifiers = @query_parser.facet_identifiers
|
142
|
-
option
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
# Includes a suggested variation of a term which will get many more results. Returns nil if no suggestion.
|
147
|
-
#
|
148
|
-
# <% if @articles.spelling_suggestion %>
|
149
|
-
# Did you mean <%= link_to h(@articles.spelling_suggestion), :overwrite_params => { :keywords => @articles.spelling_suggestion } %>?
|
150
|
-
# <% end %>
|
151
|
-
#
|
152
|
-
def spelling_suggestion
|
153
|
-
@query_parser.spelling_suggestion
|
154
|
-
end
|
155
|
-
|
156
|
-
# All Xapit::Facet objects, even if they do not include options.
|
157
|
-
# Usually you'll want to call Collection#facets
|
158
|
-
def all_facets
|
159
|
-
@query_parser.member_class.xapit_index_blueprint.facets.map do |facet_blueprint|
|
160
|
-
Facet.new(facet_blueprint, @query_parser.query, @query_parser.facet_identifiers)
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
private
|
165
|
-
|
166
|
-
# TODO this could use some refactoring
|
167
|
-
# See issue #11 for why this is so complex.
|
168
|
-
def fetch_results(options = {})
|
169
|
-
matches = @query_parser.matchset(options).matches
|
170
|
-
records_by_class = {}
|
171
|
-
matches.each do |match|
|
172
|
-
class_name, id = match.document.data.split('-')
|
173
|
-
records_by_class[class_name] ||= []
|
174
|
-
records_by_class[class_name] << id
|
175
|
-
end
|
176
|
-
records_by_class.each do |class_name, ids|
|
177
|
-
records_by_class[class_name] = class_name.constantize.xapit_adapter.find_multiple(ids)
|
178
|
-
end
|
179
|
-
matches.map do |match|
|
180
|
-
class_name, id = match.document.data.split('-')
|
181
|
-
member = records_by_class[class_name].detect { |m| m.id == id.to_i }
|
182
|
-
member.xapit_relevance = match.percent
|
183
|
-
member
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
data/lib/xapit/config.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
module Xapit
|
2
|
-
# Singleton class for storing Xapit configuration settings. Currently this only includes the database path.
|
3
|
-
class Config
|
4
|
-
class << self
|
5
|
-
attr_reader :options
|
6
|
-
|
7
|
-
# See Xapit#setup
|
8
|
-
def setup(options = {})
|
9
|
-
if @options && options[:database_path] != @options[:database_path]
|
10
|
-
@database = nil
|
11
|
-
@writable_database = nil
|
12
|
-
end
|
13
|
-
@options = options.reverse_merge(default_options)
|
14
|
-
end
|
15
|
-
|
16
|
-
def default_options
|
17
|
-
{
|
18
|
-
:indexer => SimpleIndexer,
|
19
|
-
:query_parser => ClassicQueryParser,
|
20
|
-
:spelling => true,
|
21
|
-
:stemming => "english"
|
22
|
-
}
|
23
|
-
end
|
24
|
-
|
25
|
-
# See if setup options are already set.
|
26
|
-
def setup?
|
27
|
-
@options
|
28
|
-
end
|
29
|
-
|
30
|
-
# The configured path to the database.
|
31
|
-
def path
|
32
|
-
@options[:database_path]
|
33
|
-
end
|
34
|
-
|
35
|
-
def query_parser
|
36
|
-
@options[:query_parser]
|
37
|
-
end
|
38
|
-
|
39
|
-
def indexer
|
40
|
-
@options[:indexer]
|
41
|
-
end
|
42
|
-
|
43
|
-
def spelling?
|
44
|
-
@options[:spelling]
|
45
|
-
end
|
46
|
-
|
47
|
-
def stemming
|
48
|
-
@options[:stemming]
|
49
|
-
end
|
50
|
-
|
51
|
-
def breadcrumb_facets?
|
52
|
-
@options[:breadcrumb_facets]
|
53
|
-
end
|
54
|
-
|
55
|
-
# Fetch Xapian::Database object at configured path. Database is stored in memory.
|
56
|
-
def database
|
57
|
-
@writable_database || (@database ||= Xapian::Database.new(path))
|
58
|
-
end
|
59
|
-
|
60
|
-
# Fetch Xapian::WritableDatabase object at configured path. Database is stored in memory.
|
61
|
-
# Creates the database directory if needed.
|
62
|
-
def writable_database
|
63
|
-
FileUtils.mkdir_p(File.dirname(path)) unless File.exist?(File.dirname(path))
|
64
|
-
@writable_database ||= Xapian::WritableDatabase.new(path, Xapian::DB_CREATE_OR_OPEN)
|
65
|
-
end
|
66
|
-
|
67
|
-
# Removes the configured database file and clears the stored one in memory.
|
68
|
-
def remove_database
|
69
|
-
FileUtils.rm_rf(path) if File.exist? File.join(path, "iamflint")
|
70
|
-
@database = nil
|
71
|
-
@writable_database = nil
|
72
|
-
end
|
73
|
-
|
74
|
-
# Clear the current database from memory. Unfortunately this is a hack because
|
75
|
-
# Xapian doesn't provide a "close" method on the database. We just have to hope
|
76
|
-
# no other references are lying around.
|
77
|
-
def close_database
|
78
|
-
@database = nil
|
79
|
-
@writable_database = nil
|
80
|
-
GC.start
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|