summaryrefslogtreecommitdiff
path: root/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas
diff options
context:
space:
mode:
authorhukl <contact@smyck.org>2009-04-28 00:15:53 +0200
committerhukl <contact@smyck.org>2009-05-01 17:14:02 +0200
commit4bd16f053847f2efe347ebda9136ef2233ee0d2c (patch)
treef4c11f89455de991c8d87726d5757b752e7129e2 /vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas
parentd3a9b46ba5c863a0ff377dcffae9a494fe476e02 (diff)
added thinking_sphinx plugin for fulltext search on nodes and heads
Diffstat (limited to 'vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas')
-rw-r--r--vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/datetime_delta.rb50
-rw-r--r--vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/default_delta.rb67
-rw-r--r--vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta.rb25
-rw-r--r--vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/delta_job.rb24
-rw-r--r--vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/flag_as_deleted_job.rb27
-rw-r--r--vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/job.rb26
6 files changed, 219 insertions, 0 deletions
diff --git a/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/datetime_delta.rb b/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/datetime_delta.rb
new file mode 100644
index 00000000..2ee46d41
--- /dev/null
+++ b/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/datetime_delta.rb
@@ -0,0 +1,50 @@
1module ThinkingSphinx
2 module Deltas
3 class DatetimeDelta < ThinkingSphinx::Deltas::DefaultDelta
4 attr_accessor :column, :threshold
5
6 def initialize(index, options)
7 @index = index
8 @column = options.delete(:delta_column) || :updated_at
9 @threshold = options.delete(:threshold) || 1.day
10 end
11
12 def index(model, instance = nil)
13 # do nothing
14 true
15 end
16
17 def delayed_index(model)
18 config = ThinkingSphinx::Configuration.instance
19 rotate = ThinkingSphinx.sphinx_running? ? "--rotate" : ""
20
21 output = `#{config.bin_path}indexer --config #{config.config_file} #{rotate} #{delta_index_name model}`
22 output += `#{config.bin_path}indexer --config #{config.config_file} #{rotate} --merge #{core_index_name model} #{delta_index_name model} --merge-dst-range sphinx_deleted 0 0`
23 puts output unless ThinkingSphinx.suppress_delta_output?
24
25 true
26 end
27
28 def toggle(instance)
29 # do nothing
30 end
31
32 def toggled(instance)
33 instance.send(@column) > @threshold.ago
34 end
35
36 def reset_query(model)
37 nil
38 end
39
40 def clause(model, toggled)
41 if toggled
42 "#{model.quoted_table_name}.#{@index.quote_column(@column.to_s)}" +
43 " > #{adapter.time_difference(@threshold)}"
44 else
45 nil
46 end
47 end
48 end
49 end
50end
diff --git a/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/default_delta.rb b/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/default_delta.rb
new file mode 100644
index 00000000..c9736120
--- /dev/null
+++ b/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/default_delta.rb
@@ -0,0 +1,67 @@
1module ThinkingSphinx
2 module Deltas
3 class DefaultDelta
4 attr_accessor :column
5
6 def initialize(index, options)
7 @index = index
8 @column = options.delete(:delta_column) || :delta
9 end
10
11 def index(model, instance = nil)
12 return true unless ThinkingSphinx.updates_enabled? &&
13 ThinkingSphinx.deltas_enabled?
14 return true if instance && !toggled(instance)
15
16 config = ThinkingSphinx::Configuration.instance
17 client = Riddle::Client.new config.address, config.port
18 rotate = ThinkingSphinx.sphinx_running? ? "--rotate" : ""
19
20 output = `#{config.bin_path}indexer --config #{config.config_file} #{rotate} #{delta_index_name model}`
21 puts(output) unless ThinkingSphinx.suppress_delta_output?
22
23 client.update(
24 core_index_name(model),
25 ['sphinx_deleted'],
26 {instance.sphinx_document_id => [1]}
27 ) if instance && ThinkingSphinx.sphinx_running? && instance.in_both_indexes?
28
29 true
30 end
31
32 def toggle(instance)
33 instance.delta = true
34 end
35
36 def toggled(instance)
37 instance.delta
38 end
39
40 def reset_query(model)
41 "UPDATE #{model.quoted_table_name} SET " +
42 "#{@index.quote_column(@column.to_s)} = #{adapter.boolean(false)}"
43 end
44
45 def clause(model, toggled)
46 "#{model.quoted_table_name}.#{@index.quote_column(@column.to_s)}" +
47 " = #{adapter.boolean(toggled)}"
48 end
49
50 protected
51
52 def core_index_name(model)
53 "#{model.source_of_sphinx_index.name.underscore.tr(':/\\', '_')}_core"
54 end
55
56 def delta_index_name(model)
57 "#{model.source_of_sphinx_index.name.underscore.tr(':/\\', '_')}_delta"
58 end
59
60 private
61
62 def adapter
63 @adapter = @index.model.sphinx_database_adapter
64 end
65 end
66 end
67end
diff --git a/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta.rb b/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta.rb
new file mode 100644
index 00000000..e95298b6
--- /dev/null
+++ b/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta.rb
@@ -0,0 +1,25 @@
1require 'delayed/job'
2
3require 'thinking_sphinx/deltas/delayed_delta/delta_job'
4require 'thinking_sphinx/deltas/delayed_delta/flag_as_deleted_job'
5require 'thinking_sphinx/deltas/delayed_delta/job'
6
7module ThinkingSphinx
8 module Deltas
9 class DelayedDelta < ThinkingSphinx::Deltas::DefaultDelta
10 def index(model, instance = nil)
11 ThinkingSphinx::Deltas::Job.enqueue(
12 ThinkingSphinx::Deltas::DeltaJob.new(delta_index_name(model))
13 )
14
15 Delayed::Job.enqueue(
16 ThinkingSphinx::Deltas::FlagAsDeletedJob.new(
17 core_index_name(model), instance.sphinx_document_id
18 )
19 ) if instance
20
21 true
22 end
23 end
24 end
25end
diff --git a/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/delta_job.rb b/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/delta_job.rb
new file mode 100644
index 00000000..f9511ecd
--- /dev/null
+++ b/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/delta_job.rb
@@ -0,0 +1,24 @@
1module ThinkingSphinx
2 module Deltas
3 class DeltaJob
4 attr_accessor :index
5
6 def initialize(index)
7 @index = index
8 end
9
10 def perform
11 return true unless ThinkingSphinx.updates_enabled? &&
12 ThinkingSphinx.deltas_enabled?
13
14 config = ThinkingSphinx::Configuration.instance
15 client = Riddle::Client.new config.address, config.port
16
17 output = `#{config.bin_path}indexer --config #{config.config_file} --rotate #{index}`
18 puts output unless ThinkingSphinx.suppress_delta_output?
19
20 true
21 end
22 end
23 end
24end
diff --git a/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/flag_as_deleted_job.rb b/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/flag_as_deleted_job.rb
new file mode 100644
index 00000000..d6afd27b
--- /dev/null
+++ b/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/flag_as_deleted_job.rb
@@ -0,0 +1,27 @@
1module ThinkingSphinx
2 module Deltas
3 class FlagAsDeletedJob
4 attr_accessor :index, :document_id
5
6 def initialize(index, document_id)
7 @index, @document_id = index, document_id
8 end
9
10 def perform
11 return true unless ThinkingSphinx.updates_enabled?
12
13 config = ThinkingSphinx::Configuration.instance
14 client = Riddle::Client.new config.address, config.port
15
16 client.update(
17 @index,
18 ['sphinx_deleted'],
19 {@document_id => [1]}
20 ) if ThinkingSphinx.sphinx_running? &&
21 ThinkingSphinx::Search.search_for_id(@document_id, @index)
22
23 true
24 end
25 end
26 end
27end \ No newline at end of file
diff --git a/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/job.rb b/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/job.rb
new file mode 100644
index 00000000..de0a7cb5
--- /dev/null
+++ b/vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/job.rb
@@ -0,0 +1,26 @@
1module ThinkingSphinx
2 module Deltas
3 class Job < Delayed::Job
4 def self.enqueue(object, priority = 0)
5 super unless duplicates_exist(object)
6 end
7
8 def self.cancel_thinking_sphinx_jobs
9 if connection.tables.include?("delayed_jobs")
10 delete_all("handler LIKE '--- !ruby/object:ThinkingSphinx::Deltas::%'")
11 end
12 end
13
14 private
15
16 def self.duplicates_exist(object)
17 count(
18 :conditions => {
19 :handler => object.to_yaml,
20 :locked_at => nil
21 }
22 ) > 0
23 end
24 end
25 end
26end