68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
# File 'lib/upkeep/active_record_query.rb', line 68
def analyze(relation)
sql = relation.to_sql
dialect = dialect_for(relation.klass.connection)
statement = SQLGlot.parse(sql, dialect: dialect)
schema = Schema.for(relation.klass.connection, statement)
mapping_schema = SQLGlot::MappingSchema.new(schema, dialect: dialect)
qualified_statement = SQLGlot.qualify_columns(statement, mapping_schema)
dependency_statement = SQLDependencyAnalysis.preserve_wildcard_projections(
statement,
qualified_statement
)
dependency = SQLDependencyAnalysis.analyze(
dependency_statement,
schema: schema,
scope: SQLGlot.build_scope(dependency_statement)
)
Result.new(
primary_table: relation.klass.table_name,
table_columns: with_primary_key(
dependency.table_columns,
relation.klass.table_name,
relation.klass.primary_key
),
coverage: :columns,
sql: sql,
primary_key: relation.klass.primary_key,
appendable: dependency.appendable?,
limit_value: dependency.limit_value,
predicates: dependency.predicates
)
rescue ActiveRecord::StatementInvalid,
SQLGlot::Error,
SQLDependencyAnalysis::UnsupportedError,
KeyError => error
raise OpaqueRelationError.new(
relation,
reasons: [
"#{error.class}: #{error.message}",
"dialect: #{safe_dialect(relation)}",
"SQLGlot: #{SQLGlot.version}"
]
)
end
|