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.
25 26 27 28 29 |
# File 'lib/sqlglot/query.rb', line 25 def initialize(sql, dialect: nil) @sql = sql @dialect = dialect reset_cache! end |
Instance Attribute Details
#sql ⇒ String (readonly)
Returns the original SQL string.
32 33 34 |
# File 'lib/sqlglot/query.rb', line 32 def sql @sql end |
Instance Method Details
#ast ⇒ Hash
The parsed AST as a Ruby Hash.
38 39 40 |
# File 'lib/sqlglot/query.rb', line 38 def ast @ast ||= Sqlglot.parse(@sql, dialect: @dialect) end |
#columns ⇒ Array<String>
All column references, alias-resolved and table-qualified where possible.
76 77 78 |
# File 'lib/sqlglot/query.rb', line 76 def columns @columns ||= extract_all_columns end |
#columns_aliases ⇒ Hash{String => Array<String>}
Map of column alias => array of source columns.
101 102 103 |
# File 'lib/sqlglot/query.rb', line 101 def columns_aliases @columns_aliases ||= extract_columns_aliases end |
#columns_aliases_dict ⇒ Hash{Symbol => Array<String>}
Which query clause each column alias appears in.
115 116 117 |
# File 'lib/sqlglot/query.rb', line 115 def columns_aliases_dict @columns_aliases_dict ||= extract_columns_aliases_dict end |
#columns_aliases_names ⇒ Array<String>
Just the alias names.
108 109 110 |
# File 'lib/sqlglot/query.rb', line 108 def columns_aliases_names columns_aliases.keys end |
#columns_dict ⇒ Hash{Symbol => Array<String>}
Columns grouped by the clause they appear in.
85 86 87 |
# File 'lib/sqlglot/query.rb', line 85 def columns_dict @columns_dict ||= extract_columns_dict end |
#comments ⇒ Array<String>
SQL comments found in the AST.
180 181 182 |
# File 'lib/sqlglot/query.rb', line 180 def comments @comments ||= extract_comments end |
#generalize ⇒ String
Generalized SQL with literals replaced by placeholders. Useful for query fingerprinting.
190 191 192 |
# File 'lib/sqlglot/query.rb', line 190 def generalize @generalize ||= build_generalized end |
#limit_and_offset ⇒ Array(Integer, Integer)?
Returns [limit, offset] or nil.
154 155 156 |
# File 'lib/sqlglot/query.rb', line 154 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.
92 93 94 |
# File 'lib/sqlglot/query.rb', line 92 def output_columns @output_columns ||= extract_output_columns end |
#query_type ⇒ Symbol
The type of SQL statement.
50 51 52 |
# File 'lib/sqlglot/query.rb', line 50 def query_type @query_type ||= detect_query_type end |
#subqueries ⇒ Hash{String => String}
Subquery alias => regenerated SQL body (from FROM / JOIN only).
140 141 142 |
# File 'lib/sqlglot/query.rb', line 140 def subqueries @subqueries ||= extract_subqueries end |
#subqueries_names ⇒ Array<String>
Just the subquery alias names.
147 148 149 |
# File 'lib/sqlglot/query.rb', line 147 def subqueries_names subqueries.keys end |
#tables ⇒ Array<String>
All table names referenced in the query, with CTE names excluded.
59 60 61 |
# File 'lib/sqlglot/query.rb', line 59 def tables @tables ||= extract_tables end |
#tables_aliases ⇒ Hash{String => String}
Map of table alias => real table name.
66 67 68 |
# File 'lib/sqlglot/query.rb', line 66 def tables_aliases @tables_aliases ||= extract_tables_aliases end |
#values ⇒ Array
Values from an INSERT statement.
163 164 165 |
# File 'lib/sqlglot/query.rb', line 163 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.
171 172 173 |
# File 'lib/sqlglot/query.rb', line 171 def values_dict @values_dict ||= extract_values_dict end |
#with_names ⇒ Array<String>
Names of CTE definitions.
124 125 126 |
# File 'lib/sqlglot/query.rb', line 124 def with_names @with_names ||= extract_with_names end |
#with_queries ⇒ Hash{String => String}
CTE name => regenerated SQL body.
131 132 133 |
# File 'lib/sqlglot/query.rb', line 131 def with_queries @with_queries ||= extract_with_queries end |