Class: DBViewCTI::SQLGeneration::Migration::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/db_view_cti/sql_generation/migration/base.rb

Direct Known Subclasses

PostgreSQL

Instance Method Summary collapse

Constructor Details

#initialize(class_name, options = {}) ⇒ Base

Returns a new instance of Base.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/db_view_cti/sql_generation/migration/base.rb', line 6

def initialize(class_name, options = {})
  @options = options
  @derived_class = class_name.constantize
  @base_class    = @derived_class.superclass
  @base_class_table    = @base_class.table_name
  @derived_class_table = DBViewCTI::Names.table_name(@derived_class)
  # we assume the foreign key is in the derived class
  @base_class_key = 'id'
  @derived_class_key = DBViewCTI::Names.foreign_key(@base_class)
  # columns in base class
  @base_class_columns = @base_class.column_names
  if @base_class.cti_derived_class?
    # base class is itself derived, so we remove the foreign key it holds to the higher
    # level class
    foreign_key = DBViewCTI::Names.foreign_key(@base_class.superclass)
    @base_class_columns = @base_class_columns - [ foreign_key ]
  end
  # columns in derived class
  # first, reset table name (it might have been changed to the view name by cti_derived_class)
  temp = @derived_class.table_name
  @derived_class.table_name = @derived_class_table
  @derived_class.reset_column_information
  @derived_class_columns = @derived_class.column_names
  # put back old table name (needed since the class might be used again in a next migration)
  @derived_class.table_name = temp
  @derived_class.reset_column_information
  # names
  @view_name    = DBViewCTI::Names.view_name(@derived_class)
  @trigger_name = DBViewCTI::Names.trigger_name(@derived_class)
  # column arrays for triggers
  @insert_base_class_columns = @base_class_columns - ['id']
  @insert_derived_class_columns = @derived_class_columns - ['id', @derived_class_key]
  @update_base_class_columns = explicit_columns(@base_class_columns) + ['updated_at']
  @update_derived_class_columns = @derived_class_columns - [ @derived_class_key ]
end

Instance Method Details

#create_trigger_sqlObject

Raises:

  • (NotImplementedError)


64
65
66
67
# File 'lib/db_view_cti/sql_generation/migration/base.rb', line 64

def create_trigger_sql
  # to be implemented by derived classes
  raise NotImplementedError, "DBViewCTI: create_trigger_sql not implemented for this adapter."
end

#create_view_sqlObject



42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/db_view_cti/sql_generation/migration/base.rb', line 42

def create_view_sql
  base_columns = add_table_name( explicit_columns(@base_class_columns), @base_class_table).
                 join(', ')
  derived_columns = add_table_name( @derived_class_columns - ['id', @derived_class_key], @derived_class_table).
                    join(', ')
  query = <<-eos
    CREATE VIEW #{@view_name} AS
    SELECT #{@derived_class_table}.id, #{base_columns}, #{derived_columns}
    FROM #{@base_class_table}
    INNER JOIN #{@derived_class_table} 
    ON #{ add_table_name(@base_class_key, @base_class_table) } = #{ add_table_name(@derived_class_key, @derived_class_table) };
  eos
end

#drop_trigger_sqlObject

Raises:

  • (NotImplementedError)


69
70
71
72
# File 'lib/db_view_cti/sql_generation/migration/base.rb', line 69

def drop_trigger_sql
  # to be implemented by derived classes
  raise NotImplementedError, "DBViewCTI: drop_trigger_sql not implemented for this adapter."
end

#drop_view_sqlObject



56
57
58
# File 'lib/db_view_cti/sql_generation/migration/base.rb', line 56

def drop_view_sql
  "DROP VIEW #{@view_name};"
end

#view_exists_sqlObject

Raises:

  • (NotImplementedError)


60
61
62
# File 'lib/db_view_cti/sql_generation/migration/base.rb', line 60

def view_exists_sql
  raise NotImplementedError, "DBViewCTI: view_exists_sql not implemented for this adapter."
end