feat(engine): extend SelectRunner with run and runQuery

This commit is contained in:
dualfroz committed 2026-09-02 12:13:12 +02:00
1 parent d6b9462677
commit 2ca0b75e83
1 file changed
+46 -4
+46 -4
View File
@@ -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)