Class: RailsVisualizer::Schema::Cache

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_visualizer/schema/cache.rb

Overview

Bulk-loads all column and index metadata with minimal DB round-trips. PostgreSQL: 2 parallel queries (one for columns, one for indexes). Other adapters: per-table fallback (still cached per table).

Defined Under Namespace

Classes: Col, Idx

Constant Summary collapse

PG_TYPE_MAP =
{
  'int2' => 'integer', 'int4' => 'integer', 'int8' => 'integer',
  'float4' => 'float', 'float8' => 'float',
  'numeric' => 'decimal', 'money' => 'decimal',
  'bool' => 'boolean',
  'varchar' => 'string', 'bpchar' => 'string', 'text' => 'text',
  'bytea' => 'binary',
  'date' => 'date',
  'timestamp' => 'datetime', 'timestamptz' => 'datetime',
  'time' => 'time', 'timetz' => 'time',
  'json' => 'json', 'jsonb' => 'jsonb',
  'uuid' => 'uuid',
  'inet' => 'inet', 'cidr' => 'cidr',
  'macaddr' => 'string',
  'xml' => 'xml',
  'hstore' => 'hstore',
  'ltree' => 'ltree',
  'interval' => 'interval',
  '_int4' => 'integer', '_int8' => 'integer',
  '_float8' => 'float',
  '_varchar' => 'string', '_text' => 'string'
}.freeze

Instance Method Summary collapse

Constructor Details

#initializeCache

Returns a new instance of Cache.



35
36
37
38
39
40
# File 'lib/rails_visualizer/schema/cache.rb', line 35

def initialize
  @columns      = {}
  @indexes      = {}
  @index_maps   = {}
  @primary_keys = {}
end

Instance Method Details

#columns_for(table_name) ⇒ Object



46
47
48
# File 'lib/rails_visualizer/schema/cache.rb', line 46

def columns_for(table_name)
  @columns.fetch(table_name.to_s, [])
end

#index_map_for(table_name) ⇒ Object



54
55
56
57
# File 'lib/rails_visualizer/schema/cache.rb', line 54

def index_map_for(table_name)
  tn = table_name.to_s
  @index_maps[tn] ||= build_index_map(tn)
end

#indexes_for(table_name) ⇒ Object



50
51
52
# File 'lib/rails_visualizer/schema/cache.rb', line 50

def indexes_for(table_name)
  @indexes.fetch(table_name.to_s, [])
end

#preload_for(table_names) ⇒ Object



63
64
65
66
67
68
69
70
71
72
# File 'lib/rails_visualizer/schema/cache.rb', line 63

def preload_for(table_names)
  needed = table_names.select { |t| table_exists?(t) }
  return if needed.empty?

  if postgresql?
    parallel_bulk_load_pg(needed)
  else
    fallback_preload(needed)
  end
end

#primary_key_for(table_name) ⇒ Object



59
60
61
# File 'lib/rails_visualizer/schema/cache.rb', line 59

def primary_key_for(table_name)
  @primary_keys.fetch(table_name.to_s, 'id')
end

#table_exists?(table_name) ⇒ Boolean

Returns:

  • (Boolean)


42
43
44
# File 'lib/rails_visualizer/schema/cache.rb', line 42

def table_exists?(table_name)
  tables.include?(table_name.to_s)
end