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 <[email protected]> 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

Reply via email to