Class: Sqlglot::Query
- Inherits:
-
Object
- Object
- Sqlglot::Query
- Defined in:
- lib/sqlglot/query.rb
Overview
High-level query metadata extraction, inspired by Python's sql-metadata.
Parses SQL once via the Rust FFI, then walks the resulting AST Hash in pure Ruby to extract tables, columns, aliases, subqueries, CTEs, etc. All properties are lazy-evaluated and cached.
Instance Attribute Summary collapse
-
#sql ⇒ String
readonly
The original SQL string.
Instance Method Summary collapse
-
#ast ⇒ Hash
The parsed AST as a Ruby Hash.
-
#columns ⇒ Array<String>
All column references, alias-resolved and table-qualified where possible.
-
#columns_aliases ⇒ Hash{String => Array<String>}
Map of column alias => array of source columns.
-
#columns_aliases_dict ⇒ Hash{Symbol => Array<String>}
Which query clause each column alias appears in.
-
#columns_aliases_names ⇒ Array<String>
Just the alias names.
-
#columns_dict ⇒ Hash{Symbol => Array<String>}
Columns grouped by the clause they appear in.
-
#comments ⇒ Array<String>
SQL comments found in the AST.
-
#generalize ⇒ String
Generalized SQL with literals replaced by placeholders.
-
#initialize(sql, dialect: nil) ⇒ Query
constructor
A new instance of Query.
-
#limit_and_offset ⇒ Array(Integer, Integer)?
[limit, offset] or nil.
-
#output_columns ⇒ Array<String>
The column names (or aliases) that the SELECT would produce.
-
#query_type ⇒ Symbol
The type of SQL statement.
-
#subqueries ⇒ Hash{String => String}
Subquery alias => regenerated SQL body (from FROM / JOIN only).
-
#subqueries_names ⇒ Array<String>
Just the subquery alias names.
-
#tables ⇒ Array<String>
All table names referenced in the query, with CTE names excluded.
-
#tables_aliases ⇒ Hash{String => String}
Map of table alias => real table name.
-
#values ⇒ Array
Values from an INSERT statement.
-
#values_dict ⇒ Hash{String => Object}
Column => value pairs for INSERT.
-
#with_names ⇒ Array<String>
Names of CTE definitions.
-
#with_queries ⇒ Hash{String => String}
CTE name => regenerated SQL body.
Constructor Details
#initialize(sql, dialect: nil) ⇒ Query
Returns a new instance of Query.
27 28 29 30 31 |
# File 'lib/sqlglot/query.rb', line 27 def initialize(sql, dialect: nil) @sql = sql @dialect = dialect reset_cache! end |
Instance Attribute Details
#sql ⇒ String (readonly)
Returns the original SQL string.
34 35 36 |
# File 'lib/sqlglot/query.rb', line 34 def sql @sql end |
Instance Method Details
#ast ⇒ Hash
The parsed AST as a Ruby Hash.
40 41 42 |
# File 'lib/sqlglot/query.rb', line 40 def ast @ast ||= Sqlglot.parse(@sql, dialect: @dialect) end |
#columns ⇒ Array<String>
All column references, alias-resolved and table-qualified where possible.
78 79 80 |
# File 'lib/sqlglot/query.rb', line 78 def columns @columns ||= extract_all_columns end |
#columns_aliases ⇒ Hash{String => Array<String>}
Map of column alias => array of source columns.
103 104 105 |
# File 'lib/sqlglot/query.rb', line 103 def columns_aliases @columns_aliases ||= extract_columns_aliases end |
#columns_aliases_dict ⇒ Hash{Symbol => Array<String>}
Which query clause each column alias appears in.
117 118 119 |
# File 'lib/sqlglot/query.rb', line 117 def columns_aliases_dict @columns_aliases_dict ||= extract_columns_aliases_dict end |
#columns_aliases_names ⇒ Array<String>
Just the alias names.
110 111 112 |
# File 'lib/sqlglot/query.rb', line 110 def columns_aliases_names columns_aliases.keys end |
#columns_dict ⇒ Hash{Symbol => Array<String>}
Columns grouped by the clause they appear in.
87 88 89 |
# File 'lib/sqlglot/query.rb', line 87 def columns_dict @columns_dict ||= extract_columns_dict end |
#comments ⇒ Array<String>
SQL comments found in the AST.
182 183 184 |
# File 'lib/sqlglot/query.rb', line 182 def comments @comments ||= extract_comments end |
#generalize ⇒ String
Generalized SQL with literals replaced by placeholders. Useful for query fingerprinting.
192 193 194 |
# File 'lib/sqlglot/query.rb', line 192 def generalize @generalize ||= build_generalized end |
#limit_and_offset ⇒ Array(Integer, Integer)?
Returns [limit, offset] or nil.
156 157 158 |
# File 'lib/sqlglot/query.rb', line 156 def limit_and_offset @limit_and_offset ||= extract_limit_and_offset end |
#output_columns ⇒ Array<String>
The column names (or aliases) that the SELECT would produce.
94 95 96 |
# File 'lib/sqlglot/query.rb', line 94 def output_columns @output_columns ||= extract_output_columns end |
#query_type ⇒ Symbol
The type of SQL statement.
52 53 54 |
# File 'lib/sqlglot/query.rb', line 52 def query_type @query_type ||= detect_query_type end |
#subqueries ⇒ Hash{String => String}
Subquery alias => regenerated SQL body (from FROM / JOIN only).
142 143 144 |
# File 'lib/sqlglot/query.rb', line 142 def subqueries @subqueries ||= extract_subqueries end |
#subqueries_names ⇒ Array<String>
Just the subquery alias names.
149 150 151 |
# File 'lib/sqlglot/query.rb', line 149 def subqueries_names subqueries.keys end |
#tables ⇒ Array<String>
All table names referenced in the query, with CTE names excluded.
61 62 63 |
# File 'lib/sqlglot/query.rb', line 61 def tables @tables ||= extract_tables end |
#tables_aliases ⇒ Hash{String => String}
Map of table alias => real table name.
68 69 70 |
# File 'lib/sqlglot/query.rb', line 68 def tables_aliases @tables_aliases ||= extract_tables_aliases end |
#values ⇒ Array
Values from an INSERT statement.
165 166 167 |
# File 'lib/sqlglot/query.rb', line 165 def values @values ||= extract_values end |
#values_dict ⇒ Hash{String => Object}
Column => value pairs for INSERT. Auto-generates column_N names if the INSERT has no explicit column list.
173 174 175 |
# File 'lib/sqlglot/query.rb', line 173 def values_dict @values_dict ||= extract_values_dict end |
#with_names ⇒ Array<String>
Names of CTE definitions.
126 127 128 |
# File 'lib/sqlglot/query.rb', line 126 def with_names @with_names ||= extract_with_names end |
#with_queries ⇒ Hash{String => String}
CTE name => regenerated SQL body.
133 134 135 |
# File 'lib/sqlglot/query.rb', line 133 def with_queries @with_queries ||= extract_with_queries end |