解析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語句。