class Hayfork::Triggers

Attributes

_triggers[R]
haystack[R]

Public Class Methods

new(haystack) click to toggle source
# File lib/hayfork/triggers.rb, line 5
def initialize(haystack)
  @haystack = haystack
  @_triggers = []
end

Public Instance Methods

<<(trigger) click to toggle source
# File lib/hayfork/triggers.rb, line 10
def <<(trigger)
  _triggers << trigger
end
create() click to toggle source
# File lib/hayfork/triggers.rb, line 14
def create
  _triggers.map { |args| psql_create_triggers_for(*args) }.join
end
drop() click to toggle source
# File lib/hayfork/triggers.rb, line 18
def drop
  _triggers.map { |model, _, options| psql_drop_triggers_for(model, options) }.join
end
rebuild() click to toggle source
# File lib/hayfork/triggers.rb, line 30
def rebuild
  ([truncate] + _triggers.map { |args| psql_inserts_for(*args) }).join
end
replace() click to toggle source
# File lib/hayfork/triggers.rb, line 22
def replace
  [drop, create].join
end
truncate() click to toggle source
# File lib/hayfork/triggers.rb, line 26
def truncate
  "TRUNCATE #{haystack.table_name};\n"
end

Private Instance Methods

function_name(model, options) click to toggle source
# File lib/hayfork/triggers.rb, line 71
def function_name(model, options)
  options.fetch(:name, "maintain_#{model.table_name}_in_#{haystack.table_name}")
end
psql_create_triggers_for(model, statements, options) click to toggle source
# File lib/hayfork/triggers.rb, line 37
    def psql_create_triggers_for(model, statements, options)
      name = function_name(model, options)
      <<~SQL
        CREATE FUNCTION #{name}() RETURNS trigger AS $$
        BEGIN
          IF TG_OP = 'DELETE' THEN
            #{statements.to_delete_sql}
            RETURN OLD;
          ELSIF TG_OP = 'UPDATE' THEN
            #{statements.to_update_sql}
            RETURN NEW;
          ELSIF TG_OP = 'INSERT' THEN
            #{statements.to_insert_sql}
            RETURN NEW;
          END IF;
          RETURN NULL; -- result is ignored since this is an AFTER trigger
        END;
        $$ LANGUAGE plpgsql;
        CREATE TRIGGER #{name}_trigger BEFORE INSERT OR UPDATE OR DELETE ON #{model.table_name}
        FOR EACH ROW EXECUTE PROCEDURE #{name}();
      SQL
    end
psql_drop_triggers_for(model, options) click to toggle source
# File lib/hayfork/triggers.rb, line 64
    def psql_drop_triggers_for(model, options)
      name = function_name(model, options)
      <<~SQL
        DROP FUNCTION IF EXISTS #{name}() CASCADE;
      SQL
    end
psql_inserts_for(model, statements, options) click to toggle source
# File lib/hayfork/triggers.rb, line 60
def psql_inserts_for(model, statements, options)
  "#{statements.to_insert_sql(from: false)}\n" if options.fetch(:rebuild, true)
end