initial workings on inversion.

inverted-optimizer
Nick Brown 2024-04-29 16:46:16 -04:00
parent 0f54a1fe3a
commit 296b691fa9
Signed by: bicknrown
GPG Key ID: 47AF495B3DCCE9C3
6 changed files with 112 additions and 3 deletions

View File

@ -46,6 +46,7 @@ object Tester
val bdd: Result,
val lesserSpark: Result,
val spark: Result,
val invertedastral: Result,
)
{
@ -54,6 +55,7 @@ object Tester
"Astral-BDD" -> bdd,
"Spark-Fair" -> lesserSpark,
"Spark-Full" -> spark,
"Inverted-Astral" -> invertedastral,
)
def validate(completenessCheck: Boolean = false): Unit =
@ -188,6 +190,9 @@ object Tester
lesserSpark = Result.time {
LesserSparkOptimizer.rewrite(analyzed)
},
invertedastral = Result.time {
InvertedOptimizer.rewrite(analyzed)
},
spark = Result.time {
optimizer.execute(analyzed) -> 0
}
@ -278,4 +283,4 @@ object Tester
println(test(df))
}
}
}

View File

@ -0,0 +1,11 @@
package com.astraldb.codegen
import com.astraldb.spec.Definition
object InvertedOptimizer
{
def apply(definition: Definition): String =
{
scala.InvertedOptimizer(definition.rules.map { "Inverted" + _.safeLabel }).toString
}
}

View File

@ -0,0 +1,14 @@
package com.astraldb.codegen
import com.astraldb.spec
import com.astraldb.bdd
import com.astraldb.codegen
object InvertedRule
{
def apply(schema: spec.Definition, rule: spec.Rule, benchmark: Boolean = false): String =
{
scala.InvertedRule(schema, rule).toString
}
}

View File

@ -32,7 +32,12 @@ object Render
Map(
"Optimizer.scala" -> Optimizer(schema),
) ++ (bddRule.flatMap { case (family, bdd) => Seq(
) ++ Map(
"InvertedOptimizer.scala" -> InvertedOptimizer(schema),
) ++ schema.rules.map { rule =>
s"Inverted${rule.safeLabel}.scala" -> InvertedRule(schema, rule)
}.toMap
++ (bddRule.flatMap { case (family, bdd) => Seq(
s"${family.scalaType}BDD.scala" -> Rule(schema, bdd, family, false),
s"${family.scalaType}BDDOptimizer.scala" -> Optimizer.bdd(family)
)}.toMap) ++ schema.rules.map { rule =>
@ -51,4 +56,4 @@ object Render
println(content)
}
}
}
}

View File

@ -0,0 +1,37 @@
@import com.astraldb.spec.Definition
@(rules: Seq[String], clazz: String = "InvertedOptimizer")
object @clazz
{
val rules = Seq[Rule[LogicalPlan]](
@for(rule <- rules){ @rule ,
}
)
def MAX_ITERATIONS = 100
def rewrite(plan: LogicalPlan): (LogicalPlan, Int) =
{
var current = plan
var last = plan
for(i <- 0 until MAX_ITERATIONS)
{
current = current.transform{ case theplan =>
var newPlan = theplan
for(rule <- rules)
{
newPlan = rule(newPlan)
}
newPlan
}
if(last.fastEquals(current))
{
return (current, i+1)
}
last = current
}
return (current, MAX_ITERATIONS)
}
}

View File

@ -0,0 +1,37 @@
@import com.astraldb.spec.Rule
@import com.astraldb.spec.Type
@import com.astraldb.spec.Definition
@import com.astraldb.codegen.Match
@import com.astraldb.codegen.Expression
@import com.astraldb.codegen.Code
@import com.astraldb.codegen.CodeScope
@import com.astraldb.typecheck.TypecheckMatch
@(schema: Definition, rule: Rule, clazz: String = "Inverted")
@{
val matchSchema = TypecheckMatch(
rule.pattern,
rule.family,
schema,
schema.globals
)
}
object @{clazz}@{rule.safeLabel} extends Rule[@{rule.family.scalaType}]
{
def apply(plan: @{rule.family.scalaType}): @{rule.family.scalaType} =
plan match { case plan =>
@Match(
schema = schema,
pattern = rule.pattern,
target = Code.Literal("plan"),
targetPath = Seq.empty,
targetType = rule.family,
onSuccess = Expression(schema, rule.rewrite, _),
onFail = { _ => Code.Literal("plan") },
name = Some("plan"),
scope = CodeScope(schema.globals)
).toString(6).stripPrefix(" ")
}
}