[ 
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)

Reply via email to