EarlyAbortTests
This commit is contained in:
parent
59df52e66d
commit
0f54a1fe3a
|
@ -75,12 +75,14 @@ object Tester
|
||||||
case class SubResults(
|
case class SubResults(
|
||||||
val input: LogicalPlan,
|
val input: LogicalPlan,
|
||||||
val astral: Result,
|
val astral: Result,
|
||||||
|
val astralEarlyAbort: Result,
|
||||||
val bdd: Result,
|
val bdd: Result,
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
def tests = Seq(
|
def tests = Seq(
|
||||||
"Astral-Raw" -> astral,
|
"Astral-Raw" -> astral,
|
||||||
|
"Astral-Raw-EarlyAbort" -> astralEarlyAbort,
|
||||||
"Astral-BDD" -> bdd,
|
"Astral-BDD" -> bdd,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -88,6 +90,8 @@ object Tester
|
||||||
{
|
{
|
||||||
// assert(lesserSpark.plan == astral.plan, s"The astral plan is wrong: \n${diffPlanSummary("Spark-Fair", "Astral-Raw", lesserSpark.plan, astral.plan)}")
|
// assert(lesserSpark.plan == astral.plan, s"The astral plan is wrong: \n${diffPlanSummary("Spark-Fair", "Astral-Raw", lesserSpark.plan, astral.plan)}")
|
||||||
assert(astral.plan == bdd.plan, s"The bdd plan is wrong: \n${diffPlanSummary("Astral-Raw", "Astral-BDD", astral.plan, bdd.plan)}")
|
assert(astral.plan == bdd.plan, s"The bdd plan is wrong: \n${diffPlanSummary("Astral-Raw", "Astral-BDD", astral.plan, bdd.plan)}")
|
||||||
|
assert(astral.plan == bdd.plan, s"The early abort plan is wrong: \n${diffPlanSummary("Astral-Raw-EarlyAbort", "Astral-BDD", astralEarlyAbort.plan, bdd.plan)}")
|
||||||
|
assert(astral.plan == bdd.plan, s"The early abort plan is wrong: \n${diffPlanSummary("Astral-Raw", "Astral-Raw-EarlyAbort", astral.plan, astralEarlyAbort.plan)}")
|
||||||
// if(completenessCheck){
|
// if(completenessCheck){
|
||||||
// assert(spark.plan == bdd.plan, s"The final plan is not complete : \n${diffPlanSummary("Spark-Full", "Astral-BDD", spark.plan, bdd.plan)}")
|
// assert(spark.plan == bdd.plan, s"The final plan is not complete : \n${diffPlanSummary("Spark-Full", "Astral-BDD", spark.plan, bdd.plan)}")
|
||||||
// }
|
// }
|
||||||
|
@ -127,6 +131,7 @@ object Tester
|
||||||
def dumpStatsBenchmark(): Unit =
|
def dumpStatsBenchmark(): Unit =
|
||||||
{
|
{
|
||||||
println(s"Using Optimizer with ${BenchmarkOptimizer.rules.size} rule fragments based on ${BenchmarkOptimizer.rules.map { _.getClass.getSimpleName().replaceAll("\\$", "").replaceAll("[^a-zA-Z].+", "") }.toSet.size} rules")
|
println(s"Using Optimizer with ${BenchmarkOptimizer.rules.size} rule fragments based on ${BenchmarkOptimizer.rules.map { _.getClass.getSimpleName().replaceAll("\\$", "").replaceAll("[^a-zA-Z].+", "") }.toSet.size} rules")
|
||||||
|
println(s"Using Optimizer with ${BenchmarkOptimizerEarlyAbort.rules.size} rule fragments based on ${BenchmarkOptimizerEarlyAbort.rules.map { _.getClass.getSimpleName().replaceAll("\\$", "").replaceAll("[^a-zA-Z].+", "") }.toSet.size} rules")
|
||||||
println(s"Using BDD Optimizer with ${BenchmarkLogicalPlanBDDOptimizer.rules.size} rules")
|
println(s"Using BDD Optimizer with ${BenchmarkLogicalPlanBDDOptimizer.rules.size} rules")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,6 +201,9 @@ object Tester
|
||||||
astral = Result.time {
|
astral = Result.time {
|
||||||
BenchmarkOptimizer.rewrite(plan)
|
BenchmarkOptimizer.rewrite(plan)
|
||||||
},
|
},
|
||||||
|
astralEarlyAbort = Result.time {
|
||||||
|
BenchmarkOptimizerEarlyAbort.rewrite(plan)
|
||||||
|
},
|
||||||
bdd = Result.time {
|
bdd = Result.time {
|
||||||
BenchmarkLogicalPlanBDDOptimizer.rewrite(plan)
|
BenchmarkLogicalPlanBDDOptimizer.rewrite(plan)
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,11 +5,14 @@ import com.astraldb.spec.Type
|
||||||
|
|
||||||
object Optimizer
|
object Optimizer
|
||||||
{
|
{
|
||||||
def apply(definition: Definition, benchmark: Boolean = false): String =
|
def apply(definition: Definition, benchmark: Boolean = false, earlyAbort: Boolean = false): String =
|
||||||
{
|
{
|
||||||
if(benchmark)
|
if(benchmark && !earlyAbort)
|
||||||
{
|
{
|
||||||
scala.Optimizer(definition.rules.map { "Benchmark" + _.safeLabel }, "BenchmarkOptimizer").toString
|
scala.Optimizer(definition.rules.map { "Benchmark" + _.safeLabel }, "BenchmarkOptimizer").toString
|
||||||
|
} else if (benchmark && earlyAbort)
|
||||||
|
{
|
||||||
|
scala.OptimizerEarlyAbort(definition.rules.map { "Benchmark" + _.safeLabel }, "BenchmarkOptimizerEarlyAbort").toString
|
||||||
} else {
|
} else {
|
||||||
scala.Optimizer(definition.rules.map { _.safeLabel }).toString
|
scala.Optimizer(definition.rules.map { _.safeLabel }).toString
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ object Render
|
||||||
}
|
}
|
||||||
Map(
|
Map(
|
||||||
"BenchmarkOptimizer.scala" -> Optimizer(schema, true),
|
"BenchmarkOptimizer.scala" -> Optimizer(schema, true),
|
||||||
|
"BenchmarkOptimizerEarlyAbort.scala" -> Optimizer(schema,true, true),
|
||||||
) ++ (bddRule.flatMap { case (family, bdd) => Seq(
|
) ++ (bddRule.flatMap { case (family, bdd) => Seq(
|
||||||
s"Benchmark${family.scalaType}BDD.scala" -> Rule(schema, bdd, family, true),
|
s"Benchmark${family.scalaType}BDD.scala" -> Rule(schema, bdd, family, true),
|
||||||
s"Benchmark${family.scalaType}BDDOptimizer.scala" -> Optimizer.bdd(family, true)
|
s"Benchmark${family.scalaType}BDDOptimizer.scala" -> Optimizer.bdd(family, true)
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
@import com.astraldb.spec.Definition
|
||||||
|
|
||||||
|
@(rules: Seq[String], clazz: String = "Optimizer")
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
var index = 0
|
||||||
|
while (index < rules.size)
|
||||||
|
{
|
||||||
|
current = rules(index).apply(current)
|
||||||
|
index = index + 1
|
||||||
|
if (!last.fastEquals(current)){
|
||||||
|
index = Int.MaxValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// for(rule <- rules)
|
||||||
|
// {
|
||||||
|
// current = rule(current)
|
||||||
|
|
||||||
|
// }
|
||||||
|
if(last.fastEquals(current))
|
||||||
|
{
|
||||||
|
return (current, i+1)
|
||||||
|
}
|
||||||
|
last = current
|
||||||
|
}
|
||||||
|
return (current, MAX_ITERATIONS)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue