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