解析sql的库。java
主要类sql
名称ide |
说明函数 |
CodeGeneratespa |
代码生成器,主要对Expression生成对应的java代码,输出ExprCode。里面包含了一系列的ExprCode子类。继承 |
ExprCodeci |
生成java代码,和Expression对应。Expression还有eval方法在InternalRow上判断条件表达式是否知足。input |
Expressionstring |
条件表达式,主要的方法是eval和genCode,后者生成对应的ExprCodeit |
predicates |
条件表达式。 LessThanOrEqual:小于等于; MoreThan:。。 LessThan等 |
|
|
|
|
定义了一系列条件表达式,如大于小于,等于,in ()操做等等。每种操做符定义一个单独的类处理,经过统一的eval()方法返回匹配的结果,是null仍是false仍是true。
例如:
或操做
override def eval(input: InternalRow): Any = {
val input1 = left.eval(input)
if (input1 == true) {
true
} else {
val input2 = right.eval(input)
if (input2 == true) {
true
} else {
if (input1 != null && input2 != null) {
false
} else {
null
}
}
}
}
left和right只要知足一个就返回true,只要有一个是null则返回null,不然返回false。
再看一个And
override def eval(input: InternalRow): Any = {
val input1 = left.eval(input)
if (input1 == false) {
false
} else {
val input2 = right.eval(input)
if (input2 == false) {
false
} else {
if (input1 != null && input2 != null) {
true
} else {
null
}
}
}
}
left和right只要一个为false则返回false,若是有null则返回null,不然返回true。
其余的就不列举了。
Expression:函数表达式,如name(string)这样的定义格式。
LeafExpression:没有子节点。child为nil
UnaryExpression:一个子节点。children只有一个元素[child]
BinaryExpression:两个子节点
TernaryExpression:三个子节点
TernaryExpression:特殊的BinaryExpression,两个子节点有相同的输出数据类型。
每一个列的值先是Expression,而后Seq[Expression]解析成InternalRow
Expression是TreeNode的子类。
大部分的Expression子类应该都是继承UnaryExpression或者BinaryExpression。
命名表达式,判断select后多个列表达式是否指向同一个,或者对sql语句进行预处理,转换列表达式。
其中一个重载方式sql,返回处理后的sql语句。
只有一个child,children也是只有一个child的列表。
override def eval(input: InternalRow): Any = {
val value = child.eval(input)
if (value == null) {
null
} else {
nullSafeEval(value)
}
}
protected def nullSafeEval(input: Any): Any =
sys.error(s"UnaryExpressions must override either eval or nullSafeEval")
当子类继承UnaryExpression时,可能须要重写eval和nullSafeEval两个方法。
defineCodeGen方法:返回java source代码。能够重写。
继承Expression,两个输入,一个输出。也是一个基类,不直接使用。
继承BinaryExpression。是一个抽象类,表达式格式:
是相似"x symbol y", 而不是"funcName(x, y)".
主要是一个方法的重写:
override def sql: String = s"(${left.sql} $sqlOperator ${right.sql})"
输出sql语句。