lisausa-sunspot 1.2.1
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/.gitignore +12 -0
- data/Gemfile +4 -0
- data/History.txt +222 -0
- data/LICENSE +18 -0
- data/Rakefile +17 -0
- data/TODO +13 -0
- data/VERSION.yml +4 -0
- data/bin/sunspot-installer +19 -0
- data/bin/sunspot-solr +74 -0
- data/installer/config/schema.yml +95 -0
- data/lib/light_config.rb +40 -0
- data/lib/sunspot.rb +569 -0
- data/lib/sunspot/adapters.rb +265 -0
- data/lib/sunspot/composite_setup.rb +202 -0
- data/lib/sunspot/configuration.rb +46 -0
- data/lib/sunspot/data_extractor.rb +50 -0
- data/lib/sunspot/dsl.rb +5 -0
- data/lib/sunspot/dsl/adjustable.rb +47 -0
- data/lib/sunspot/dsl/field_query.rb +279 -0
- data/lib/sunspot/dsl/fields.rb +103 -0
- data/lib/sunspot/dsl/fulltext.rb +243 -0
- data/lib/sunspot/dsl/function.rb +14 -0
- data/lib/sunspot/dsl/functional.rb +44 -0
- data/lib/sunspot/dsl/more_like_this_query.rb +56 -0
- data/lib/sunspot/dsl/paginatable.rb +28 -0
- data/lib/sunspot/dsl/query_facet.rb +36 -0
- data/lib/sunspot/dsl/restriction.rb +25 -0
- data/lib/sunspot/dsl/restriction_with_near.rb +121 -0
- data/lib/sunspot/dsl/scope.rb +217 -0
- data/lib/sunspot/dsl/search.rb +30 -0
- data/lib/sunspot/dsl/standard_query.rb +121 -0
- data/lib/sunspot/field.rb +193 -0
- data/lib/sunspot/field_factory.rb +129 -0
- data/lib/sunspot/indexer.rb +131 -0
- data/lib/sunspot/installer.rb +31 -0
- data/lib/sunspot/installer/library_installer.rb +45 -0
- data/lib/sunspot/installer/schema_builder.rb +219 -0
- data/lib/sunspot/installer/solrconfig_updater.rb +76 -0
- data/lib/sunspot/installer/task_helper.rb +18 -0
- data/lib/sunspot/query.rb +11 -0
- data/lib/sunspot/query/abstract_field_facet.rb +52 -0
- data/lib/sunspot/query/boost_query.rb +24 -0
- data/lib/sunspot/query/common_query.rb +85 -0
- data/lib/sunspot/query/composite_fulltext.rb +36 -0
- data/lib/sunspot/query/connective.rb +206 -0
- data/lib/sunspot/query/date_field_facet.rb +14 -0
- data/lib/sunspot/query/dismax.rb +128 -0
- data/lib/sunspot/query/field_facet.rb +41 -0
- data/lib/sunspot/query/filter.rb +38 -0
- data/lib/sunspot/query/function_query.rb +52 -0
- data/lib/sunspot/query/geo.rb +53 -0
- data/lib/sunspot/query/highlighting.rb +67 -0
- data/lib/sunspot/query/more_like_this.rb +61 -0
- data/lib/sunspot/query/more_like_this_query.rb +12 -0
- data/lib/sunspot/query/pagination.rb +38 -0
- data/lib/sunspot/query/query_facet.rb +16 -0
- data/lib/sunspot/query/restriction.rb +262 -0
- data/lib/sunspot/query/scope.rb +9 -0
- data/lib/sunspot/query/sort.rb +95 -0
- data/lib/sunspot/query/sort_composite.rb +33 -0
- data/lib/sunspot/query/standard_query.rb +16 -0
- data/lib/sunspot/query/text_field_boost.rb +17 -0
- data/lib/sunspot/schema.rb +151 -0
- data/lib/sunspot/search.rb +9 -0
- data/lib/sunspot/search/abstract_search.rb +293 -0
- data/lib/sunspot/search/date_facet.rb +35 -0
- data/lib/sunspot/search/facet_row.rb +27 -0
- data/lib/sunspot/search/field_facet.rb +88 -0
- data/lib/sunspot/search/highlight.rb +38 -0
- data/lib/sunspot/search/hit.rb +136 -0
- data/lib/sunspot/search/more_like_this_search.rb +31 -0
- data/lib/sunspot/search/paginated_collection.rb +55 -0
- data/lib/sunspot/search/query_facet.rb +67 -0
- data/lib/sunspot/search/standard_search.rb +21 -0
- data/lib/sunspot/server.rb +152 -0
- data/lib/sunspot/session.rb +260 -0
- data/lib/sunspot/session_proxy.rb +87 -0
- data/lib/sunspot/session_proxy/abstract_session_proxy.rb +29 -0
- data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +66 -0
- data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +89 -0
- data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +43 -0
- data/lib/sunspot/session_proxy/sharding_session_proxy.rb +222 -0
- data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +42 -0
- data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +37 -0
- data/lib/sunspot/setup.rb +350 -0
- data/lib/sunspot/text_field_setup.rb +29 -0
- data/lib/sunspot/type.rb +372 -0
- data/lib/sunspot/util.rb +243 -0
- data/lib/sunspot/version.rb +3 -0
- data/script/console +10 -0
- data/solr-1.3/etc/jetty.xml +212 -0
- data/solr-1.3/etc/webdefault.xml +379 -0
- data/solr-1.3/lib/jetty-6.1.3.jar +0 -0
- data/solr-1.3/lib/jetty-util-6.1.3.jar +0 -0
- data/solr-1.3/lib/jsp-2.1/ant-1.6.5.jar +0 -0
- data/solr-1.3/lib/jsp-2.1/core-3.1.1.jar +0 -0
- data/solr-1.3/lib/jsp-2.1/jsp-2.1.jar +0 -0
- data/solr-1.3/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
- data/solr-1.3/lib/servlet-api-2.5-6.1.3.jar +0 -0
- data/solr-1.3/solr/conf/elevate.xml +36 -0
- data/solr-1.3/solr/conf/protwords.txt +21 -0
- data/solr-1.3/solr/conf/schema.xml +64 -0
- data/solr-1.3/solr/conf/solrconfig.xml +725 -0
- data/solr-1.3/solr/conf/stopwords.txt +57 -0
- data/solr-1.3/solr/conf/synonyms.txt +31 -0
- data/solr-1.3/solr/lib/geoapi-nogenerics-2.1-M2.jar +0 -0
- data/solr-1.3/solr/lib/gt2-referencing-2.3.1.jar +0 -0
- data/solr-1.3/solr/lib/jsr108-0.01.jar +0 -0
- data/solr-1.3/solr/lib/locallucene.jar +0 -0
- data/solr-1.3/solr/lib/localsolr.jar +0 -0
- data/solr-1.3/start.jar +0 -0
- data/solr-1.3/webapps/solr.war +0 -0
- data/solr/README.txt +42 -0
- data/solr/etc/jetty.xml +218 -0
- data/solr/etc/webdefault.xml +379 -0
- data/solr/lib/jetty-6.1.3.jar +0 -0
- data/solr/lib/jetty-util-6.1.3.jar +0 -0
- data/solr/lib/jsp-2.1/ant-1.6.5.jar +0 -0
- data/solr/lib/jsp-2.1/core-3.1.1.jar +0 -0
- data/solr/lib/jsp-2.1/jsp-2.1.jar +0 -0
- data/solr/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
- data/solr/lib/servlet-api-2.5-6.1.3.jar +0 -0
- data/solr/solr/.gitignore +1 -0
- data/solr/solr/README.txt +54 -0
- data/solr/solr/conf/admin-extra.html +31 -0
- data/solr/solr/conf/elevate.xml +36 -0
- data/solr/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
- data/solr/solr/conf/protwords.txt +21 -0
- data/solr/solr/conf/schema.xml +238 -0
- data/solr/solr/conf/scripts.conf +24 -0
- data/solr/solr/conf/solrconfig.xml +934 -0
- data/solr/solr/conf/spellings.txt +2 -0
- data/solr/solr/conf/stopwords.txt +58 -0
- data/solr/solr/conf/synonyms.txt +31 -0
- data/solr/solr/conf/xslt/example.xsl +132 -0
- data/solr/solr/conf/xslt/example_atom.xsl +67 -0
- data/solr/solr/conf/xslt/example_rss.xsl +66 -0
- data/solr/solr/conf/xslt/luke.xsl +337 -0
- data/solr/start.jar +0 -0
- data/solr/webapps/solr.war +0 -0
- data/spec/api/adapters_spec.rb +33 -0
- data/spec/api/binding_spec.rb +50 -0
- data/spec/api/indexer/attributes_spec.rb +149 -0
- data/spec/api/indexer/batch_spec.rb +46 -0
- data/spec/api/indexer/dynamic_fields_spec.rb +42 -0
- data/spec/api/indexer/fixed_fields_spec.rb +57 -0
- data/spec/api/indexer/fulltext_spec.rb +43 -0
- data/spec/api/indexer/removal_spec.rb +53 -0
- data/spec/api/indexer/spec_helper.rb +1 -0
- data/spec/api/indexer_spec.rb +14 -0
- data/spec/api/query/advanced_manipulation_examples.rb +35 -0
- data/spec/api/query/connectives_examples.rb +189 -0
- data/spec/api/query/dsl_spec.rb +18 -0
- data/spec/api/query/dynamic_fields_examples.rb +165 -0
- data/spec/api/query/faceting_examples.rb +397 -0
- data/spec/api/query/fulltext_examples.rb +313 -0
- data/spec/api/query/function_spec.rb +70 -0
- data/spec/api/query/geo_examples.rb +68 -0
- data/spec/api/query/highlighting_examples.rb +223 -0
- data/spec/api/query/more_like_this_spec.rb +140 -0
- data/spec/api/query/ordering_pagination_examples.rb +95 -0
- data/spec/api/query/scope_examples.rb +275 -0
- data/spec/api/query/spec_helper.rb +1 -0
- data/spec/api/query/standard_spec.rb +28 -0
- data/spec/api/query/text_field_scoping_examples.rb +30 -0
- data/spec/api/query/types_spec.rb +20 -0
- data/spec/api/search/dynamic_fields_spec.rb +33 -0
- data/spec/api/search/faceting_spec.rb +360 -0
- data/spec/api/search/highlighting_spec.rb +69 -0
- data/spec/api/search/hits_spec.rb +120 -0
- data/spec/api/search/paginated_collection_spec.rb +26 -0
- data/spec/api/search/results_spec.rb +66 -0
- data/spec/api/search/search_spec.rb +23 -0
- data/spec/api/search/spec_helper.rb +1 -0
- data/spec/api/server_spec.rb +91 -0
- data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +85 -0
- data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +30 -0
- data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +41 -0
- data/spec/api/session_proxy/sharding_session_proxy_spec.rb +77 -0
- data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +24 -0
- data/spec/api/session_proxy/spec_helper.rb +9 -0
- data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +50 -0
- data/spec/api/session_spec.rb +220 -0
- data/spec/api/spec_helper.rb +3 -0
- data/spec/api/sunspot_spec.rb +18 -0
- data/spec/ext.rb +11 -0
- data/spec/helpers/indexer_helper.rb +29 -0
- data/spec/helpers/query_helper.rb +38 -0
- data/spec/helpers/search_helper.rb +80 -0
- data/spec/integration/dynamic_fields_spec.rb +55 -0
- data/spec/integration/faceting_spec.rb +238 -0
- data/spec/integration/highlighting_spec.rb +22 -0
- data/spec/integration/indexing_spec.rb +33 -0
- data/spec/integration/keyword_search_spec.rb +317 -0
- data/spec/integration/local_search_spec.rb +64 -0
- data/spec/integration/more_like_this_spec.rb +43 -0
- data/spec/integration/scoped_search_spec.rb +354 -0
- data/spec/integration/spec_helper.rb +7 -0
- data/spec/integration/stored_fields_spec.rb +10 -0
- data/spec/integration/test_pagination.rb +32 -0
- data/spec/mocks/adapters.rb +32 -0
- data/spec/mocks/blog.rb +3 -0
- data/spec/mocks/comment.rb +21 -0
- data/spec/mocks/connection.rb +126 -0
- data/spec/mocks/mock_adapter.rb +30 -0
- data/spec/mocks/mock_class_sharding_session_proxy.rb +24 -0
- data/spec/mocks/mock_record.rb +52 -0
- data/spec/mocks/mock_sharding_session_proxy.rb +15 -0
- data/spec/mocks/photo.rb +11 -0
- data/spec/mocks/post.rb +85 -0
- data/spec/mocks/super_class.rb +2 -0
- data/spec/mocks/user.rb +13 -0
- data/spec/spec_helper.rb +30 -0
- data/tasks/rdoc.rake +27 -0
- data/tasks/schema.rake +19 -0
- data/tasks/todo.rake +4 -0
- metadata +457 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Sunspot
|
|
2
|
+
module Search
|
|
3
|
+
#
|
|
4
|
+
# This class encapsulates the results of a Solr search. It provides access
|
|
5
|
+
# to search results, total result count, facets, and pagination information.
|
|
6
|
+
# Instances of Search are returned by the Sunspot.search and
|
|
7
|
+
# Sunspot.new_search methods.
|
|
8
|
+
#
|
|
9
|
+
class StandardSearch < AbstractSearch
|
|
10
|
+
def request_handler
|
|
11
|
+
super || :select
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def dsl
|
|
17
|
+
DSL::Search.new(self, @setup)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
require 'escape'
|
|
2
|
+
require 'set'
|
|
3
|
+
require 'tempfile'
|
|
4
|
+
|
|
5
|
+
module Sunspot
|
|
6
|
+
class Server #:nodoc:
|
|
7
|
+
# Raised if #stop is called but the server is not running
|
|
8
|
+
ServerError = Class.new(RuntimeError)
|
|
9
|
+
AlreadyRunningError = Class.new(ServerError)
|
|
10
|
+
NotRunningError = Class.new(ServerError)
|
|
11
|
+
|
|
12
|
+
# Name of the sunspot executable (shell script)
|
|
13
|
+
SOLR_START_JAR = File.expand_path(
|
|
14
|
+
File.join(File.dirname(__FILE__), '..', '..', 'solr', 'start.jar')
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
LOG_LEVELS = Set['SEVERE', 'WARNING', 'INFO', 'CONFIG', 'FINE', 'FINER', 'FINEST']
|
|
18
|
+
|
|
19
|
+
attr_accessor :min_memory, :max_memory, :port, :solr_data_dir, :solr_home, :log_file
|
|
20
|
+
attr_writer :pid_dir, :pid_file, :log_level, :solr_data_dir, :solr_home, :solr_jar
|
|
21
|
+
|
|
22
|
+
#
|
|
23
|
+
# Start the sunspot-solr server. Bootstrap solr_home first,
|
|
24
|
+
# if neccessary.
|
|
25
|
+
#
|
|
26
|
+
# ==== Returns
|
|
27
|
+
#
|
|
28
|
+
# Boolean:: success
|
|
29
|
+
#
|
|
30
|
+
def start
|
|
31
|
+
if File.exist?(pid_path)
|
|
32
|
+
existing_pid = IO.read(pid_path).to_i
|
|
33
|
+
begin
|
|
34
|
+
Process.kill(0, existing_pid)
|
|
35
|
+
raise(AlreadyRunningError, "Server is already running with PID #{existing_pid}")
|
|
36
|
+
rescue Errno::ESRCH
|
|
37
|
+
STDERR.puts("Removing stale PID file at #{pid_path}")
|
|
38
|
+
FileUtils.rm(pid_path)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
fork do
|
|
42
|
+
pid = fork do
|
|
43
|
+
Process.setsid
|
|
44
|
+
STDIN.reopen('/dev/null')
|
|
45
|
+
STDOUT.reopen('/dev/null', 'a')
|
|
46
|
+
STDERR.reopen(STDOUT)
|
|
47
|
+
run
|
|
48
|
+
end
|
|
49
|
+
FileUtils.mkdir_p(pid_dir)
|
|
50
|
+
File.open(pid_path, 'w') do |file|
|
|
51
|
+
file << pid
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# Run the sunspot-solr server in the foreground. Boostrap
|
|
58
|
+
# solr_home first, if neccessary.
|
|
59
|
+
#
|
|
60
|
+
# ==== Returns
|
|
61
|
+
#
|
|
62
|
+
# Boolean:: success
|
|
63
|
+
#
|
|
64
|
+
def run
|
|
65
|
+
command = ['java']
|
|
66
|
+
command << "-Xms#{min_memory}" if min_memory
|
|
67
|
+
command << "-Xmx#{max_memory}" if max_memory
|
|
68
|
+
command << "-Djetty.port=#{port}" if port
|
|
69
|
+
command << "-Dsolr.data.dir=#{solr_data_dir}" if solr_data_dir
|
|
70
|
+
command << "-Dsolr.solr.home=#{solr_home}" if solr_home
|
|
71
|
+
command << "-Djava.util.logging.config.file=#{logging_config_path}" if logging_config_path
|
|
72
|
+
command << '-jar' << File.basename(solr_jar)
|
|
73
|
+
FileUtils.cd(File.dirname(solr_jar)) do
|
|
74
|
+
exec(Escape.shell_command(command))
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
#
|
|
79
|
+
# Stop the sunspot-solr server.
|
|
80
|
+
#
|
|
81
|
+
# ==== Returns
|
|
82
|
+
#
|
|
83
|
+
# Boolean:: success
|
|
84
|
+
#
|
|
85
|
+
def stop
|
|
86
|
+
if File.exist?(pid_path)
|
|
87
|
+
pid = IO.read(pid_path).to_i
|
|
88
|
+
begin
|
|
89
|
+
Process.kill('TERM', pid)
|
|
90
|
+
rescue Errno::ESRCH
|
|
91
|
+
raise NotRunningError, "Process with PID #{pid} is no longer running"
|
|
92
|
+
ensure
|
|
93
|
+
FileUtils.rm(pid_path)
|
|
94
|
+
end
|
|
95
|
+
else
|
|
96
|
+
raise NotRunningError, "No PID file at #{pid_path}"
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def log_level=(level)
|
|
101
|
+
unless LOG_LEVELS.include?(level.to_s.upcase)
|
|
102
|
+
raise(ArgumentError, "#{level} is not a valid log level: Use one of #{LOG_LEVELS.to_a.join(',')}")
|
|
103
|
+
end
|
|
104
|
+
@log_level = level.to_s.upcase
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def log_level
|
|
108
|
+
@log_level || 'WARNING'
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def pid_path
|
|
112
|
+
File.join(pid_dir, pid_file)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def pid_file
|
|
116
|
+
@pid_file || 'sunspot-solr.pid'
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def pid_dir
|
|
120
|
+
File.expand_path(@pid_dir || FileUtils.pwd)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def solr_data_dir
|
|
124
|
+
File.expand_path(@solr_data_dir || Dir.tmpdir)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def solr_home
|
|
128
|
+
File.expand_path(@solr_home || File.join(File.dirname(solr_jar), 'solr'))
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def solr_jar
|
|
132
|
+
@solr_jar || SOLR_START_JAR
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
private
|
|
136
|
+
|
|
137
|
+
def logging_config_path
|
|
138
|
+
return @logging_config_path if defined?(@logging_config_path)
|
|
139
|
+
@logging_config_path =
|
|
140
|
+
if log_file
|
|
141
|
+
logging_config = Tempfile.new('logging.properties')
|
|
142
|
+
logging_config.puts("handlers = java.util.logging.FileHandler")
|
|
143
|
+
logging_config.puts("java.util.logging.FileHandler.level = #{log_level.to_s.upcase}")
|
|
144
|
+
logging_config.puts("java.util.logging.FileHandler.pattern = #{log_file}")
|
|
145
|
+
logging_config.puts("java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter")
|
|
146
|
+
logging_config.flush
|
|
147
|
+
logging_config.close
|
|
148
|
+
logging_config.path
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
module Sunspot
|
|
2
|
+
#
|
|
3
|
+
# A Sunspot session encapsulates a connection to Solr and a set of
|
|
4
|
+
# configuration choices. Though users of Sunspot may manually instantiate
|
|
5
|
+
# Session objects, in the general case it's easier to use the singleton
|
|
6
|
+
# stored in the Sunspot module. Since the Sunspot module provides all of
|
|
7
|
+
# the instance methods of Session as class methods, they are not documented
|
|
8
|
+
# again here.
|
|
9
|
+
#
|
|
10
|
+
class Session
|
|
11
|
+
class <<self
|
|
12
|
+
attr_writer :connection_class #:nodoc:
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# For testing purposes
|
|
16
|
+
#
|
|
17
|
+
def connection_class #:nodoc:
|
|
18
|
+
@connection_class ||= RSolr
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
#
|
|
23
|
+
# Sunspot::Configuration object for this session
|
|
24
|
+
#
|
|
25
|
+
attr_reader :config
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
# Sessions are initialized with a Sunspot configuration and a Solr
|
|
29
|
+
# connection. Usually you will want to stick with the default arguments
|
|
30
|
+
# when instantiating your own sessions.
|
|
31
|
+
#
|
|
32
|
+
def initialize(config = Configuration.build, connection = nil)
|
|
33
|
+
@config = config
|
|
34
|
+
yield(@config) if block_given?
|
|
35
|
+
@connection = connection
|
|
36
|
+
@deletes = @adds = 0
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
#
|
|
40
|
+
# See Sunspot.new_search
|
|
41
|
+
#
|
|
42
|
+
def new_search(*types, &block)
|
|
43
|
+
types.flatten!
|
|
44
|
+
search = Search::StandardSearch.new(
|
|
45
|
+
connection,
|
|
46
|
+
setup_for_types(types),
|
|
47
|
+
Query::StandardQuery.new(types),
|
|
48
|
+
@config
|
|
49
|
+
)
|
|
50
|
+
search.build(&block) if block
|
|
51
|
+
search
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
#
|
|
55
|
+
# See Sunspot.search
|
|
56
|
+
#
|
|
57
|
+
def search(*types, &block)
|
|
58
|
+
search = new_search(*types, &block)
|
|
59
|
+
search.execute
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
#
|
|
63
|
+
# See Sunspot.new_more_like_this
|
|
64
|
+
#
|
|
65
|
+
def new_more_like_this(object, *types, &block)
|
|
66
|
+
types[0] ||= object.class
|
|
67
|
+
mlt = Search::MoreLikeThisSearch.new(
|
|
68
|
+
connection,
|
|
69
|
+
setup_for_types(types),
|
|
70
|
+
Query::MoreLikeThisQuery.new(object, types),
|
|
71
|
+
@config
|
|
72
|
+
)
|
|
73
|
+
mlt.build(&block) if block
|
|
74
|
+
mlt
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
#
|
|
78
|
+
# See Sunspot.more_like_this
|
|
79
|
+
#
|
|
80
|
+
def more_like_this(object, *types, &block)
|
|
81
|
+
mlt = new_more_like_this(object, *types, &block)
|
|
82
|
+
mlt.execute
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
#
|
|
86
|
+
# See Sunspot.index
|
|
87
|
+
#
|
|
88
|
+
def index(*objects)
|
|
89
|
+
objects.flatten!
|
|
90
|
+
@adds += objects.length
|
|
91
|
+
indexer.add(objects)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
#
|
|
95
|
+
# See Sunspot.index!
|
|
96
|
+
#
|
|
97
|
+
def index!(*objects)
|
|
98
|
+
index(*objects)
|
|
99
|
+
commit
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
#
|
|
103
|
+
# See Sunspot.commit
|
|
104
|
+
#
|
|
105
|
+
def commit
|
|
106
|
+
@adds = @deletes = 0
|
|
107
|
+
connection.commit
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
#
|
|
111
|
+
# See Sunspot.optimize
|
|
112
|
+
#
|
|
113
|
+
def optimize
|
|
114
|
+
@adds = @deletes = 0
|
|
115
|
+
connection.optimize
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
#
|
|
119
|
+
# See Sunspot.remove
|
|
120
|
+
#
|
|
121
|
+
def remove(*objects, &block)
|
|
122
|
+
if block
|
|
123
|
+
types = objects
|
|
124
|
+
conjunction = Query::Connective::Conjunction.new
|
|
125
|
+
if types.length == 1
|
|
126
|
+
conjunction.add_positive_restriction(TypeField.instance, Query::Restriction::EqualTo, types.first)
|
|
127
|
+
else
|
|
128
|
+
conjunction.add_positive_restriction(TypeField.instance, Query::Restriction::AnyOf, types)
|
|
129
|
+
end
|
|
130
|
+
dsl = DSL::Scope.new(conjunction, setup_for_types(types))
|
|
131
|
+
Util.instance_eval_or_call(dsl, &block)
|
|
132
|
+
indexer.remove_by_scope(conjunction)
|
|
133
|
+
else
|
|
134
|
+
objects.flatten!
|
|
135
|
+
@deletes += objects.length
|
|
136
|
+
objects.each do |object|
|
|
137
|
+
indexer.remove(object)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
#
|
|
143
|
+
# See Sunspot.remove!
|
|
144
|
+
#
|
|
145
|
+
def remove!(*objects)
|
|
146
|
+
remove(*objects)
|
|
147
|
+
commit
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
#
|
|
151
|
+
# See Sunspot.remove_by_id
|
|
152
|
+
#
|
|
153
|
+
def remove_by_id(clazz, id)
|
|
154
|
+
class_name =
|
|
155
|
+
if clazz.is_a?(Class)
|
|
156
|
+
clazz.name
|
|
157
|
+
else
|
|
158
|
+
clazz.to_s
|
|
159
|
+
end
|
|
160
|
+
indexer.remove_by_id(class_name, id)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
#
|
|
164
|
+
# See Sunspot.remove_by_id!
|
|
165
|
+
#
|
|
166
|
+
def remove_by_id!(clazz, id)
|
|
167
|
+
remove_by_id(clazz, id)
|
|
168
|
+
commit
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
#
|
|
172
|
+
# See Sunspot.remove_all
|
|
173
|
+
#
|
|
174
|
+
def remove_all(*classes)
|
|
175
|
+
classes.flatten!
|
|
176
|
+
if classes.empty?
|
|
177
|
+
@deletes += 1
|
|
178
|
+
indexer.remove_all
|
|
179
|
+
else
|
|
180
|
+
@deletes += classes.length
|
|
181
|
+
classes.each { |clazz| indexer.remove_all(clazz) }
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
#
|
|
186
|
+
# See Sunspot.remove_all!
|
|
187
|
+
#
|
|
188
|
+
def remove_all!(*classes)
|
|
189
|
+
remove_all(*classes)
|
|
190
|
+
commit
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
#
|
|
194
|
+
# See Sunspot.dirty?
|
|
195
|
+
#
|
|
196
|
+
def dirty?
|
|
197
|
+
(@deletes + @adds) > 0
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
#
|
|
201
|
+
# See Sunspot.commit_if_dirty
|
|
202
|
+
#
|
|
203
|
+
def commit_if_dirty
|
|
204
|
+
commit if dirty?
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
#
|
|
208
|
+
# See Sunspot.delete_dirty?
|
|
209
|
+
#
|
|
210
|
+
def delete_dirty?
|
|
211
|
+
@deletes > 0
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
#
|
|
215
|
+
# See Sunspot.commit_if_delete_dirty
|
|
216
|
+
#
|
|
217
|
+
def commit_if_delete_dirty
|
|
218
|
+
commit if delete_dirty?
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
#
|
|
222
|
+
# See Sunspot.batch
|
|
223
|
+
#
|
|
224
|
+
def batch
|
|
225
|
+
indexer.start_batch
|
|
226
|
+
yield
|
|
227
|
+
indexer.flush_batch
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
private
|
|
231
|
+
|
|
232
|
+
#
|
|
233
|
+
# Retrieve the Solr connection for this session, creating one if it does not
|
|
234
|
+
# already exist.
|
|
235
|
+
#
|
|
236
|
+
# ==== Returns
|
|
237
|
+
#
|
|
238
|
+
# RSolr::Connection::Base:: The connection for this session
|
|
239
|
+
#
|
|
240
|
+
def connection
|
|
241
|
+
@connection ||=
|
|
242
|
+
self.class.connection_class.connect(:url => config.solr.url)
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def indexer
|
|
246
|
+
@indexer ||= Indexer.new(connection)
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def setup_for_types(types)
|
|
250
|
+
if types.empty?
|
|
251
|
+
raise(ArgumentError, "You must specify at least one type to search")
|
|
252
|
+
end
|
|
253
|
+
if types.length == 1
|
|
254
|
+
Setup.for(types.first)
|
|
255
|
+
else
|
|
256
|
+
CompositeSetup.for(types)
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
module Sunspot
|
|
2
|
+
#
|
|
3
|
+
# This module contains several Session Proxy implementations, which can be
|
|
4
|
+
# used to decorate one or more Session objects and add extra functionality.
|
|
5
|
+
# The user can also implement their own Session Proxy classes; a Session Proxy
|
|
6
|
+
# must simply implement the same public API as the Sunspot::Session class.
|
|
7
|
+
#
|
|
8
|
+
# When implementing a session proxy, some methods of Session may not be
|
|
9
|
+
# practical, or even logical, to implement. In this case, the method should
|
|
10
|
+
# raise a Sunspot::SessionProxy::NotSupportedError (several methods in the
|
|
11
|
+
# built-in session proxies raise this error).
|
|
12
|
+
#
|
|
13
|
+
# To use a session proxy in normal Sunspot usage, you can use the
|
|
14
|
+
# Sunspot.session= method, which will cause Sunspot to delegate all of its
|
|
15
|
+
# session-related class methods (most of them) to the proxy. Session proxies
|
|
16
|
+
# can also easily be chained, although the details of chaining depend on the
|
|
17
|
+
# proxy implementation.
|
|
18
|
+
#
|
|
19
|
+
# ===== Example: Chain a MasterSlaveSessionProxy with a ThreadLocalSessionProxy
|
|
20
|
+
#
|
|
21
|
+
# master_session = Sunspot::SessionProxy::ThreadLocalSessionProxy.new
|
|
22
|
+
# slave_session = Sunspot::SessionProxy::ThreadLocalSessionProxy.new
|
|
23
|
+
# master_session.config.solr.url = 'http://master-solr.local:9080/solr'
|
|
24
|
+
# slave_session.config.solr.url = 'http://slave-solr.local:9080/solr'
|
|
25
|
+
# Sunspot.session = Sunspot::SessionProxy::MasterSlaveSessionProxy.new(master_session, slave_session)
|
|
26
|
+
#
|
|
27
|
+
module SessionProxy
|
|
28
|
+
NotSupportedError = Class.new(StandardError)
|
|
29
|
+
|
|
30
|
+
autoload(
|
|
31
|
+
:AbstractSessionProxy,
|
|
32
|
+
File.join(
|
|
33
|
+
File.dirname(__FILE__),
|
|
34
|
+
'session_proxy',
|
|
35
|
+
'abstract_session_proxy'
|
|
36
|
+
)
|
|
37
|
+
)
|
|
38
|
+
autoload(
|
|
39
|
+
:ThreadLocalSessionProxy,
|
|
40
|
+
File.join(
|
|
41
|
+
File.dirname(__FILE__),
|
|
42
|
+
'session_proxy',
|
|
43
|
+
'thread_local_session_proxy'
|
|
44
|
+
)
|
|
45
|
+
)
|
|
46
|
+
autoload(
|
|
47
|
+
:MasterSlaveSessionProxy,
|
|
48
|
+
File.join(
|
|
49
|
+
File.dirname(__FILE__),
|
|
50
|
+
'session_proxy',
|
|
51
|
+
'master_slave_session_proxy'
|
|
52
|
+
)
|
|
53
|
+
)
|
|
54
|
+
autoload(
|
|
55
|
+
:ShardingSessionProxy,
|
|
56
|
+
File.join(
|
|
57
|
+
File.dirname(__FILE__),
|
|
58
|
+
'session_proxy',
|
|
59
|
+
'sharding_session_proxy'
|
|
60
|
+
)
|
|
61
|
+
)
|
|
62
|
+
autoload(
|
|
63
|
+
:ClassShardingSessionProxy,
|
|
64
|
+
File.join(
|
|
65
|
+
File.dirname(__FILE__),
|
|
66
|
+
'session_proxy',
|
|
67
|
+
'class_sharding_session_proxy'
|
|
68
|
+
)
|
|
69
|
+
)
|
|
70
|
+
autoload(
|
|
71
|
+
:IdShardingSessionProxy,
|
|
72
|
+
File.join(
|
|
73
|
+
File.dirname(__FILE__),
|
|
74
|
+
'session_proxy',
|
|
75
|
+
'id_sharding_session_proxy'
|
|
76
|
+
)
|
|
77
|
+
)
|
|
78
|
+
autoload(
|
|
79
|
+
:SilentFailSessionProxy,
|
|
80
|
+
File.join(
|
|
81
|
+
File.dirname(__FILE__),
|
|
82
|
+
'session_proxy',
|
|
83
|
+
'silent_fail_session_proxy'
|
|
84
|
+
)
|
|
85
|
+
)
|
|
86
|
+
end
|
|
87
|
+
end
|