Skip to content

Commit

Permalink
Updates partiql-eval APIs to Java and split compile phase
Browse files Browse the repository at this point in the history
  • Loading branch information
RCHowell committed Oct 11, 2024
1 parent 9cfbc51 commit ecd8b5a
Show file tree
Hide file tree
Showing 27 changed files with 490 additions and 388 deletions.
15 changes: 3 additions & 12 deletions partiql-cli/src/main/kotlin/org/partiql/cli/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import com.amazon.ionelement.api.loadAllElements
import org.partiql.cli.io.Format
import org.partiql.cli.pipeline.Pipeline
import org.partiql.cli.shell.Shell
import org.partiql.eval.PartiQLResult
import org.partiql.plugins.memory.MemoryCatalog
import org.partiql.plugins.memory.MemoryTable
import org.partiql.spi.catalog.Catalog
Expand Down Expand Up @@ -171,17 +170,9 @@ internal class MainCommand : Runnable {

// TODO add format support
checkFormat(format)

when (result) {
is PartiQLResult.Error -> {
error(result.cause.stackTrace)
}
is PartiQLResult.Value -> {
val writer = PartiQLValueTextWriter(System.out)
writer.append(result.value.toPartiQLValue()) // TODO: Create a Datum writer
println()
}
}
val writer = PartiQLValueTextWriter(System.out)
writer.append(result.toPartiQLValue()) // TODO: Create a Datum writer
println()
}

private fun session() = Session.builder()
Expand Down
19 changes: 10 additions & 9 deletions partiql-cli/src/main/kotlin/org/partiql/cli/pipeline/Pipeline.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,24 @@ import org.partiql.ast.Statement
import org.partiql.errors.Problem
import org.partiql.errors.ProblemCallback
import org.partiql.errors.ProblemSeverity
import org.partiql.eval.PartiQLEngine
import org.partiql.eval.PartiQLResult
import org.partiql.eval.Mode
import org.partiql.eval.PartiQLEvaluator
import org.partiql.parser.PartiQLParser
import org.partiql.plan.Plan
import org.partiql.planner.PartiQLPlanner
import org.partiql.spi.catalog.Session
import org.partiql.spi.value.Datum

internal class Pipeline private constructor(
private val parser: PartiQLParser,
private val planner: PartiQLPlanner,
private val engine: PartiQLEngine,
private val evaluator: PartiQLEvaluator,
) {

/**
* TODO replace with the ResultSet equivalent?
*/
fun execute(statement: String, session: Session): PartiQLResult {
fun execute(statement: String, session: Session): Datum {
val ast = parse(statement)
val plan = plan(ast, session)
return execute(plan, session)
Expand All @@ -41,7 +42,7 @@ internal class Pipeline private constructor(
TODO("Add V1 planner to the CLI")
}

private fun execute(plan: Plan, session: Session): PartiQLResult {
private fun execute(plan: Plan, session: Session): Datum {
// val statement = engine.prepare(plan, session.mode, session.planner())
// return engine.execute(statement)
TODO("Add V1 planner to the CLI")
Expand All @@ -61,15 +62,15 @@ internal class Pipeline private constructor(
fun default(): Pipeline {
val parser = PartiQLParser.standard()
val planner = PartiQLPlanner.standard()
val engine = PartiQLEngine.standard()
return Pipeline(parser, planner, engine)
val evaluator = PartiQLEvaluator.standard(Mode.PERMISSIVE())
return Pipeline(parser, planner, evaluator)
}

fun strict(): Pipeline {
val parser = PartiQLParser.standard()
val planner = PartiQLPlanner.builder().signal().build()
val engine = PartiQLEngine.standard()
return Pipeline(parser, planner, engine)
val evaluator = PartiQLEvaluator.standard()
return Pipeline(parser, planner, evaluator)
}
}
}
16 changes: 5 additions & 11 deletions partiql-cli/src/main/kotlin/org/partiql/cli/shell/Shell.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import org.jline.utils.AttributedStyle.BOLD
import org.jline.utils.InfoCmp
import org.joda.time.Duration
import org.partiql.cli.pipeline.Pipeline
import org.partiql.eval.PartiQLResult
import org.partiql.spi.catalog.Session
import org.partiql.value.PartiQLValueExperimental
import org.partiql.value.io.PartiQLValueTextWriter
Expand Down Expand Up @@ -264,16 +263,11 @@ internal class Shell(
}
} else {
val result = pipeline.execute(line, session)
when (result) {
is PartiQLResult.Error -> throw result.cause
is PartiQLResult.Value -> {
val writer = PartiQLValueTextWriter(out)
writer.append(result.value.toPartiQLValue()) // TODO: Create a Datum writer
out.appendLine()
out.appendLine()
out.info("OK!")
}
}
val writer = PartiQLValueTextWriter(out)
writer.append(result.toPartiQLValue()) // TODO: Create a Datum writer
out.appendLine()
out.appendLine()
out.info("OK!")
}
}
} catch (ex: Exception) {
Expand Down
66 changes: 24 additions & 42 deletions partiql-eval/api/partiql-eval.api
Original file line number Diff line number Diff line change
@@ -1,54 +1,36 @@
public abstract interface class org/partiql/eval/PartiQLEngine {
public static final field Companion Lorg/partiql/eval/PartiQLEngine$Companion;
public static fun builder ()Lorg/partiql/eval/builder/PartiQLEngineBuilder;
public abstract fun prepare (Lorg/partiql/plan/Plan;Lorg/partiql/eval/PartiQLEngine$Mode;Lorg/partiql/spi/catalog/Session;)Lorg/partiql/eval/PartiQLStatement;
public static fun standard ()Lorg/partiql/eval/PartiQLEngine;
public class org/partiql/eval/Mode {
public static final field PERMISSIVE I
public static final field STRICT I
public static fun PERMISSIVE ()Lorg/partiql/eval/Mode;
public static fun STRICT ()Lorg/partiql/eval/Mode;
public fun code ()I
}

public final class org/partiql/eval/PartiQLEngine$Companion {
public final fun builder ()Lorg/partiql/eval/builder/PartiQLEngineBuilder;
public final fun standard ()Lorg/partiql/eval/PartiQLEngine;
public abstract interface class org/partiql/eval/PartiQLCompiler {
public static fun builder ()Lorg/partiql/eval/PartiQLCompiler$Builder;
public abstract fun prepare (Lorg/partiql/plan/Plan;)Lorg/partiql/eval/Statement;
public static fun standard ()Lorg/partiql/eval/PartiQLCompiler;
public static fun standard (Lorg/partiql/eval/Mode;)Lorg/partiql/eval/PartiQLCompiler;
}

public final class org/partiql/eval/PartiQLEngine$Mode : java/lang/Enum {
public static final field PERMISSIVE Lorg/partiql/eval/PartiQLEngine$Mode;
public static final field STRICT Lorg/partiql/eval/PartiQLEngine$Mode;
public static fun getEntries ()Lkotlin/enums/EnumEntries;
public static fun valueOf (Ljava/lang/String;)Lorg/partiql/eval/PartiQLEngine$Mode;
public static fun values ()[Lorg/partiql/eval/PartiQLEngine$Mode;
public class org/partiql/eval/PartiQLCompiler$Builder {
public fun build ()Lorg/partiql/eval/PartiQLCompiler;
public fun mode (Lorg/partiql/eval/Mode;)Lorg/partiql/eval/PartiQLCompiler$Builder;
}

public abstract interface class org/partiql/eval/PartiQLResult {
public abstract interface class org/partiql/eval/PartiQLEvaluator {
public static fun builder ()Lorg/partiql/eval/PartiQLEvaluator$Builder;
public abstract fun eval (Lorg/partiql/plan/Plan;)Lorg/partiql/spi/value/Datum;
public static fun standard ()Lorg/partiql/eval/PartiQLEvaluator;
public static fun standard (Lorg/partiql/eval/Mode;)Lorg/partiql/eval/PartiQLEvaluator;
}

public final class org/partiql/eval/PartiQLResult$Error : org/partiql/eval/PartiQLResult {
public fun <init> (Ljava/lang/Throwable;)V
public final fun component1 ()Ljava/lang/Throwable;
public final fun copy (Ljava/lang/Throwable;)Lorg/partiql/eval/PartiQLResult$Error;
public static synthetic fun copy$default (Lorg/partiql/eval/PartiQLResult$Error;Ljava/lang/Throwable;ILjava/lang/Object;)Lorg/partiql/eval/PartiQLResult$Error;
public fun equals (Ljava/lang/Object;)Z
public final fun getCause ()Ljava/lang/Throwable;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
public class org/partiql/eval/PartiQLEvaluator$Builder {
public fun build ()Lorg/partiql/eval/PartiQLEvaluator;
public fun compiler (Lorg/partiql/eval/PartiQLCompiler;)Lorg/partiql/eval/PartiQLEvaluator$Builder;
}

public final class org/partiql/eval/PartiQLResult$Value : org/partiql/eval/PartiQLResult {
public fun <init> (Lorg/partiql/spi/value/Datum;)V
public final fun component1 ()Lorg/partiql/spi/value/Datum;
public final fun copy (Lorg/partiql/spi/value/Datum;)Lorg/partiql/eval/PartiQLResult$Value;
public static synthetic fun copy$default (Lorg/partiql/eval/PartiQLResult$Value;Lorg/partiql/spi/value/Datum;ILjava/lang/Object;)Lorg/partiql/eval/PartiQLResult$Value;
public fun equals (Ljava/lang/Object;)Z
public final fun getValue ()Lorg/partiql/spi/value/Datum;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public abstract interface class org/partiql/eval/PartiQLStatement {
public abstract fun execute (Lorg/partiql/spi/catalog/Session;)Lorg/partiql/eval/PartiQLResult;
}

public final class org/partiql/eval/builder/PartiQLEngineBuilder {
public fun <init> ()V
public final fun build ()Lorg/partiql/eval/PartiQLEngine;
public abstract interface class org/partiql/eval/Statement {
public abstract fun execute ()Lorg/partiql/spi/value/Datum;
}

38 changes: 38 additions & 0 deletions partiql-eval/src/main/java/org/partiql/eval/Mode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.partiql.eval;

/**
* PartiQL Execution Mode.
*/
public class Mode {

/**
* Strict execution mode.
*/
public static final int STRICT = 0;

/**
* Permissive execution mode.
*/
public static final int PERMISSIVE = 1;

/**
* Internal enum code.
*/
private final int code;

private Mode(int code) {
this.code = code;
}

public int code() {
return this.code;
}

public static Mode STRICT() {
return new Mode(STRICT);
}

public static Mode PERMISSIVE() {
return new Mode(PERMISSIVE);
}
}
73 changes: 73 additions & 0 deletions partiql-eval/src/main/java/org/partiql/eval/PartiQLCompiler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package org.partiql.eval;

import org.jetbrains.annotations.NotNull;
import org.partiql.plan.Plan;

/**
* A [PartiQLCompiler] is responsible for produces physical plans from logical plans.
*/
public interface PartiQLCompiler {

/**
* Compiles the given plan into an executable PartiQL statement.
*
* @param plan The plan to compile.
* @return The prepared statement.
*/
@NotNull
public Statement prepare(@NotNull Plan plan);

/**
* @return A new [PartiQLCompilerBuilder].
*/
@NotNull
public static Builder builder() {
return new Builder();
}

/**
* @return A new [PartiQLCompiler] with the default (strict) compilation mode.
*/
@NotNull
public static PartiQLCompiler standard() {
return standard(Mode.STRICT());
}

/**
* @param mode The compilation mode.
* @return A new [PartiQLCompiler] with the given compilation mode.
*/
@NotNull
public static PartiQLCompiler standard(Mode mode) {
return new StandardCompiler(mode);
}

/**
* Builder class for the [PartiQLCompiler] interface.
*/
public static class Builder {

// builder state
private Mode mode;

private Builder() {
// empty
}

/**
* @param mode The mode.
* @return This builder.
*/
public Builder mode(Mode mode) {
this.mode = mode;
return this;
}

/**
* @return A new [PartiQLCompiler].
*/
public PartiQLCompiler build() {
return new StandardCompiler(mode);
}
}
}
68 changes: 68 additions & 0 deletions partiql-eval/src/main/java/org/partiql/eval/PartiQLEvaluator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package org.partiql.eval;

import org.jetbrains.annotations.NotNull;
import org.partiql.plan.Plan;
import org.partiql.spi.value.Datum;

/**
* TODO JAVADOC
*/
public interface PartiQLEvaluator {

/**
* @param plan The plan to evaluate.
* @return The result of evaluating the plan.
*/
@NotNull
public Datum eval(@NotNull Plan plan);

/**
* @return A new [PartiQLCompilerBuilder].
*/
@NotNull
public static Builder builder() {
return new Builder();
}

/**
* @return A new [PartiQLEvaluator] with the default (strict) evaluation mode.
*/
@NotNull
public static PartiQLEvaluator standard() {
return standard(Mode.STRICT());
}

/**
* @param mode The evaluation mode.
* @return A new [PartiQLEvaluator] with the given evaluation mode.
*/
@NotNull
public static PartiQLEvaluator standard(Mode mode) {
return new StandardEvaluator(PartiQLCompiler.standard(mode));
}

/**
* Builder class for the [PartiQLCompiler] interface.
*/
public static class Builder {

// builder state
private PartiQLCompiler compiler = PartiQLCompiler.standard();

private Builder() {
// empty
}

public Builder compiler(PartiQLCompiler compiler) {
this.compiler = compiler;
return this;
}

/**
* @return A new [PartiQLCompiler].
*/
public PartiQLEvaluator build() {
return new StandardEvaluator(compiler);
}
}
}
20 changes: 20 additions & 0 deletions partiql-eval/src/main/java/org/partiql/eval/Statement.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.partiql.eval;

import org.jetbrains.annotations.NotNull;
import org.partiql.spi.value.Datum;

/**
* An executable statement.
* <br>
* Developer Note: Consider `Datum execute(Parameters parameters)` for DML.
*/
public interface Statement {

/**
* Executes the statement with no parameters.
*
* @return Datum execution result.
*/
@NotNull
public Datum execute();
}
Loading

0 comments on commit ecd8b5a

Please sign in to comment.