You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "jamie12221 (Jira)" <ji...@apache.org> on 2019/11/05 06:08:00 UTC

[jira] [Comment Edited] (CALCITE-3470) a RelOptRule-based text DSL

    [ https://issues.apache.org/jira/browse/CALCITE-3470?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16967260#comment-16967260 ] 

jamie12221 edited comment on CALCITE-3470 at 11/5/19 6:07 AM:
--------------------------------------------------------------

Thank you for your patience.

I'm actually writing a DSL based on RelBuilder but not based on RelOptRule (not originally intended to optimize relational expressions). A friend told me about Optgen DSL. So I thought that Calcite's development team might be doing something similar.Or everyone is going to do better together. So I sent an issue. (The following is another topic.) For example, calcite.piglet is also a DSL, which was recently updated, but not designed for Calcite's optimizer.

My DSL design is divided into two parts. The first part is analysis, which is simple. Lexer is SQL Lexer. The syntax is a mixture of infix expressions and function calls.
 like this:

 

 
{code:java}
join (travelrecord as t,address as a, t.id = a.id)
.filter (t.id = 1 or a.id = 2)
.map(t.id,t.user_id)
{code}
 

Then Method chaining and name will be converted into three possible ways:
{code:java}
MAP(FILTER(JOIN(AS(travelrecord,t),AS(address,a),EQ(DOT(t,id),DOT(a,id))),OR(EQ(DOT(t,id),1),EQ(DOT(a,id),2))),DOT(t,id),DOT(t,user_id))
{code}
{code:java}
MAP(FILTER(JOIN(AS(travelrecord,t),AS(address,a),EQ(t.id,a.id)),OR(EQ(t.id,1),EQ(a.id,2))),t.id,t.user_id)

{code}
Based on the above, the DOT(t, id) form can be replaced by a string or some related object, such as ColumnObject\{db1.travelrecord.id}

 
{code:java}
MAP(FILTER(JOIN(AS(TABLE("travelrecord"),t),AS(TABLE("address"),"a"),EQ(PROPERTY("t","id"),(PROPERTY("a"."id")),OR(EQ(PROPERTY("t","id"),1),EQ(PROPERTY("a","id"),2))),PROPERTY("t","id"),PROPERTY("t","user_id"))
{code}
 

 

The second part of the implementation is to use map, filter these 'extension functions', they establish AST, traverse AST when calling RelBuilder function to achieve the execution plan construction (I am referring to Apache Pig to do this)

What I described above may not be a AST conversion syntax (distinguishing matching patterns, extracting AstNode,build new patterns), but may be a design like linq's RelBuilder.

 

My project, it can't even run, is a toy.I am still developing.

[syntax conversion|https://github.com/junwen12221/describer/blob/master/src/test/java/cn/lightfish/describer/BuilderTest.java]

[bulid ast|https://github.com/junwen12221/describer/blob/master/src/main/java/cn/lightfish/wu/Ast.java]

[with relbuilder|https://github.com/junwen12221/describer/blob/master/src/main/java/cn/lightfish/wu/AstTest.java]



was (Author: jamie12221):
Thank you for your patience.

I'm actually writing a DSL based on RelBuilder but not based on RelOptRule (not originally intended to optimize relational expressions). A friend told me about Optgen DSL. So I thought that Calcite's development team might be doing something similar.Or everyone is going to do better together. So I sent an issue. (The following is another topic.) For example, calcite.piglet is also a DSL, which was recently updated, but not designed for Calcite's optimizer.

My DSL design is divided into two parts. The first part is analysis, which is simple. Lexer is SQL Lexer. The syntax is a mixture of infix expressions and function calls.
 like this:

 

 
{code:java}
join (travelrecord as t,address as a, t.id = a.id)
.filter (t.id = 1 or a.id = 2)
.map(t.id,t.user_id)
{code}
 

Then Method chaining and name will be converted into three possible ways:
{code:java}
MAP(FILTER(JOIN(AS(travelrecord,t),AS(address,a),EQ(DOT(t,id),DOT(a,id))),OR(EQ(DOT(t,id),1),EQ(DOT(a,id),2))),DOT(t,id),DOT(t,user_id))
{code}
{code:java}
MAP(FILTER(JOIN(AS(travelrecord,t),AS(address,a),EQ(t.id,a.id)),OR(EQ(t.id,1),EQ(a.id,2))),t.id,t.user_id)

{code}
Based on the above, the DOT(t, id) form can be replaced by a string or some related object, such as ColumnObject\{db1.travelrecord.id}

 
{code:java}
MAP(FILTER(JOIN(AS(TABLE("travelrecord"),t),AS(TABLE("address"),"a"),EQ(PROPERTY("t","id"),(PROPERTY("a"."id")),OR(EQ(PROPERTY("t","id"),1),EQ(PROPERTY("a","id"),2))),PROPERTY("t","id"),PROPERTY("t","user_id"))
{code}
 

 

The second part of the implementation is to use map, filter these 'extension functions', they establish AST, traverse AST when calling RelBuilder function to achieve the execution plan construction (I am referring to Apache Pig to do this)

What I described above may not be a AST conversion syntax (distinguishing matching patterns, extracting AstNode,build new patterns), but may be a design like linq's RelBuilder.

 

My project, it can't even run, is a toy.I am still developing.

[syntax conversion|https://github.com/junwen12221/describer/blob/master/src/test/java/cn/lightfish/describer/BuilderTest.java]

[bulid ast|https://github.com/junwen12221/describer/blob/master/src/main/java/cn/lightfish/wu/Ast.java]

> a RelOptRule-based text DSL
> ---------------------------
>
>                 Key: CALCITE-3470
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3470
>             Project: Calcite
>          Issue Type: New Feature
>            Reporter: jamie12221
>            Priority: Trivial
>
> Is there a development plan to convert a structure based on a RelOptRule-based text DSL to express relational expressions to generate optimization rules like Optgen of Cockroach.[building-cost-based-sql-optimizer?|[https://www.cockroachlabs.com/blog/building-cost-based-sql-optimizer/]]
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)