Skip to content

Commit

Permalink
Generate internal, open IR classes and tree rewriters (#1109)
Browse files Browse the repository at this point in the history
  • Loading branch information
rchowell authored Jun 14, 2023
1 parent 120f0bb commit a899307
Show file tree
Hide file tree
Showing 24 changed files with 586 additions and 270 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ Thank you to all who have contributed!
- **Breaking**: Removes deprecated `org.partiql.lang.syntax.SourceSpan`
- **Breaking**: Removes deprecated `org.partiql.lang.syntax.Token`
- **Breaking**: Removes deprecated `org.partiql.lang.syntax.TokenType`
- **Breaking**: Plan nodes cannot be directly instantiated. To instantiate, use the `Plan` (DEFAULT) factory.
- **Breaking**: PlanRewriter has been moved from `org.partiql.plan.visitor.PlanRewriter` to `org.partiql.plan.util.PlanRewriter`

### Security

Expand Down
2 changes: 1 addition & 1 deletion buildSrc/src/main/kotlin/partiql.versions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ object Versions {
const val jline = "3.21.0"
const val jmh = "0.5.3"
const val joda = "2.12.1"
const val kotlinPoet = "1.8.0"
const val kotlinPoet = "1.11.0"
const val picoCli = "4.7.0"
const val kasechange = "1.3.0"
const val ktlint = "10.2.1"
Expand Down
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -46,23 +46,13 @@ class KotlinCommand : Callable<Int> {
)
var poems: List<String> = emptyList()

@CommandLine.Option(
names = ["-m", "--modifier"],
description = ["Generated node class modifier. Options \${COMPLETION-CANDIDATES}"],
defaultValue = "DATA"
)
lateinit var modifier: KotlinNodeOptions.Modifier

override fun call(): Int {
val input = BufferedReader(FileInputStream(file).reader()).readText()
val parser = SproutParser.default()
val universe = parser.parse(id, input)
val options = KotlinOptions(
packageRoot = packageRoot,
poems = poems,
node = KotlinNodeOptions(
modifier = modifier,
),
)
val generator = KotlinGenerator(options)
val result = generator.generate(universe)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.partiql.sprout.generator.target.kotlin

import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.FunSpec
import com.squareup.kotlinpoet.KModifier
import com.squareup.kotlinpoet.ParameterSpec
import com.squareup.kotlinpoet.PropertySpec
Expand All @@ -9,7 +11,7 @@ import org.partiql.sprout.generator.Generator
import org.partiql.sprout.generator.target.kotlin.poems.KotlinBuilderPoem
import org.partiql.sprout.generator.target.kotlin.poems.KotlinJacksonPoem
import org.partiql.sprout.generator.target.kotlin.poems.KotlinListenerPoem
import org.partiql.sprout.generator.target.kotlin.poems.KotlinMetasPoem
import org.partiql.sprout.generator.target.kotlin.poems.KotlinUtilsPoem
import org.partiql.sprout.generator.target.kotlin.poems.KotlinVisitorPoem
import org.partiql.sprout.generator.target.kotlin.spec.KotlinFileSpec
import org.partiql.sprout.generator.target.kotlin.spec.KotlinNodeSpec
Expand All @@ -35,20 +37,22 @@ class KotlinGenerator(private val options: KotlinOptions) : Generator<KotlinResu
"visitor" -> KotlinVisitorPoem(symbols)
"builder" -> KotlinBuilderPoem(symbols)
"listener" -> KotlinListenerPoem(symbols)
"metas" -> KotlinMetasPoem(symbols)
"jackson" -> KotlinJacksonPoem(symbols)
else -> error("unknown poem $it, expected: visitor, builder, listener, metas, jackson")
"util" -> KotlinUtilsPoem(symbols)
else -> error("unknown poem $it, expected: visitor, builder, listener, jackson, util")
}
}

// --- Generate skeleton
val spec = KotlinUniverseSpec(
universe = universe,
nodes = universe.nodes(symbols),
base = TypeSpec.classBuilder(symbols.base).addModifiers(KModifier.ABSTRACT),
base = TypeSpec.interfaceBuilder(symbols.base),
types = universe.types(symbols)
)
val specs = with(spec) {
// Add identifiers
base.addProperty(PropertySpec.builder("_id", String::class).addModifiers(KModifier.ABSTRACT).build())
// Apply each poem
poems.forEach { it.apply(this) }
// Finalize each spec/builder
Expand All @@ -62,18 +66,17 @@ class KotlinGenerator(private val options: KotlinOptions) : Generator<KotlinResu
/**
* Generate a NodeSpec for each Type in the given Universe
*/
private fun Universe.nodes(symbols: KotlinSymbols): List<KotlinNodeSpec> = types.mapNotNull { it.generate(symbols) }
.map {
it.builder.superclass(symbols.base)
private fun Universe.nodes(symbols: KotlinSymbols): List<KotlinNodeSpec> =
types.mapNotNull { it.generate(symbols) }.map {
it.builder.addSuperinterface(symbols.base)
it
}

/**
* Generate all top-level enums as these are not children of a product definition
*/
private fun Universe.types(symbols: KotlinSymbols) = types.filterIsInstance<TypeDef.Enum>()
.map { it.generate(symbols) }
.toMutableList()
private fun Universe.types(symbols: KotlinSymbols) =
types.filterIsInstance<TypeDef.Enum>().map { it.generate(symbols) }.toMutableList()

/**
* Entry point for node generation.
Expand All @@ -87,25 +90,36 @@ class KotlinGenerator(private val options: KotlinOptions) : Generator<KotlinResu
/**
* Product Node Generation
*/
private fun TypeDef.Product.generate(symbols: KotlinSymbols) = KotlinNodeSpec.Product(
product = this,
props = props.map { KotlinNodeSpec.Prop(it.name.toCamelCase(), symbols.typeNameOf(it.ref)) },
nodes = children.mapNotNull { it.generate(symbols) },
clazz = symbols.clazz(ref),
ext = (props.enumProps(symbols) + types.enums(symbols)).toMutableList(),
).apply {
props.forEach {
val para = ParameterSpec.builder(it.name, it.type).build()
val prop = PropertySpec.builder(it.name, it.type).initializer(it.name).build()
builder.addProperty(prop)
constructor.addParameter(para)
}
when (options.node.modifier) {
KotlinNodeOptions.Modifier.FINAL -> {}
KotlinNodeOptions.Modifier.DATA -> if (props.isNotEmpty()) builder.addModifiers(KModifier.DATA)
KotlinNodeOptions.Modifier.OPEN -> builder.addModifiers(KModifier.OPEN)
private fun TypeDef.Product.generate(symbols: KotlinSymbols): KotlinNodeSpec {
val clazz = symbols.clazz(ref)
val clazzImpl = ClassName(
packageName = clazz.packageName + ".impl",
simpleNames = listOf(symbols.pascal(ref) + "Impl"),
)
return KotlinNodeSpec.Product(
product = this,
props = props.map { KotlinNodeSpec.Prop(it.name.toCamelCase(), symbols.typeNameOf(it.ref)) },
implClazz = clazzImpl,
impl = TypeSpec.classBuilder(clazzImpl),
nodes = children.mapNotNull { it.generate(symbols) },
clazz = symbols.clazz(ref),
ext = (props.enumProps(symbols) + types.enums(symbols)).toMutableList(),
).apply {
// Add id to impl
impl.addProperty(symbols.idProp)
constructor.addParameter(symbols.idPara)
props.forEach {
val para = ParameterSpec.builder(it.name, it.type).build()
val prop = PropertySpec.builder(it.name, it.type).build()
builder.addProperty(prop.toBuilder().addModifiers(KModifier.ABSTRACT).build())
impl.addProperty(prop.toBuilder().addModifiers(KModifier.OVERRIDE).initializer(it.name).build())
constructor.addParameter(para)
}
// impls are open
impl.addSuperinterface(clazz)
nodes.forEach { it.builder.addSuperinterface(symbols.base) }
this.addDataClassMethods()
}
nodes.forEach { it.builder.superclass(symbols.base) }
}

/**
Expand All @@ -118,16 +132,15 @@ class KotlinGenerator(private val options: KotlinOptions) : Generator<KotlinResu
clazz = symbols.clazz(ref),
ext = types.enums(symbols).toMutableList(),
).apply {
variants.forEach { it.builder.superclass(clazz) }
nodes.forEach { it.builder.superclass(symbols.base) }
variants.forEach { it.builder.addSuperinterface(clazz) }
nodes.forEach { it.builder.addSuperinterface(symbols.base) }
}

/**
* Enum constant generation
*/
private fun TypeDef.Enum.generate(symbols: KotlinSymbols) = TypeSpec.enumBuilder(symbols.clazz(ref))
.apply { values.forEach { addEnumConstant(it) } }
.build()
private fun TypeDef.Enum.generate(symbols: KotlinSymbols) =
TypeSpec.enumBuilder(symbols.clazz(ref)).apply { values.forEach { addEnumConstant(it) } }.build()

private fun List<TypeProp>.enumProps(symbols: KotlinSymbols) = filterIsInstance<TypeProp.Inline>().mapNotNull {
when (it.def) {
Expand All @@ -139,4 +152,30 @@ class KotlinGenerator(private val options: KotlinOptions) : Generator<KotlinResu
private fun List<TypeDef>.enums(symbols: KotlinSymbols) = filterIsInstance<TypeDef.Enum>().map {
it.generate(symbols)
}

// TODO generate hashCode, equals, componentN so we can have OPEN internal implementations
private fun KotlinNodeSpec.Product.addDataClassMethods() {
impl.addModifiers(KModifier.INTERNAL, KModifier.OPEN)
// builder.addFunction(
// FunSpec.builder("hashCode").addModifiers(KModifier.OVERRIDE, KModifier.ABSTRACT).returns(Int::class).build()
// )
// builder.addFunction(
// FunSpec.builder("equals").addModifiers(KModifier.OVERRIDE, KModifier.ABSTRACT).returns(Boolean::class)
// .addParameter(ParameterSpec.builder("other", Any::class.asTypeName().copy(nullable = true)).build())
// .build()
// )
val args = listOf("_id") + props.map { it.name }
val copy = FunSpec.builder("copy").addModifiers(KModifier.ABSTRACT).returns(clazz)
val copyImpl = FunSpec.builder("copy")
.addModifiers(KModifier.OVERRIDE)
.returns(clazz)
.addStatement("return %T(${args.joinToString()})", implClazz)
props.forEach {
val para = ParameterSpec.builder(it.name, it.type).build()
copy.addParameter(para.toBuilder().defaultValue("this.${it.name}").build())
copyImpl.addParameter(para)
}
builder.addFunction(copy.build())
impl.addFunction(copyImpl.build())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,4 @@ package org.partiql.sprout.generator.target.kotlin
class KotlinOptions(
val packageRoot: String,
val poems: List<String>,
val node: KotlinNodeOptions = KotlinNodeOptions(),
)

/**
* Consider other options as this is Kotlin specific
*/
class KotlinNodeOptions(
val modifier: Modifier = Modifier.FINAL,
) {

enum class Modifier {
FINAL,
DATA,
OPEN,
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,16 @@ import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.DOUBLE
import com.squareup.kotlinpoet.FLOAT
import com.squareup.kotlinpoet.INT
import com.squareup.kotlinpoet.KModifier
import com.squareup.kotlinpoet.LIST
import com.squareup.kotlinpoet.LONG
import com.squareup.kotlinpoet.MAP
import com.squareup.kotlinpoet.MUTABLE_LIST
import com.squareup.kotlinpoet.MUTABLE_MAP
import com.squareup.kotlinpoet.MUTABLE_SET
import com.squareup.kotlinpoet.ParameterSpec
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
import com.squareup.kotlinpoet.PropertySpec
import com.squareup.kotlinpoet.SET
import com.squareup.kotlinpoet.STRING
import com.squareup.kotlinpoet.TypeName
Expand Down Expand Up @@ -51,6 +54,16 @@ class KotlinSymbols private constructor(
*/
val base: ClassName = ClassName(rootPackage, "${rootId}Node")

/**
* Id Property for interfaces and classes
*/
val idProp = PropertySpec.builder("_id", String::class).addModifiers(KModifier.OVERRIDE).initializer("_id").build()

/**
* Id Parameter for internal constructors
*/
val idPara = ParameterSpec.builder("_id", String::class).build()

/**
* Memoize converting a TypeRef.Path to a camel case identifier to be used as method/function names
*/
Expand Down
Loading

1 comment on commit a899307

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JMH Benchmark

Benchmark suite Current: a899307 Previous: 6c69a97 Ratio
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLCompiler15 116.49074075172639 us/op 188.75048981226846 us/op 0.62
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLCompiler30 228.08055125420498 us/op 354.3647881721647 us/op 0.64
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLEvaluator15 508693.42634166655 us/op 613899.4171500001 us/op 0.83
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLEvaluator30 1001563.4725749998 us/op 1239333.49205 us/op 0.81
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLEvaluator30WithData10 9962325.9436 us/op 12352337.2732 us/op 0.81
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLParser15 202.0281624768315 us/op 304.27589666668075 us/op 0.66
org.partiql.jmh.benchmarks.MultipleLikeBenchmark.testPartiQLParser30 408.81183569115433 us/op 543.6840783364061 us/op 0.75
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameCaseWhenThen 45.10498151979802 us/op 85.77109466168642 us/op 0.53
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameComplexQuery 60.78821099779301 us/op 100.57344573109114 us/op 0.60
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameComplexQuery01 317.7416617242735 us/op 496.1937463021762 us/op 0.64
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameComplexQuery02 534.9156706646895 us/op 819.6450197216354 us/op 0.65
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameExceptUnionIntersectSixty 214.56453086847984 us/op 317.6372007487738 us/op 0.68
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameExec20Expressions 71.60715292028173 us/op 106.75491593985896 us/op 0.67
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameFromLet 46.13848988850916 us/op 84.42209211706725 us/op 0.55
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameGraphPattern 45.63885780198228 us/op 81.35747734388713 us/op 0.56
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameGraphPreFilters 70.28051419678467 us/op 127.25977757164874 us/op 0.55
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameGroupLimit 56.98574026546923 us/op 103.86950181243594 us/op 0.55
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameLongFromSourceOrderBy 69.7186583123229 us/op 113.10975351977348 us/op 0.62
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameManyJoins 65.84008520173124 us/op 121.01435266930018 us/op 0.54
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameNestedAggregates 117.11923898710158 us/op 191.68716907004537 us/op 0.61
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameNestedParen 21.376590289734803 us/op 34.71647200437822 us/op 0.62
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNamePivot 71.9897351886223 us/op 124.01755160055805 us/op 0.58
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQuery15OrsAndLikes 222.0861078845788 us/op 399.5678520524981 us/op 0.56
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQuery30Plus 118.40070198887511 us/op 187.02076711305742 us/op 0.63
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQueryFunc 55.95071528114981 us/op 91.92716532276648 us/op 0.61
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQueryFuncInProjection 121.50956559997584 us/op 194.44646325607243 us/op 0.62
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQueryList 81.90978665098785 us/op 131.70470778291514 us/op 0.62
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQueryNestedSelect 778.0987201507409 us/op 1195.969180989038 us/op 0.65
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameQuerySimple 19.618838176598253 us/op 32.56707542789447 us/op 0.60
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSeveralJoins 25.757976553094096 us/op 44.44372183812546 us/op 0.58
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSeveralProjections 80.40229324124581 us/op 126.66679833152853 us/op 0.63
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSeveralSelect 210.09640933581673 us/op 345.1147016103562 us/op 0.61
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSimpleInsert 34.355712727972005 us/op 60.039370146113036 us/op 0.57
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSomeJoins 26.19061484233604 us/op 44.34024258797696 us/op 0.59
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSomeProjections 34.02589719287315 us/op 58.54731750831743 us/op 0.58
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameSomeSelect 55.62806234987206 us/op 100.56260800513152 us/op 0.55
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameTimeZone 29.008179915125446 us/op 48.618690420263405 us/op 0.60
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameVeryLongQuery 348.45799694529603 us/op 535.0652719473619 us/op 0.65
org.partiql.jmh.benchmarks.ParserBenchmark.parseFailNameVeryLongQuery01 1064.076476394566 us/op 1644.5396557637882 us/op 0.65
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameCaseWhenThen 29.37777208192218 us/op 47.34266522191554 us/op 0.62
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameComplexQuery 267.44055411799815 us/op 427.30869339189786 us/op 0.63
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameComplexQuery01 122.20411036954788 us/op 203.04920868449523 us/op 0.60
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameExceptUnionIntersectSixty 235.07745045955463 us/op 340.7306655649944 us/op 0.69
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameExec20Expressions 75.32837886900066 us/op 112.61505122260792 us/op 0.67
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameFromLet 40.34772367593363 us/op 70.91687784253787 us/op 0.57
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameGraphPattern 44.270829484687454 us/op 75.7964354614277 us/op 0.58
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameGraphPreFilters 76.68065191378003 us/op 129.6810478603354 us/op 0.59
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameGroupLimit 37.38741731274619 us/op 68.84747968814209 us/op 0.54
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameLongFromSourceOrderBy 152.78269711840352 us/op 231.23363545706442 us/op 0.66
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameManyJoins 48.47955618514009 us/op 80.12047769614632 us/op 0.61
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameNestedAggregates 102.57682017600314 us/op 169.89731483035732 us/op 0.60
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameNestedParen 91.41141689200242 us/op 126.28225351999777 us/op 0.72
org.partiql.jmh.benchmarks.ParserBenchmark.parseNamePivot 72.50498208501463 us/op 119.02906057173843 us/op 0.61
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQuery15OrsAndLikes 195.23765351576543 us/op 292.56771376076676 us/op 0.67
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQuery30Plus 65.64571219886649 us/op 98.38388329546649 us/op 0.67
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQueryFunc 141.72120913752013 us/op 224.2906960983768 us/op 0.63
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQueryFuncInProjection 103.95158233033855 us/op 161.06518857566624 us/op 0.65
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQueryList 87.19096700832554 us/op 129.02241800325663 us/op 0.68
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQueryNestedSelect 149.9928494310198 us/op 241.73835596521266 us/op 0.62
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameQuerySimple 15.071264618712487 us/op 24.44644730620717 us/op 0.62
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSeveralJoins 83.65357803246178 us/op 121.86792359539962 us/op 0.69
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSeveralProjections 64.38123491963292 us/op 95.14217835561834 us/op 0.68
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSeveralSelect 130.027454281237 us/op 191.10247520262206 us/op 0.68
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSimpleInsert 25.90496066766492 us/op 40.866490860779514 us/op 0.63
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSomeJoins 25.768088297207377 us/op 40.67267771768357 us/op 0.63
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSomeProjections 21.479039753503148 us/op 34.410029808186394 us/op 0.62
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameSomeSelect 42.4139879778898 us/op 62.39906832254405 us/op 0.68
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameTimeZone 10.524006420190897 us/op 17.944508357264123 us/op 0.59
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameVeryLongQuery 473.41839397856273 us/op 665.1007950200224 us/op 0.71
org.partiql.jmh.benchmarks.ParserBenchmark.parseNameVeryLongQuery01 1324.983061264669 us/op 1838.8272554148941 us/op 0.72
org.partiql.jmh.benchmarks.PartiQLBenchmark.testPartiQLCompiler 9.864231505240728 us/op 15.131305543147604 us/op 0.65
org.partiql.jmh.benchmarks.PartiQLBenchmark.testPartiQLEvaluator 2.4776408812082047 us/op 3.395420514678482 us/op 0.73
org.partiql.jmh.benchmarks.PartiQLBenchmark.testPartiQLParser 13.425144622350865 us/op 23.68454417583882 us/op 0.57

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.