Class: Sunspot::SessionProxy::ShardingSessionProxy

Inherits:
AbstractSessionProxy show all
Defined in:
sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb

Overview

This is a generic abstract implementation of a session proxy that allows Sunspot to be used with a distributed (sharded) Solr deployment. Concrete subclasses should implement the #session_for method, which takes a searchable object and returns a Session that points to the appropriate Solr shard for that object. Subclasses should also implement the #all_sessions object, which returns the collection of all sharded Session objects.

The class is initialized with a session that points to the Solr instance used to perform searches. Searches will have the :shards param injected, containing references to the Solr instances returned by #all_sessions.

For more on distributed search, see: wiki.apache.org/solr/DistributedSearch

The following methods are not supported (although subclasses may in some cases be able to support them):

  • batch

  • config

  • remove_by_id

  • remove_by_id!

  • remove_all with an argument

  • remove_all! with an argument

Direct Known Subclasses

ClassShardingSessionProxy, IdShardingSessionProxy

Instance Method Summary (collapse)

Methods inherited from AbstractSessionProxy

delegate, not_supported

Constructor Details

- (ShardingSessionProxy) initialize(search_session = Sunspot.session.new)

search_session is the session that should be used for searching.



37
38
39
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 37

def initialize(search_session = Sunspot.session.new)
  @search_session = search_session
end

Instance Method Details

- (Object) all_sessions

Return all shard sessions.

Concrete subclasses must implement this method.



55
56
57
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 55

def all_sessions
  raise NotImplementedError
end

- (Object) commit

Commit all shards. See Sunspot.commit



118
119
120
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 118

def commit
  all_sessions.each { |session| session.commit }
end

- (Object) commit_if_delete_dirty

Commit all delete-dirty sessions. Only delete-dirty sessions will be committed.

See Sunspot.commit_if_delete_dirty



144
145
146
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 144

def commit_if_delete_dirty
  all_sessions.each { |session| session.commit_if_delete_dirty }
end

- (Object) commit_if_dirty

Commit all dirty sessions. Only dirty sessions will be committed.

See Sunspot.commit_if_dirty



134
135
136
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 134

def commit_if_dirty
  all_sessions.each { |session| session.commit_if_dirty }
end

- (Boolean) delete_dirty?

True if any shard session is delete-dirty. Note that directly using the #commit_if_delete_dirty method is more efficient if that’s what you’re trying to do, since in that case only the delete-dirty sessions are committed.

Returns:

  • (Boolean)


203
204
205
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 203

def delete_dirty?
  all_sessions.any? { |session| session.delete_dirty? }
end

- (Boolean) dirty?

True if any shard session is dirty. Note that directly using the #commit_if_dirty method is more efficient if that’s what you’re trying to do, since in that case only the dirty sessions are committed.

See Sunspot.dirty?

Returns:

  • (Boolean)


193
194
195
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 193

def dirty?
  all_sessions.any? { |session| session.dirty? }
end

- (Object) index(*objects)

See Sunspot.index



62
63
64
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 62

def index(*objects)
  using_sharded_session(objects) { |session, group| session.index(group) }
end

- (Object) index!(*objects)

See Sunspot.index!



69
70
71
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 69

def index!(*objects)
  using_sharded_session(objects) { |session, group| session.index!(group) }
end

- (Object) more_like_this(object, &block)



177
178
179
180
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 177

def more_like_this(object, &block)
  #FIXME should use shards
  new_more_like_this(object, &block).execute
end

- (Object) new_more_like_this(object, &block)



182
183
184
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 182

def new_more_like_this(object, &block)
  @search_session.new_more_like_this(object, &block)
end

- (Object) new_search(*types)

Instantiate a new Search object, but don’t execute it. The search will have an extra :shards param injected into the query, which will tell the Solr instance referenced by the search session to search across all shards.

See Sunspot.new_search



156
157
158
159
160
161
162
163
164
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 156

def new_search(*types)
  shard_urls = all_sessions.map { |session| session.config.solr.url }
  search = @search_session.new_search(*types)
  search.build do
    adjust_solr_params { |params| params[:shards] = shard_urls.join(',') }
    # I feel a little dirty doing this.
  end
  search
end

- (Object) optimize

Optimize all shards. See Sunspot.optimize



125
126
127
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 125

def optimize
  all_sessions.each { |session| session.optimize }
end

- (Object) remove(*objects)

See Sunspot.remove



76
77
78
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 76

def remove(*objects)
  using_sharded_session(objects) { |session, group| session.remove(group) }
end

- (Object) remove!(*objects)

See Sunspot.remove!



83
84
85
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 83

def remove!(*objects)
  using_sharded_session(objects) { |session, group| session.remove!(group) }
end

- (Object) remove_all(clazz = nil)

If no argument is passed, behaves like Sunspot.remove_all

If an argument is passed, will raise NotSupportedError, as the proxy does not know which session(s) to which to delegate this operation.



93
94
95
96
97
98
99
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 93

def remove_all(clazz = nil)
  if clazz
    raise NotSupportedError, "Sharding session proxy does not support remove_all with an argument."
  else
    all_sessions.each { |session| session.remove_all }
  end
end

- (Object) remove_all!(clazz = nil)

If no argument is passed, behaves like Sunspot.remove_all!

If an argument is passed, will raise NotSupportedError, as the proxy does not know which session(s) to which to delegate this operation.



107
108
109
110
111
112
113
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 107

def remove_all!(clazz = nil)
  if clazz
    raise NotSupportedError, "Sharding session proxy does not support remove_all! with an argument."
  else
    all_sessions.each { |session| session.remove_all! }
  end
end

- (Object) search(*types, &block)

Build and execute a new Search. The search will have an extra :shards param injected into the query, which will tell the Solr instance referenced by the search session to search across all shards.

See Sunspot.search



173
174
175
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 173

def search(*types, &block)
  new_search(*types).execute
end

- (Object) session_for(object)

Return the appropriate shard session for the object.

Concrete subclasses must implement this method.



46
47
48
# File 'sunspot/lib/sunspot/session_proxy/sharding_session_proxy.rb', line 46

def session_for(object)
  raise NotImplementedError
end