Skip to content

Commit

Permalink
more work on design docs for SQM and SQL AST
Browse files Browse the repository at this point in the history
  • Loading branch information
sebersole committed Nov 25, 2019
1 parent 0c6c8b4 commit 293fc0f
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 12 deletions.
6 changes: 3 additions & 3 deletions design/sql-ast.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

Ultimately our goal here is to have a `JdbcOperation` object to be executed. Generally, that would look like this:

````
[source]
----
final SelectStatement sqlAst = ...;
final JdbcServices jdbcServices = sessionFactory.getJdbcServices();
Expand All @@ -19,8 +20,7 @@ Ultimately our goal here is to have a `JdbcOperation` object to be executed. Ge
jdbcParameterBindings,
...
);

````
----


== The Tree
Expand Down
36 changes: 27 additions & 9 deletions design/sqm.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@

The Semantic Query Model (SQM) is Hibernate's representation of an HQL or Criteria query's semantic (meaning). This
representation is modeled as an "abstract syntax tree" (AST) - meaning it is a structured tree of nodes where each node
represrents an atomic piece of the query. E.g. `SqmSelectClause` represents the query's select clause as you might
imagine. That `SqmSelectClause` is ultimately a collection of one or more `SqmSelection` references representing the
individual selections to be returned from the query (called the domain results).
represents an atomic piece of the query. E.g. `SqmSelectClause` represents the query's select clause.
`SqmSelectClause` is ultimately a collection of one or more `SqmSelection` references representing the individual
selections to be returned from the query (called the domain results). Etc

All of these details are handled by the `QuerySqmImpl` implementation of `Query`. This is what Hibernate
uses for both HQL and Criteria queries.


== The Tree

Expand All @@ -18,20 +22,34 @@ See the `design/type-system-domain.adoc` design doc. For details about this dom
The tree model is defined in the package `org.hibernate.query.sqm.tree`


== Building an SQM

== Building an SQM - HQL

=== HQL
`org.hibernate.query.hql.HqlTranslator#translate`


=== Criteria
== Building an SQM - Criteria

`org.hibernate.query.sqm.internal.SqmCriteriaNodeBuilder`


== Translating an SQM

Generic support for walking over the SQM tree via the `org.hibernate.query.sqm.SemanticQueryWalker` contract.

More specialized support specifically for translating the SQM into a SQL AST is also defined by
`org.hibernate.query.sqm.sql.SqmToSqlAstConverter`. The document `design/sql-ast.adoc` for details about the SQL AST,
including its execution.
`org.hibernate.query.sqm.sql.SqmToSqlAstConverter`.

[source]
----
final SessionFactoryImplementor sessionFactory = ...;
final QueryEngine queryEngine = sessionFactory.getQueryEngine();
final SqmTranslatorFactory sqmTranslatorFactory = queryEngine.getSqmTranslatorFactory();
final SqmSelectTranslator sqmConverter = sqmTranslatorFactory.createSelectTranslator( ... );
final SqmSelectTranslation interpretation = sqmConverter.translate( sqm );
----


See the document `design/sql-ast.adoc` for details about the SQL AST, including its execution.

0 comments on commit 293fc0f

Please sign in to comment.