Skip to content

Commit b063e52

Browse files
authored
Add additional APIs for async physical plan evaluation (#1382)
1 parent b938fda commit b063e52

File tree

93 files changed

+6752
-161
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+6752
-161
lines changed

CHANGELOG.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,28 @@ Thank you to all who have contributed!
2929

3030
### Added
3131
- Added constrained decimal as valid parameter type to functions that take in numeric parameters.
32+
- Added async version of physical plan evaluator `PartiQLCompilerAsync`.
33+
- The following related async APIs have been added:
34+
- `org.partiql.lang.compiler` -- `PartiQLCompilerAsync`, `PartiQLCompilerAsyncBuilder`, `PartiQLCompilerAsyncDefault`, `PartiQLCompilerPipelineAsync`
35+
- `org.partiql.lang.eval` -- `PartiQLStatementAsync`
36+
- `org.partiql.lang.eval.physical` -- `VariableBindingAsync`
37+
- `org.partiql.lang.eval.physical.operators` -- `AggregateOperatorFactoryAsync`, `CompiledGroupKeyAsync`, `CompiledAggregateFunctionAsync`, `FilterRelationalOperatorFactoryAsync`, `JoinRelationalOperatorFactoryAsync`, `LetRelationalOperatorFactoryAsync`, `LimitRelationalOperatorFactoryAsync`, `OffsetRelationalOperatorFactoryAsync`, `ProjectRelationalOperatorFactoryAsync`, `RelationExpressionAsync`, `ScanRelationalOperatorFactoryAsync`, `SortOperatorFactoryAsync`, `CompiledSortKeyAsync`, `UnpivotOperatorFactoryAsync`, `ValueExpressionAsync`, `WindowRelationalOperatorFactoryAsync`, `CompiledWindowFunctionAsync`
38+
- `org.partiql.lang.eval.physical.window` -- `NavigationWindowFunctionAsync`, `WindowFunctionAsync`
39+
- Overall, we see about a 10-20% performance decline in running a single query on the synchronous vs async evaluator
40+
- JMH benchmarks added to partiql-lang: `PartiQLCompilerPipelineBenchmark` and `PartiQLCompilerPipelineAsyncBenchmark`
3241

3342
### Changed
3443
- Function resolution logic: Now the function resolver would match all possible candidate(based on if the argument can be coerced to the Signature parameter type). If there are multiple match it will first attempt to pick the one requires the least cast, then pick the function with the highest precedence.
44+
- partiql-cli -- experimental version of CLI now uses the async physical plan evaluator
3545

3646
### Deprecated
47+
- As part of the additions to make an async physical plan evaluator, the synchronous physical plan evaluator `PartiQLCompiler` has been deprecated.
48+
- The following related APIs have been deprecated
49+
- `org.partiql.lang.compiler` -- `PartiQLCompiler`, `PartiQLCompilerBuilder`, `PartiQLCompilerDefault`, `PartiQLCompilerPipeline`
50+
- `org.partiql.lang.eval` -- `PartiQLStatement`
51+
- `org.partiql.lang.eval.physical` -- `VariableBinding`
52+
- `org.partiql.lang.eval.physical.operators` -- `AggregateOperatorFactory`, `CompiledGroupKey`, `CompiledAggregateFunction`, `FilterRelationalOperatorFactory`, `JoinRelationalOperatorFactory`, `LetRelationalOperatorFactory`, `LimitRelationalOperatorFactory`, `OffsetRelationalOperatorFactory`, `ProjectRelationalOperatorFactory`, `RelationExpression`, `ScanRelationalOperatorFactory`, `SortOperatorFactory`, `CompiledSortKey`, `UnpivotOperatorFactory`, `ValueExpression`, `WindowRelationalOperatorFactory`, `CompiledWindowFunction`
53+
- `org.partiql.lang.eval.physical.window` -- `NavigationWindowFunction`, `WindowFunction`
3754

3855
### Fixed
3956
- partiql-ast: `SqlDialect` will wrap unary ops (`NOT`, `+`, `-`) in parens
@@ -44,7 +61,7 @@ Thank you to all who have contributed!
4461

4562
### Contributors
4663
Thank you to all who have contributed!
47-
- @<your-username>
64+
- @alancai98
4865

4966
## [0.14.3] - 2024-02-14
5067

buildSrc/src/main/kotlin/partiql.versions.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,19 @@ object Versions {
3636
const val jansi = "2.4.0"
3737
const val jgenhtml = "1.6"
3838
const val jline = "3.21.0"
39-
const val jmh = "0.5.3"
39+
const val jmhGradlePlugin = "0.5.3"
40+
const val jmhCore = "1.37"
41+
const val jmhGeneratorAnnprocess = "1.37"
42+
const val jmhGeneratorBytecode = "1.37"
4043
const val joda = "2.12.1"
4144
const val kotlinPoet = "1.11.0"
4245
const val kotlinxCollections = "0.3.5"
4346
const val picoCli = "4.7.0"
4447
const val kasechange = "1.3.0"
4548
const val ktlint = "11.6.0"
4649
const val pig = "0.6.2"
50+
const val kotlinxCoroutines = "1.6.0"
51+
const val kotlinxCoroutinesJdk8 = "1.6.0"
4752

4853
// Testing
4954
const val assertj = "3.11.0"
@@ -54,6 +59,7 @@ object Versions {
5459
const val junit4Params = "1.1.1"
5560
const val mockito = "4.5.0"
5661
const val mockk = "1.11.0"
62+
const val kotlinxCoroutinesTest = "1.6.0"
5763
}
5864

5965
object Deps {
@@ -84,6 +90,8 @@ object Deps {
8490
const val picoCli = "info.picocli:picocli:${Versions.picoCli}"
8591
const val pig = "org.partiql:partiql-ir-generator:${Versions.pig}"
8692
const val pigRuntime = "org.partiql:partiql-ir-generator-runtime:${Versions.pig}"
93+
const val kotlinxCoroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.kotlinxCoroutines}"
94+
const val kotlinxCoroutinesJdk8 = "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:${Versions.kotlinxCoroutinesJdk8}"
8795

8896
// Testing
8997
const val assertj = "org.assertj:assertj-core:${Versions.assertj}"
@@ -97,6 +105,12 @@ object Deps {
97105
const val kotlinTestJunit = "org.jetbrains.kotlin:kotlin-test-junit5:${Versions.kotlin}"
98106
const val mockito = "org.mockito:mockito-junit-jupiter:${Versions.mockito}"
99107
const val mockk = "io.mockk:mockk:${Versions.mockk}"
108+
const val kotlinxCoroutinesTest = "org.jetbrains.kotlinx:kotlinx-coroutines-test:${Versions.kotlinxCoroutinesTest}"
109+
110+
// JMH Benchmarking
111+
const val jmhCore = "org.openjdk.jmh:jmh-core:${Versions.jmhCore}"
112+
const val jmhGeneratorAnnprocess = "org.openjdk.jmh:jmh-core:${Versions.jmhGeneratorAnnprocess}"
113+
const val jmhGeneratorBytecode = "org.openjdk.jmh:jmh-core:${Versions.jmhGeneratorBytecode}"
100114
}
101115

102116
object Plugins {
@@ -114,4 +128,4 @@ object Plugins {
114128
const val ktlint = "org.jlleitschuh.gradle.ktlint"
115129
const val library = "org.gradle.java-library"
116130
const val testFixtures = "org.gradle.java-test-fixtures"
117-
}
131+
}

examples/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ application {
2525
dependencies {
2626
implementation(project(":partiql-lang"))
2727
implementation(project(":partiql-types"))
28+
implementation(Deps.kotlinxCoroutines)
29+
implementation(Deps.kotlinxCoroutinesJdk8)
2830
implementation(Deps.awsSdkS3)
2931
}
3032

examples/src/main/java/org/partiql/examples/PartiQLCompilerPipelineJavaExample.java renamed to examples/src/main/java/org/partiql/examples/PartiQLCompilerPipelineAsyncJavaExample.java

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,25 @@
22

33
import com.amazon.ion.IonSystem;
44
import com.amazon.ion.system.IonSystemBuilder;
5+
6+
import java.util.concurrent.CompletableFuture;
7+
import java.util.concurrent.ExecutionException;
58
import kotlin.OptIn;
9+
import kotlin.coroutines.EmptyCoroutineContext;
10+
import kotlinx.coroutines.CoroutineScopeKt;
11+
import kotlinx.coroutines.CoroutineStart;
12+
import kotlinx.coroutines.future.FutureKt;
613
import org.jetbrains.annotations.NotNull;
714
import org.partiql.annotations.ExperimentalPartiQLCompilerPipeline;
815
import org.partiql.examples.util.Example;
9-
import org.partiql.lang.compiler.PartiQLCompiler;
10-
import org.partiql.lang.compiler.PartiQLCompilerBuilder;
11-
import org.partiql.lang.compiler.PartiQLCompilerPipeline;
16+
import org.partiql.lang.compiler.PartiQLCompilerAsync;
17+
import org.partiql.lang.compiler.PartiQLCompilerAsyncBuilder;
18+
import org.partiql.lang.compiler.PartiQLCompilerPipelineAsync;
1219
import org.partiql.lang.eval.Bindings;
1320
import org.partiql.lang.eval.EvaluationSession;
1421
import org.partiql.lang.eval.ExprValue;
1522
import org.partiql.lang.eval.PartiQLResult;
23+
import org.partiql.lang.eval.PartiQLStatementAsync;
1624
import org.partiql.lang.eval.ProjectionIterationBehavior;
1725
import org.partiql.lang.planner.EvaluatorOptions;
1826
import org.partiql.lang.planner.GlobalResolutionResult;
@@ -25,14 +33,14 @@
2533
import java.io.PrintStream;
2634

2735
/**
28-
* This is an example of using PartiQLCompilerPipeline in Java.
36+
* This is an example of using PartiQLCompilerPipelineAsync in Java.
2937
* It is an experimental feature and is marked as such, with @OptIn, in this example.
30-
* Unfortunately, it seems like the Java does not recognize the Optin annotation specified in Kotlin.
38+
* Unfortunately, it seems like the Java does not recognize the OptIn annotation specified in Kotlin.
3139
* Java users will be able to access the experimental APIs freely, and not be warned at all.
3240
*/
33-
public class PartiQLCompilerPipelineJavaExample extends Example {
41+
public class PartiQLCompilerPipelineAsyncJavaExample extends Example {
3442

35-
public PartiQLCompilerPipelineJavaExample(@NotNull PrintStream out) {
43+
public PartiQLCompilerPipelineAsyncJavaExample(@NotNull PrintStream out) {
3644
super(out);
3745
}
3846

@@ -49,10 +57,7 @@ public void run() {
4957
"{name: \"mary\", age: 19}" +
5058
"]";
5159

52-
final Bindings<ExprValue> globalVariables = Bindings.<ExprValue>lazyBindingsBuilder().addBinding("myTable", () -> {
53-
ExprValue exprValue = ExprValue.of(ion.singleValue(myTable));
54-
return exprValue;
55-
}).build();
60+
final Bindings<ExprValue> globalVariables = Bindings.<ExprValue>lazyBindingsBuilder().addBinding("myTable", () -> ExprValue.of(ion.singleValue(myTable))).build();
5661

5762
final EvaluationSession session = EvaluationSession.builder()
5863
.globals(globalVariables)
@@ -79,17 +84,41 @@ public void run() {
7984
final PartiQLPlanner planner = PartiQLPlannerBuilder.standard().globalVariableResolver(globalVariableResolver).build();
8085

8186
@OptIn(markerClass = ExperimentalPartiQLCompilerPipeline.class)
82-
final PartiQLCompiler compiler = PartiQLCompilerBuilder.standard().options(evaluatorOptions).build();
87+
final PartiQLCompilerAsync compiler = PartiQLCompilerAsyncBuilder.standard().options(evaluatorOptions).build();
8388

8489
@OptIn(markerClass = ExperimentalPartiQLCompilerPipeline.class)
85-
final PartiQLCompilerPipeline pipeline = new PartiQLCompilerPipeline(
90+
final PartiQLCompilerPipelineAsync pipeline = new PartiQLCompilerPipelineAsync(
8691
parser, planner, compiler
8792
);
8893

8994
String query = "SELECT t.name FROM myTable AS t WHERE t.age > 20";
9095

9196
print("PartiQL query:", query);
92-
PartiQLResult result = pipeline.compile(query).eval(session);
97+
98+
// Calling Kotlin coroutines from Java requires some additional libraries from `kotlinx.coroutines.future`
99+
// to return a `java.util.concurrent.CompletableFuture`. If a use case arises to call the
100+
// `PartiQLCompilerPipelineAsync` APIs directly from Java, we can add Kotlin functions that directly return
101+
// Java's async libraries (e.g. in https://stackoverflow.com/a/52887677).
102+
CompletableFuture<PartiQLStatementAsync> statementFuture = FutureKt.future(
103+
CoroutineScopeKt.CoroutineScope(EmptyCoroutineContext.INSTANCE),
104+
EmptyCoroutineContext.INSTANCE,
105+
CoroutineStart.DEFAULT,
106+
(scope, continuation) -> pipeline.compile(query, continuation)
107+
);
108+
109+
PartiQLResult result;
110+
try {
111+
PartiQLStatementAsync statement = statementFuture.get();
112+
CompletableFuture<PartiQLResult> resultFuture = FutureKt.future(
113+
CoroutineScopeKt.CoroutineScope(EmptyCoroutineContext.INSTANCE),
114+
EmptyCoroutineContext.INSTANCE,
115+
CoroutineStart.DEFAULT,
116+
(scope, continuation) -> statement.eval(session, continuation)
117+
);
118+
result = resultFuture.get();
119+
} catch (InterruptedException | ExecutionException e) {
120+
throw new RuntimeException(e);
121+
}
93122
ExprValue exprValue = null;
94123
if (result instanceof PartiQLResult.Value) {
95124
exprValue = ((PartiQLResult.Value) result).getValue();
@@ -100,4 +129,4 @@ public void run() {
100129

101130
print("result", exprValue);
102131
}
103-
}
132+
}

examples/src/main/kotlin/org/partiql/examples/PartiQLCompilerPipelineExample.kt renamed to examples/src/main/kotlin/org/partiql/examples/PartiQLCompilerPipelineAsyncExample.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package org.partiql.examples
22

33
import com.amazon.ion.system.IonSystemBuilder
4+
import kotlinx.coroutines.runBlocking
45
import org.partiql.annotations.ExperimentalPartiQLCompilerPipeline
56
import org.partiql.examples.util.Example
6-
import org.partiql.lang.compiler.PartiQLCompilerPipeline
7+
import org.partiql.lang.compiler.PartiQLCompilerPipelineAsync
78
import org.partiql.lang.eval.Bindings
89
import org.partiql.lang.eval.EvaluationSession
910
import org.partiql.lang.eval.ExprValue
@@ -20,7 +21,7 @@ import java.io.PrintStream
2021
* One way to do so is to add the `Optin(Experimental<X>::class) before the class. where <X> is the feature name.
2122
* Also see: https://kotlinlang.org/docs/opt-in-requirements.html#module-wide-opt-in
2223
*/
23-
class PartiQLCompilerPipelineExample(out: PrintStream) : Example(out) {
24+
class PartiQLCompilerPipelineAsyncExample(out: PrintStream) : Example(out) {
2425

2526
private val myIonSystem = IonSystemBuilder.standard().build()
2627

@@ -59,7 +60,7 @@ class PartiQLCompilerPipelineExample(out: PrintStream) : Example(out) {
5960
.build()
6061

6162
@OptIn(ExperimentalPartiQLCompilerPipeline::class)
62-
private val partiQLCompilerPipeline = PartiQLCompilerPipeline.build {
63+
private val partiQLCompilerPipeline = PartiQLCompilerPipelineAsync.build {
6364
planner
6465
.globalVariableResolver(globalVariableResolver)
6566
compiler
@@ -71,7 +72,10 @@ class PartiQLCompilerPipelineExample(out: PrintStream) : Example(out) {
7172

7273
print("PartiQL query:", query)
7374
@OptIn(ExperimentalPartiQLCompilerPipeline::class)
74-
val exprValue = when (val result = partiQLCompilerPipeline.compile(query).eval(session)) {
75+
val result = runBlocking {
76+
partiQLCompilerPipeline.compile(query).eval(session)
77+
}
78+
val exprValue = when (result) {
7579
is PartiQLResult.Value -> result.value
7680
is PartiQLResult.Delete,
7781
is PartiQLResult.Explain.Domain,

examples/src/main/kotlin/org/partiql/examples/util/Main.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import org.partiql.examples.EvaluationWithLazyBindings
1212
import org.partiql.examples.ParserErrorExample
1313
import org.partiql.examples.ParserExample
1414
import org.partiql.examples.ParserJavaExample
15-
import org.partiql.examples.PartiQLCompilerPipelineExample
16-
import org.partiql.examples.PartiQLCompilerPipelineJavaExample
15+
import org.partiql.examples.PartiQLCompilerPipelineAsyncExample
16+
import org.partiql.examples.PartiQLCompilerPipelineAsyncJavaExample
1717
import org.partiql.examples.PartialEvaluationVisitorTransformExample
1818
import org.partiql.examples.PreventJoinVisitorExample
1919
import org.partiql.examples.S3JavaExample
@@ -26,7 +26,9 @@ private val examples = mapOf(
2626
S3JavaExample::class.java.simpleName to S3JavaExample(System.out),
2727
EvaluationJavaExample::class.java.simpleName to EvaluationJavaExample(System.out),
2828
ParserJavaExample::class.java.simpleName to ParserJavaExample(System.out),
29-
PartiQLCompilerPipelineJavaExample::class.java.simpleName to PartiQLCompilerPipelineJavaExample(System.out),
29+
PartiQLCompilerPipelineAsyncJavaExample::class.java.simpleName to PartiQLCompilerPipelineAsyncJavaExample(
30+
System.out
31+
),
3032

3133
// Kotlin Examples
3234
CsvExprValueExample::class.java.simpleName to CsvExprValueExample(System.out),
@@ -39,7 +41,7 @@ private val examples = mapOf(
3941
PartialEvaluationVisitorTransformExample::class.java.simpleName to PartialEvaluationVisitorTransformExample(System.out),
4042
PreventJoinVisitorExample::class.java.simpleName to PreventJoinVisitorExample(System.out),
4143
SimpleExpressionEvaluation::class.java.simpleName to SimpleExpressionEvaluation(System.out),
42-
PartiQLCompilerPipelineExample::class.java.simpleName to PartiQLCompilerPipelineExample(System.out)
44+
PartiQLCompilerPipelineAsyncExample::class.java.simpleName to PartiQLCompilerPipelineAsyncExample(System.out)
4345
)
4446

4547
fun main(args: Array<String>) {

examples/src/test/kotlin/org/partiql/examples/PartiQLCompilerPipelineExampleTest.kt renamed to examples/src/test/kotlin/org/partiql/examples/PartiQLCompilerPipelineAsyncExampleTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package org.partiql.examples
33
import org.partiql.examples.util.Example
44
import java.io.PrintStream
55

6-
class PartiQLCompilerPipelineExampleTest : BaseExampleTest() {
7-
override fun example(out: PrintStream): Example = PartiQLCompilerPipelineExample(out)
6+
class PartiQLCompilerPipelineAsyncExampleTest : BaseExampleTest() {
7+
override fun example(out: PrintStream): Example = PartiQLCompilerPipelineAsyncExample(out)
88

99
override val expected = """
1010
|PartiQL query:

examples/src/test/kotlin/org/partiql/examples/PartiQLCompilerPipelineJavaExampleTest.kt renamed to examples/src/test/kotlin/org/partiql/examples/PartiQLCompilerPipelineAsyncJavaExampleTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ package org.partiql.examples
33
import org.partiql.examples.util.Example
44
import java.io.PrintStream
55

6-
class PartiQLCompilerPipelineJavaExampleTest : BaseExampleTest() {
7-
override fun example(out: PrintStream): Example = PartiQLCompilerPipelineJavaExample(out)
6+
class PartiQLCompilerPipelineAsyncJavaExampleTest : BaseExampleTest() {
7+
override fun example(out: PrintStream): Example =
8+
PartiQLCompilerPipelineAsyncJavaExample(out)
89

910
override val expected = """
1011
|PartiQL query:

partiql-cli/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ dependencies {
3636
implementation(Deps.joda)
3737
implementation(Deps.picoCli)
3838
implementation(Deps.kotlinReflect)
39+
implementation(Deps.kotlinxCoroutines)
3940
testImplementation(Deps.mockito)
4041
}
4142

partiql-cli/src/main/kotlin/org/partiql/cli/pipeline/AbstractPipeline.kt

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import com.amazon.ionelement.api.ionInt
2020
import com.amazon.ionelement.api.ionString
2121
import com.amazon.ionelement.api.ionStructOf
2222
import com.amazon.ionelement.api.toIonValue
23+
import kotlinx.coroutines.runBlocking
2324
import org.partiql.annotations.ExperimentalPartiQLCompilerPipeline
2425
import org.partiql.cli.Debug
2526
import org.partiql.cli.functions.QueryDDB
@@ -29,8 +30,8 @@ import org.partiql.cli.functions.WriteFile_1
2930
import org.partiql.cli.functions.WriteFile_2
3031
import org.partiql.cli.utils.ServiceLoaderUtil
3132
import org.partiql.lang.CompilerPipeline
32-
import org.partiql.lang.compiler.PartiQLCompilerBuilder
33-
import org.partiql.lang.compiler.PartiQLCompilerPipeline
33+
import org.partiql.lang.compiler.PartiQLCompilerAsyncBuilder
34+
import org.partiql.lang.compiler.PartiQLCompilerPipelineAsync
3435
import org.partiql.lang.eval.CompileOptions
3536
import org.partiql.lang.eval.EvaluationSession
3637
import org.partiql.lang.eval.ExprFunction
@@ -50,7 +51,7 @@ import java.nio.file.Path
5051
import java.time.ZoneOffset
5152

5253
/**
53-
* A means by which we can run both the EvaluatingCompiler and PartiQLCompilerPipeline
54+
* A means by which we can run both the EvaluatingCompiler and [PartiQLCompilerPipelineAsync].
5455
*/
5556
internal sealed class AbstractPipeline(open val options: PipelineOptions) {
5657

@@ -163,7 +164,7 @@ internal sealed class AbstractPipeline(open val options: PipelineOptions) {
163164
}
164165

165166
/**
166-
* Wraps the PartiQLCompilerPipeline
167+
* Wraps the [PartiQLCompilerPipelineAsync]
167168
*/
168169
@OptIn(ExperimentalPartiQLCompilerPipeline::class)
169170
class PipelineExperimental(options: PipelineOptions) : AbstractPipeline(options) {
@@ -183,17 +184,19 @@ internal sealed class AbstractPipeline(open val options: PipelineOptions) {
183184

184185
override fun compile(input: String, session: EvaluationSession): PartiQLResult {
185186
val globalVariableResolver = createGlobalVariableResolver(session)
186-
val pipeline = PartiQLCompilerPipeline(
187+
val pipeline = PartiQLCompilerPipelineAsync(
187188
parser = options.parser,
188189
planner = PartiQLPlannerBuilder.standard()
189190
.options(plannerOptions)
190191
.globalVariableResolver(globalVariableResolver)
191192
.build(),
192-
compiler = PartiQLCompilerBuilder.standard()
193+
compiler = PartiQLCompilerAsyncBuilder.standard()
193194
.options(evaluatorOptions)
194195
.build(),
195196
)
196-
return pipeline.compile(input).eval(session)
197+
return runBlocking {
198+
pipeline.compile(input).eval(session)
199+
}
197200
}
198201

199202
private fun createGlobalVariableResolver(session: EvaluationSession) = GlobalVariableResolver {

0 commit comments

Comments
 (0)