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.catalog.Catalog
|
||||
import kestrel.catalog.Column
|
||||
import kestrel.catalog.TableSchema
|
||||
import kestrel.sql.ast.BetweenExpression
|
||||
import kestrel.sql.ast.BinaryExpression
|
||||
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.CommonTableExpression
|
||||
import kestrel.sql.ast.CurrentValueExpression
|
||||
import kestrel.sql.ast.ExistsExpression
|
||||
import kestrel.sql.ast.Expression
|
||||
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.InExpression
|
||||
import kestrel.sql.ast.InSubqueryExpression
|
||||
import kestrel.sql.ast.IsNullExpression
|
||||
import kestrel.sql.ast.JoinClause
|
||||
import kestrel.sql.ast.JoinType
|
||||
import kestrel.sql.ast.LikeExpression
|
||||
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.SelectStatement
|
||||
import kestrel.sql.ast.SetOperationStatement
|
||||
import kestrel.sql.ast.SetOperator
|
||||
import kestrel.sql.ast.StarProjection
|
||||
import kestrel.sql.ast.SubquerySource
|
||||
import kestrel.sql.ast.TableSource
|
||||
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.Value
|
||||
import kestrel.storage.ValueOrdering
|
||||
import kestrel.storage.displayWith
|
||||
import java.math.BigDecimal
|
||||
|
||||
class SelectRunner(private val catalog: 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 {
|
||||
val plan = buildPlan(statement)
|
||||
fun run(statement: SelectStatement, outer: ColumnResolver? = null): SelectResult {
|
||||
val plan = buildPlan(statement, outer)
|
||||
val combined = plan.materialize()
|
||||
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 {
|
||||
val sources = buildSources(statement)
|
||||
|
||||
Reference in new issue
Block a user