feat(engine): extend SelectRunner with run and runQuery
This commit is contained in:
1 parent
d6b9462677
commit
2ca0b75e83
1 file changed
+46
-4
@@ -2,34 +2,76 @@ package kestrel.engine
|
|||||||
|
|
||||||
import kestrel.KestrelException
|
import kestrel.KestrelException
|
||||||
import kestrel.catalog.Catalog
|
import kestrel.catalog.Catalog
|
||||||
|
import kestrel.catalog.Column
|
||||||
import kestrel.catalog.TableSchema
|
import kestrel.catalog.TableSchema
|
||||||
|
import kestrel.sql.ast.BetweenExpression
|
||||||
import kestrel.sql.ast.BinaryExpression
|
import kestrel.sql.ast.BinaryExpression
|
||||||
import kestrel.sql.ast.BinaryOperator
|
import kestrel.sql.ast.BinaryOperator
|
||||||
|
import kestrel.sql.ast.CallExpression
|
||||||
|
import kestrel.sql.ast.CaseExpression
|
||||||
|
import kestrel.sql.ast.CastExpression
|
||||||
|
import kestrel.sql.ast.CollateExpression
|
||||||
import kestrel.sql.ast.ColumnExpression
|
import kestrel.sql.ast.ColumnExpression
|
||||||
|
import kestrel.sql.ast.CommonTableExpression
|
||||||
|
import kestrel.sql.ast.CurrentValueExpression
|
||||||
|
import kestrel.sql.ast.ExistsExpression
|
||||||
import kestrel.sql.ast.Expression
|
import kestrel.sql.ast.Expression
|
||||||
import kestrel.sql.ast.ExpressionProjection
|
import kestrel.sql.ast.ExpressionProjection
|
||||||
|
import kestrel.sql.ast.FrameBound
|
||||||
|
import kestrel.sql.ast.FrameBoundType
|
||||||
|
import kestrel.sql.ast.FrameExclude
|
||||||
|
import kestrel.sql.ast.FrameUnit
|
||||||
|
import kestrel.sql.ast.FromItem
|
||||||
import kestrel.sql.ast.FunctionExpression
|
import kestrel.sql.ast.FunctionExpression
|
||||||
|
import kestrel.sql.ast.InExpression
|
||||||
|
import kestrel.sql.ast.InSubqueryExpression
|
||||||
|
import kestrel.sql.ast.IsNullExpression
|
||||||
import kestrel.sql.ast.JoinClause
|
import kestrel.sql.ast.JoinClause
|
||||||
import kestrel.sql.ast.JoinType
|
import kestrel.sql.ast.JoinType
|
||||||
|
import kestrel.sql.ast.LikeExpression
|
||||||
import kestrel.sql.ast.LiteralExpression
|
import kestrel.sql.ast.LiteralExpression
|
||||||
|
import kestrel.sql.ast.MergeActionExpression
|
||||||
|
import kestrel.sql.ast.NextValueExpression
|
||||||
|
import kestrel.sql.ast.ParameterExpression
|
||||||
|
import kestrel.sql.ast.OrderKey
|
||||||
|
import kestrel.sql.ast.QueryStatement
|
||||||
|
import kestrel.sql.ast.ScalarSubqueryExpression
|
||||||
import kestrel.sql.ast.SelectItem
|
import kestrel.sql.ast.SelectItem
|
||||||
import kestrel.sql.ast.SelectStatement
|
import kestrel.sql.ast.SelectStatement
|
||||||
|
import kestrel.sql.ast.SetOperationStatement
|
||||||
|
import kestrel.sql.ast.SetOperator
|
||||||
import kestrel.sql.ast.StarProjection
|
import kestrel.sql.ast.StarProjection
|
||||||
|
import kestrel.sql.ast.SubquerySource
|
||||||
|
import kestrel.sql.ast.TableSource
|
||||||
import kestrel.sql.ast.UnaryExpression
|
import kestrel.sql.ast.UnaryExpression
|
||||||
|
import kestrel.sql.ast.WindowExpression
|
||||||
|
import kestrel.sql.ast.WindowFrame
|
||||||
|
import kestrel.sql.ast.WindowFunctionKind
|
||||||
|
import kestrel.sql.ast.WithQuery
|
||||||
|
import kestrel.storage.Collation
|
||||||
|
import kestrel.storage.ColumnType
|
||||||
import kestrel.storage.Row
|
import kestrel.storage.Row
|
||||||
import kestrel.storage.Value
|
import kestrel.storage.Value
|
||||||
import kestrel.storage.ValueOrdering
|
import kestrel.storage.displayWith
|
||||||
|
import java.math.BigDecimal
|
||||||
|
|
||||||
class SelectRunner(private val catalog: Catalog) {
|
class SelectRunner(private val catalog: Catalog) {
|
||||||
private val indexPlanner = IndexAccessPlanner(catalog)
|
private val indexPlanner = IndexAccessPlanner(catalog)
|
||||||
|
private val subqueryRunner = SubqueryRunner { select, outer -> run(select, outer) }
|
||||||
|
private val expandingViews = mutableSetOf<String>()
|
||||||
|
private val activeCtes = mutableListOf<CteScope>()
|
||||||
|
|
||||||
fun run(statement: SelectStatement): SelectResult {
|
fun run(statement: SelectStatement, outer: ColumnResolver? = null): SelectResult {
|
||||||
val plan = buildPlan(statement)
|
val plan = buildPlan(statement, outer)
|
||||||
val combined = plan.materialize()
|
val combined = plan.materialize()
|
||||||
return if (plan.aggregated) plan.aggregate(combined) else plan.projectRows(combined)
|
return if (plan.aggregated) plan.aggregate(combined) else plan.projectRows(combined)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun explain(statement: SelectStatement): List<String> = buildPlan(statement).describe()
|
fun runQuery(query: QueryStatement, outer: ColumnResolver? = null): SelectResult = when (query) {
|
||||||
|
is SelectStatement -> run(query, outer)
|
||||||
|
is SetOperationStatement -> runSetOperation(query, outer)
|
||||||
|
is WithQuery -> runWith(query, outer)
|
||||||
|
}
|
||||||
|
|
||||||
private fun buildPlan(statement: SelectStatement): Plan {
|
private fun buildPlan(statement: SelectStatement): Plan {
|
||||||
val sources = buildSources(statement)
|
val sources = buildSources(statement)
|
||||||
|
|||||||
Reference in new issue
Block a user