From 4bd16f053847f2efe347ebda9136ef2233ee0d2c Mon Sep 17 00:00:00 2001 From: hukl Date: Tue, 28 Apr 2009 00:15:53 +0200 Subject: added thinking_sphinx plugin for fulltext search on nodes and heads --- .../lib/thinking_sphinx/deltas/datetime_delta.rb | 50 ++++++++++++++++ .../lib/thinking_sphinx/deltas/default_delta.rb | 67 ++++++++++++++++++++++ .../lib/thinking_sphinx/deltas/delayed_delta.rb | 25 ++++++++ .../deltas/delayed_delta/delta_job.rb | 24 ++++++++ .../deltas/delayed_delta/flag_as_deleted_job.rb | 27 +++++++++ .../thinking_sphinx/deltas/delayed_delta/job.rb | 26 +++++++++ 6 files changed, 219 insertions(+) create mode 100644 vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/datetime_delta.rb create mode 100644 vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/default_delta.rb create mode 100644 vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta.rb create mode 100644 vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/delta_job.rb create mode 100644 vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/flag_as_deleted_job.rb create mode 100644 vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas/delayed_delta/job.rb (limited to 'vendor/plugins/thinking-sphinx/lib/thinking_sphinx/deltas') 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 @@ +module ThinkingSphinx + module Deltas + class DatetimeDelta < ThinkingSphinx::Deltas::DefaultDelta + attr_accessor :column, :threshold + + def initialize(index, options) + @index = index + @column = options.delete(:delta_column) || :updated_at + @threshold = options.delete(:threshold) || 1.day + end + + def index(model, instance = nil) + # do nothing + true + end + + def delayed_index(model) + config = ThinkingSphinx::Configuration.instance + rotate = ThinkingSphinx.sphinx_running? ? "--rotate" : "" + + output = `#{config.bin_path}indexer --config #{config.config_file} #{rotate} #{delta_index_name model}` + 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` + puts output unless ThinkingSphinx.suppress_delta_output? + + true + end + + def toggle(instance) + # do nothing + end + + def toggled(instance) + instance.send(@column) > @threshold.ago + end + + def reset_query(model) + nil + end + + def clause(model, toggled) + if toggled + "#{model.quoted_table_name}.#{@index.quote_column(@column.to_s)}" + + " > #{adapter.time_difference(@threshold)}" + else + nil + end + end + end + end +end 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 @@ +module ThinkingSphinx + module Deltas + class DefaultDelta + attr_accessor :column + + def initialize(index, options) + @index = index + @column = options.delete(:delta_column) || :delta + end + + def index(model, instance = nil) + return true unless ThinkingSphinx.updates_enabled? && + ThinkingSphinx.deltas_enabled? + return true if instance && !toggled(instance) + + config = ThinkingSphinx::Configuration.instance + client = Riddle::Client.new config.address, config.port + rotate = ThinkingSphinx.sphinx_running? ? "--rotate" : "" + + output = `#{config.bin_path}indexer --config #{config.config_file} #{rotate} #{delta_index_name model}` + puts(output) unless ThinkingSphinx.suppress_delta_output? + + client.update( + core_index_name(model), + ['sphinx_deleted'], + {instance.sphinx_document_id => [1]} + ) if instance && ThinkingSphinx.sphinx_running? && instance.in_both_indexes? + + true + end + + def toggle(instance) + instance.delta = true + end + + def toggled(instance) + instance.delta + end + + def reset_query(model) + "UPDATE #{model.quoted_table_name} SET " + + "#{@index.quote_column(@column.to_s)} = #{adapter.boolean(false)}" + end + + def clause(model, toggled) + "#{model.quoted_table_name}.#{@index.quote_column(@column.to_s)}" + + " = #{adapter.boolean(toggled)}" + end + + protected + + def core_index_name(model) + "#{model.source_of_sphinx_index.name.underscore.tr(':/\\', '_')}_core" + end + + def delta_index_name(model) + "#{model.source_of_sphinx_index.name.underscore.tr(':/\\', '_')}_delta" + end + + private + + def adapter + @adapter = @index.model.sphinx_database_adapter + end + end + end +end 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 @@ +require 'delayed/job' + +require 'thinking_sphinx/deltas/delayed_delta/delta_job' +require 'thinking_sphinx/deltas/delayed_delta/flag_as_deleted_job' +require 'thinking_sphinx/deltas/delayed_delta/job' + +module ThinkingSphinx + module Deltas + class DelayedDelta < ThinkingSphinx::Deltas::DefaultDelta + def index(model, instance = nil) + ThinkingSphinx::Deltas::Job.enqueue( + ThinkingSphinx::Deltas::DeltaJob.new(delta_index_name(model)) + ) + + Delayed::Job.enqueue( + ThinkingSphinx::Deltas::FlagAsDeletedJob.new( + core_index_name(model), instance.sphinx_document_id + ) + ) if instance + + true + end + end + end +end 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 @@ +module ThinkingSphinx + module Deltas + class DeltaJob + attr_accessor :index + + def initialize(index) + @index = index + end + + def perform + return true unless ThinkingSphinx.updates_enabled? && + ThinkingSphinx.deltas_enabled? + + config = ThinkingSphinx::Configuration.instance + client = Riddle::Client.new config.address, config.port + + output = `#{config.bin_path}indexer --config #{config.config_file} --rotate #{index}` + puts output unless ThinkingSphinx.suppress_delta_output? + + true + end + end + end +end 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 @@ +module ThinkingSphinx + module Deltas + class FlagAsDeletedJob + attr_accessor :index, :document_id + + def initialize(index, document_id) + @index, @document_id = index, document_id + end + + def perform + return true unless ThinkingSphinx.updates_enabled? + + config = ThinkingSphinx::Configuration.instance + client = Riddle::Client.new config.address, config.port + + client.update( + @index, + ['sphinx_deleted'], + {@document_id => [1]} + ) if ThinkingSphinx.sphinx_running? && + ThinkingSphinx::Search.search_for_id(@document_id, @index) + + true + end + end + end +end \ 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 @@ +module ThinkingSphinx + module Deltas + class Job < Delayed::Job + def self.enqueue(object, priority = 0) + super unless duplicates_exist(object) + end + + def self.cancel_thinking_sphinx_jobs + if connection.tables.include?("delayed_jobs") + delete_all("handler LIKE '--- !ruby/object:ThinkingSphinx::Deltas::%'") + end + end + + private + + def self.duplicates_exist(object) + count( + :conditions => { + :handler => object.to_yaml, + :locked_at => nil + } + ) > 0 + end + end + end +end -- cgit v1.3