You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by xuedong luan <lu...@gmail.com> on 2016/08/16 06:52:08 UTC
Difference between sqlnode and relnode and rexnode
dear all:
I am a newer on calcite, and i don't know the difference between
sqlnode and relnode and rexnode . Can anyone help me? thank you very much
Re: Difference between sqlnode and relnode and rexnode
Posted by xuedong luan <lu...@gmail.com>.
sorry for late reply, thank you very much, very excellent description.
2016-08-19 16:48 GMT+08:00 Julian Hyde <jh...@apache.org>:
> +1
>
> Thanks, Jordan, for an excellent description.
>
> Julian
>
> > On Aug 16, 2016, at 6:33 PM, jordan.halterman@gmail.com wrote:
> >
> > SqlNode is the abstract syntax tree that represents the actual structure
> of the query a user input. When a query is first parsed, it's parsed into a
> SqlNode. For example, a SELECT query will be parsed into a SqlSelect with a
> list of fields, a table, a join, etc. Calcite is also capable of generating
> a query string from a SqlNode as well.
> >
> > RelNode represents a relational expression - hence "rel." RelNodes are
> used in the optimizer to decide how to execute a query. Examples of
> relational expressions are join, filter, aggregate, etc. Typically,
> specific implementations of RelNode will be created by users of Calcite to
> represent the execution of some expression in their system. When a query is
> first converted from SqlNode to RelNode, it will be made up of logical
> nodes like LogicalProject, LogicalJoin, etc. Optimizer rules are then used
> to convert from those logical nodes to physical ones like JdbcJoin,
> SparkJoin, CassandraJoin, or whatever the system requires. Traits and
> conventions are used by the optimizer to determine the set of rules to
> apply and the desired outcome, but you didn't ask about conventions :-)
> >
> > RexNode represents a row expression - hence "Rex" - that's typically
> contained within a RelNode. The row expression contains operations
> performed on a single row. For example, a Project will contain a list of
> RexNodes that represent the projection's fields. A RexNode might be a
> reference to a field from an input to the RedNode, a function call
> (RexCall), a window (RexOver), etc. The operator within the RexCall defines
> what the node does, and operands define arguments to the operator. For
> example, 1 + 1 would be represented as a RexCall where the operator is +
> and the operands are 1 and 1.
> >
> > What RelNode and RexNode together give you is a way to plan and
> implement a query. Systems typically use VolcanoPlanner (cost-based) or
> HepPlanner (heuristic) to convert the logical plan (RelNode) into a
> physical plan and then implement the plan by converting each RelNode and
> RexNode into whatever is required by the system for which the plan is
> generated. The optimizer might push down or pull up expressions or reorder
> joins to create a more optimal plan. Then, to implement that plan, e.g. the
> JDBC integration will convert an optimized RelNode back into a SqlNode and
> then a query string to be executed against some database over JDBC. The
> Spark implementation will convert RelNodes into operations on a Spark RDD.
> The Cassandra implementation will generate a CQL query, etc.
> >
> >> On Aug 15, 2016, at 11:52 PM, xuedong luan <lu...@gmail.com>
> wrote:
> >>
> >> dear all:
> >> I am a newer on calcite, and i don't know the difference between
> >> sqlnode and relnode and rexnode . Can anyone help me? thank you very
> much
>
>
Re: Difference between sqlnode and relnode and rexnode
Posted by Julian Hyde <jh...@apache.org>.
+1
Thanks, Jordan, for an excellent description.
Julian
> On Aug 16, 2016, at 6:33 PM, jordan.halterman@gmail.com wrote:
>
> SqlNode is the abstract syntax tree that represents the actual structure of the query a user input. When a query is first parsed, it's parsed into a SqlNode. For example, a SELECT query will be parsed into a SqlSelect with a list of fields, a table, a join, etc. Calcite is also capable of generating a query string from a SqlNode as well.
>
> RelNode represents a relational expression - hence "rel." RelNodes are used in the optimizer to decide how to execute a query. Examples of relational expressions are join, filter, aggregate, etc. Typically, specific implementations of RelNode will be created by users of Calcite to represent the execution of some expression in their system. When a query is first converted from SqlNode to RelNode, it will be made up of logical nodes like LogicalProject, LogicalJoin, etc. Optimizer rules are then used to convert from those logical nodes to physical ones like JdbcJoin, SparkJoin, CassandraJoin, or whatever the system requires. Traits and conventions are used by the optimizer to determine the set of rules to apply and the desired outcome, but you didn't ask about conventions :-)
>
> RexNode represents a row expression - hence "Rex" - that's typically contained within a RelNode. The row expression contains operations performed on a single row. For example, a Project will contain a list of RexNodes that represent the projection's fields. A RexNode might be a reference to a field from an input to the RedNode, a function call (RexCall), a window (RexOver), etc. The operator within the RexCall defines what the node does, and operands define arguments to the operator. For example, 1 + 1 would be represented as a RexCall where the operator is + and the operands are 1 and 1.
>
> What RelNode and RexNode together give you is a way to plan and implement a query. Systems typically use VolcanoPlanner (cost-based) or HepPlanner (heuristic) to convert the logical plan (RelNode) into a physical plan and then implement the plan by converting each RelNode and RexNode into whatever is required by the system for which the plan is generated. The optimizer might push down or pull up expressions or reorder joins to create a more optimal plan. Then, to implement that plan, e.g. the JDBC integration will convert an optimized RelNode back into a SqlNode and then a query string to be executed against some database over JDBC. The Spark implementation will convert RelNodes into operations on a Spark RDD. The Cassandra implementation will generate a CQL query, etc.
>
>> On Aug 15, 2016, at 11:52 PM, xuedong luan <lu...@gmail.com> wrote:
>>
>> dear all:
>> I am a newer on calcite, and i don't know the difference between
>> sqlnode and relnode and rexnode . Can anyone help me? thank you very much
Re: Difference between sqlnode and relnode and rexnode
Posted by "jordan.halterman@gmail.com" <jo...@gmail.com>.
SqlNode is the abstract syntax tree that represents the actual structure of the query a user input. When a query is first parsed, it's parsed into a SqlNode. For example, a SELECT query will be parsed into a SqlSelect with a list of fields, a table, a join, etc. Calcite is also capable of generating a query string from a SqlNode as well.
RelNode represents a relational expression - hence "rel." RelNodes are used in the optimizer to decide how to execute a query. Examples of relational expressions are join, filter, aggregate, etc. Typically, specific implementations of RelNode will be created by users of Calcite to represent the execution of some expression in their system. When a query is first converted from SqlNode to RelNode, it will be made up of logical nodes like LogicalProject, LogicalJoin, etc. Optimizer rules are then used to convert from those logical nodes to physical ones like JdbcJoin, SparkJoin, CassandraJoin, or whatever the system requires. Traits and conventions are used by the optimizer to determine the set of rules to apply and the desired outcome, but you didn't ask about conventions :-)
RexNode represents a row expression - hence "Rex" - that's typically contained within a RelNode. The row expression contains operations performed on a single row. For example, a Project will contain a list of RexNodes that represent the projection's fields. A RexNode might be a reference to a field from an input to the RedNode, a function call (RexCall), a window (RexOver), etc. The operator within the RexCall defines what the node does, and operands define arguments to the operator. For example, 1 + 1 would be represented as a RexCall where the operator is + and the operands are 1 and 1.
What RelNode and RexNode together give you is a way to plan and implement a query. Systems typically use VolcanoPlanner (cost-based) or HepPlanner (heuristic) to convert the logical plan (RelNode) into a physical plan and then implement the plan by converting each RelNode and RexNode into whatever is required by the system for which the plan is generated. The optimizer might push down or pull up expressions or reorder joins to create a more optimal plan. Then, to implement that plan, e.g. the JDBC integration will convert an optimized RelNode back into a SqlNode and then a query string to be executed against some database over JDBC. The Spark implementation will convert RelNodes into operations on a Spark RDD. The Cassandra implementation will generate a CQL query, etc.
> On Aug 15, 2016, at 11:52 PM, xuedong luan <lu...@gmail.com> wrote:
>
> dear all:
> I am a newer on calcite, and i don't know the difference between
> sqlnode and relnode and rexnode . Can anyone help me? thank you very much