Skip to content

Commit

Permalink
Refactor fetch_table_names in redshift adapter
Browse files Browse the repository at this point in the history
  • Loading branch information
ragi256 committed Mar 29, 2019
1 parent bc231b3 commit ddd50ca
Showing 1 changed file with 20 additions and 9 deletions.
29 changes: 20 additions & 9 deletions app/models/data_source_adapters/redshift_adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,23 @@
module DataSourceAdapters
class RedshiftAdapter < StandardAdapter
def fetch_table_names
@table_names = source_base_class.connection.query(<<~SQL, 'SCHEMA')
SELECT schemaname, tablename
query_result = source_base_class.connection.query(<<~SQL, 'SCHEMA')
SELECT table_schema, table_name, table_type
FROM (
SELECT schemaname, tablename FROM pg_tables WHERE schemaname = ANY (current_schemas(false))
SELECT table_schema, table_name, table_type FROM svv_tables WHERE table_schema = ANY (current_schemas(false)) or table_type = 'EXTERNAL TABLE'
UNION
SELECT schemaname, viewname AS tablename FROM pg_views WHERE schemaname = ANY (current_schemas(false))
SELECT schemaname as table_schema, viewname AS table_name, 'VIEW' FROM pg_views WHERE schemaname = ANY (current_schemas(false))
) tables
ORDER BY schemaname, tablename;
ORDER BY table_schema, table_name;
SQL

@external_table_names = source_base_class.connection.query(<<~SQL, 'SCHEMA')
SELECT schemaname, tablename FROM svv_external_tables ORDER BY schemaname, tablename;
SQL
table_groups = group_by_table_type(query_result)

@base_table_names = table_groups['BASE TABLE'] || []
@external_table_names = table_groups['EXTERNAL TABLE'] || []
@view_names = table_groups['VIEW'] || []

@table_names + @external_table_names
(@base_table_names + @external_table_names + @view_names).uniq
rescue ActiveRecord::ActiveRecordError, PG::Error => e
raise DataSource::ConnectionBad.new(e)
end
Expand Down Expand Up @@ -47,7 +49,16 @@ def fetch_count(table)

private

def group_by_table_type(records)
records.group_by { |r| r[2] }.map { |k, v| [k, reject_table_type(v)] }.to_h
end

def reject_table_type(records)
records.map { |r| [r[0], r[1]] }
end

def spectrum?(table)
raise "@external_table_names must be defined, execute fetch_table befor spectrum?" unless instance_variable_defined?(:@external_table_names)
@external_table_names.include?(table.full_table_name.split('.'))
end
end
Expand Down

0 comments on commit ddd50ca

Please sign in to comment.