class PostJson::DynamicIndex
Public Class Methods
destroy_index(model_settings_id, selector)
click to toggle source
# File lib/post_json/dynamic_index.rb, line 24 def destroy_index(model_settings_id, selector) where(model_settings_id: model_settings_id, selector: selector).destroy_all.present? end
ensure_index(model_settings_id, *selectors)
click to toggle source
# File lib/post_json/dynamic_index.rb, line 6 def ensure_index(model_settings_id, *selectors) selectors = flatten_arguments(selectors) if selectors.length == 0 [] else existing_selectors = where(model_settings_id: model_settings_id).pluck(:selector) new_selectors = selectors - existing_selectors new_selectors.map do |selector| create(model_settings_id: model_settings_id, selector: selector) end end end
indexed_selectors(model_settings_id)
click to toggle source
# File lib/post_json/dynamic_index.rb, line 19 def indexed_selectors(model_settings_id) # distinct is needed since race condition can cause 1+ records to own the same index where(model_settings_id: model_settings_id).distinct.pluck(:selector) end
Public Instance Methods
index_name()
click to toggle source
# File lib/post_json/dynamic_index.rb, line 37 def index_name @index_name ||= unless @index_name prefix = "dyn_#{model_settings_id.gsub('-', '')}_" if 63 < prefix.length + selector.length digest = Digest::MD5.hexdigest(selector) "#{prefix}#{digest}"[0..62] else "#{prefix}#{selector.gsub('.', '_')}" end end end
inline_create_index_procedure()
click to toggle source
# File lib/post_json/dynamic_index.rb, line 63 def inline_create_index_procedure schemas = ActiveRecord::Base.connection.schema_search_path.gsub(/\s+/, '').split(',') current_schema = if schemas[0] == "\"$user\"" && 1 < schemas.length schemas[1] else schemas[0] end "DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = '#{index_name}' AND n.nspname = '#{current_schema}' -- 'public' by default ) THEN CREATE INDEX #{index_name} ON #{current_schema}.#{Base.table_name} (json_selector('#{selector}', __doc__body)); END IF; END$$;" end