[
https://issues.apache.org/jira/browse/CALCITE-6574?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17881113#comment-17881113
]
James Starr commented on CALCITE-6574:
--------------------------------------
I have renamed SqlQueryScopes to ScopeMap as requested. I added methods
getScopeMap to AbstractNamespace and ListScope to reduce the number of times
`validator.getScopeMap` form 40 to 18.
I brought this cyclic dependency in my initial email that namespaces required
the SqlValidatorImpl. Currently, AbstractNamespace, ListScope, and EmptyScope
depend on SqlValidatorImpl. You can not populate the scopes and namespace
before constructing the SqlValidatorImpl because of this. Decoupling this
would be allot of work and well beyond the scope I have discussed.
Furthermore, requiring the SqlValidatorImpl to populate the scopes/namespace is
counter productive to the goal of populating the ScopeMap before the
construction of the SqlValidatorImpl. To rework the scope and namespace api to
not depend on the SqlValidatorImpl, the logic for resolving types, and
validating would likely need to be shifted out of them into a validation step
or scope/namespace step. The namespace and scope interfaces responsibility
span multiple phases of converting a sql node to a rel node.
I agree that adding getXXXScope adds a small bit of verbosity on the calling
side, but splatting out a large interface to just immediately delegate it to
another objects is also verbose. If splatting out large interfaces is such a
great win, then why don't we splat out the catalog into the validator?
The scopes and namespace currently use the validator api for:
* Resolving scopes and namespaces
* Creating Exceptions
* Type Lookup
* Inverting back to the validator.validate*
* Accessing the catalog reader, TypeFactory, Validator Config
* Propagating the SqlValidatorImpl to other things
* Exposing helper functions, such as isAggregate
* And more that I likely missed
Logically, the pipeline looks like:
```
String sqlString
SqlNode sqlNode = parse(sqlString)
ScopeMap scopeMap = populateScopes(sqlNodes);
TypeMap typeMap = validateTypes(sqlNodes, scopesMap);
RelNode relNode = convert(sqlNodes, scopeMap, typeMap);
```
Currently, populating the scope map and type map are tightly coupled. Their is
also an implicit context containing: type factory, exception factories, the
catalog, etc that is being glossed over with this.
[~julianhyde] Please let me know if this will work or if you want other
changes, otherwise I will abandon this effort as it is out of scope of what I
initially talked about.
> Add SqlQueryScopes
> ------------------
>
> Key: CALCITE-6574
> URL: https://issues.apache.org/jira/browse/CALCITE-6574
> Project: Calcite
> Issue Type: Sub-task
> Reporter: James Starr
> Assignee: James Starr
> Priority: Major
> Labels: pull-request-available
>
> See parent description.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)