module AssociateJsonb::ConnectionAdapters::SchemaCreation

Private Instance Methods

add_column_options!(sql, opts) click to toggle source
Calls superclass method
# File lib/associate_jsonb/connection_adapters/schema_creation.rb, line 156
def add_column_options!(sql, opts)
  super

  if constraint_opts = opts[:constraint]
    constraint_opts = { value: constraint_opts } unless constraint_opts.is_a?(Hash)
    sql << " #{accept(ConstraintDefinition.new(**constraint_opts))}"
  end

  sql
end
visit_AddConstraint(o) click to toggle source
# File lib/associate_jsonb/connection_adapters/schema_creation.rb, line 60
def visit_AddConstraint(o)
  sql = +""
  if o.force?
    sql << visit_DropConstraint(o)
    sql << " "
  end
  sql << "ADD #{accept(o)}"
end
visit_AddJsonbForeignKeyFunction(*) click to toggle source
# File lib/associate_jsonb/connection_adapters/schema_creation.rb, line 76
        def visit_AddJsonbForeignKeyFunction(*)
          <<~SQL
            CREATE OR REPLACE FUNCTION jsonb_foreign_key
              (
                table_name text,
                foreign_key text,
                store jsonb,
                key text,
                type text default 'numeric',
                nullable boolean default TRUE
              )
            RETURNS BOOLEAN AS
            $BODY$
            DECLARE
              does_exist BOOLEAN;
            BEGIN
              IF store->>key IS NULL
              THEN
                return nullable;
              END IF;

              IF store->>key = ''
              THEN
                return FALSE;
              END IF;

              EXECUTE FORMAT('SELECT EXISTS (SELECT 1 FROM %1$I WHERE %1$I.%2$I = CAST($1 AS ' || type || '))', table_name, foreign_key)
              INTO does_exist
              USING store->>key;

              RETURN does_exist;
            END;
            $BODY$
            LANGUAGE plpgsql;

          SQL
        end
visit_AddJsonbNestedSetFunction(*) click to toggle source
# File lib/associate_jsonb/connection_adapters/schema_creation.rb, line 114
        def visit_AddJsonbNestedSetFunction(*)
          <<~SQL
            CREATE OR REPLACE FUNCTION jsonb_nested_set
              (
                target jsonb,
                path text[],
                new_value jsonb
              )
            RETURNS jsonb AS
            $BODY$
            DECLARE
              new_json jsonb := '{}'::jsonb;
              does_exist BOOLEAN;
              current_path text[];
              key text;
            BEGIN
              IF target #> path IS NOT NULL
              THEN
                return jsonb_set(target, path, new_value);
              ELSE
                new_json := target;

                IF array_length(path, 1) > 1
                THEN
                  FOREACH key IN ARRAY path[:(array_length(path, 1) - 1)]
                  LOOP
                    current_path := array_append(current_path, key);
                    IF new_json #> current_path IS NULL
                    THEN
                      new_json := jsonb_set(new_json, current_path, '{}'::jsonb, TRUE);
                    END IF;
                  END LOOP;
                END IF;

                return jsonb_set(new_json, path, new_value, TRUE);
              END IF;
            END;
            $BODY$
            LANGUAGE plpgsql;
          SQL
        end
visit_AlterTable(o) click to toggle source
Calls superclass method
# File lib/associate_jsonb/connection_adapters/schema_creation.rb, line 8
def visit_AlterTable(o)
  sql = super
  sql << o.constraint_adds.map {|ct| visit_AddConstraint ct }.join(" ")
  sql << o.constraint_drops.map {|ct| visit_DropConstraint ct }.join(" ")
  sql
end
visit_ConstraintDeferral(o) click to toggle source
# File lib/associate_jsonb/connection_adapters/schema_creation.rb, line 38
def visit_ConstraintDeferral(o)
  return "" unless o.deferrable_default?
  return "NOT DEFERRABLE" unless o.deferrable?
  initial =
    case o.deferrable
    when :immediate
      "IMMEDIATE"
    else
      "DEFERRED"
    end
  "DEFERRABLE INITIALLY #{initial}"
end
visit_ConstraintDefinition(o) click to toggle source
# File lib/associate_jsonb/connection_adapters/schema_creation.rb, line 51
        def visit_ConstraintDefinition(o)
          +<<-SQL.squish
            CONSTRAINT #{quote_column_name(o.name)}
            CHECK (#{o.value})
              #{visit_ConstraintDeferral(o)}
              #{o.not_valid? ? "NOT VALID" : ''}
          SQL
        end
visit_DropConstraint(o, if_exists: false) click to toggle source
# File lib/associate_jsonb/connection_adapters/schema_creation.rb, line 69
        def visit_DropConstraint(o, if_exists: false)
          +<<-SQL.squish
            DROP CONSTRAINT #{quote_column_name(o.name)}
              #{o.force? ? "IF EXISTS" : ""}
          SQL
        end
visit_TableDefinition(o) click to toggle source
# File lib/associate_jsonb/connection_adapters/schema_creation.rb, line 15
def visit_TableDefinition(o)
  create_sql = +"CREATE#{table_modifier_in_create(o)} TABLE "
  create_sql << "IF NOT EXISTS " if o.if_not_exists
  create_sql << "#{quote_table_name(o.name)} "

  statements = o.columns.map { |c| accept c }
  statements << accept(o.primary_keys) if o.primary_keys

  if supports_indexes_in_create?
    statements.concat(o.indexes.map { |column_name, options| index_in_create(o.name, column_name, options) })
  end

  if supports_foreign_keys?
    statements.concat(o.foreign_keys.map { |to_table, options| foreign_key_in_create(o.name, to_table, options) })
    # statements.concat(o.constraints.map { |ct| visit_ConstraintDefinition(ct) })
  end

  create_sql << "(#{statements.join(', ')})" if statements.present?
  add_table_options!(create_sql, table_options(o))
  create_sql << " AS #{to_sql(o.as)}" if o.as
  create_sql
end