JingDas created CALCITE-5881:
--------------------------------

             Summary: Support to get foreign keys metadata in RelMetadataQuery
                 Key: CALCITE-5881
                 URL: https://issues.apache.org/jira/browse/CALCITE-5881
             Project: Calcite
          Issue Type: New Feature
            Reporter: JingDas
            Assignee: JingDas


We can get constraints by RelOptTable#getReferentialConstraints method, but 
maybe can't get appropriate constraints at top relNode.
For example:

SQL:
{code:java}
SELECT DEPT.name, emp_agg.deptno, emp_agg.ename, DEPT.deptno
FROM DEPT
RIGHT JOIN
(SELECT COUNT(sal), deptno, ename FROM EMP GROUP BY deptno, ename) emp_agg
ON DEPT.deptno = emp_agg.deptno
WHERE emp_agg.ename = 'job'{code}
The relNode is:
{code:java}
LogicalProject(NAME=[$1], DEPTNO=[$3], ENAME=[$4], DEPTNO0=[$0])
  LogicalFilter(condition=[=($4, 'job')])
    LogicalJoin(condition=[=($0, $3)], joinType=[right])
      LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
      LogicalProject(EXPR$0=[$2], DEPTNO=[$0], ENAME=[$1])
        LogicalAggregate(group=[{0, 1}], EXPR$0=[COUNT($2)])
          LogicalProject(DEPTNO=[$7], ENAME=[$1], SAL=[$5])
            LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]]){code}
where the foreign key is the DEPTNO column of CATALOG.SALES.EMP table,
reference the DEPTNO unique column of CATALOG.SALES.DEPT table.

When we want to get foreign keys metadata on `LogicalJoin` or top 
`LogicalProject`, There is no such method currently, it seems that we should 
trace the field column origin to get the foreign key and corresponding unique 
key.

 

The final result of this feature is something likely as following:

When we want to get foreign keys metadata on `LogicalJoin`, the `LogicalJoin` 
rowType is
{code:java}
RecordType(INTEGER DEPTNO, VARCHAR(10) NAME, BIGINT EXPR$0, INTEGER DEPTNO0, 
VARCHAR(20) ENAME).{code}
We expect the foreign keys metadata:
{code:java}
foreignColumns bitset is {3}
uniqueColumns bitset is {0}{code}
When we want to get foreign keys metadata on top `LogicalProject`, the 
`LogicalProject` rowType is
{code:java}
RecordType(VARCHAR(10) NAME, INTEGER DEPTNO, VARCHAR(20) ENAME, INTEGER 
DEPTNO0).{code}
We expect the foreigns key metadata:
{code:java}
foreignColumns bitset is {1}
uniqueColumns bitset is {3}{code}
All the foreign or unique columns is 0 based index.


Foreign keys metadata is very useful in many optimize scenes. Such as it can be 
used in join eliminate when join type is inner join and some other star schema 
query optimize.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to