Skip to content

Commit

Permalink
Merge 7476b17 into 480c903
Browse files Browse the repository at this point in the history
  • Loading branch information
rchowell authored Dec 20, 2023
2 parents 480c903 + 7476b17 commit a05115c
Show file tree
Hide file tree
Showing 18 changed files with 558 additions and 141 deletions.
48 changes: 4 additions & 44 deletions partiql-eval/src/main/kotlin/org/partiql/eval/PartiQLEngine.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
package org.partiql.eval

import org.partiql.eval.internal.Compiler
import org.partiql.eval.internal.Record
import org.partiql.plan.PartiQLPlan
import org.partiql.spi.Plugin
import org.partiql.value.PartiQLValue
import org.partiql.value.PartiQLValueExperimental

/**
* PartiQL's Experimental Engine.
Expand All @@ -29,46 +24,11 @@ public interface PartiQLEngine {
public fun execute(statement: PartiQLStatement<*>): PartiQLResult

companion object {
@JvmStatic
@JvmOverloads
fun default(plugins: List<Plugin> = emptyList()) = Builder().plugins(plugins).build()
}

public class Builder {

private var plugins: List<Plugin> = emptyList()

public fun plugins(plugins: List<Plugin>): Builder = this.apply {
this.plugins = plugins
}

public fun build(): PartiQLEngine = Default(plugins)
}

private class Default(private val plugins: List<Plugin>) : PartiQLEngine {

@OptIn(PartiQLValueExperimental::class)
override fun prepare(plan: PartiQLPlan): PartiQLStatement<*> {
// Close over the expression.
// Right now we are assuming we only have a query statement hence a value statement.
val expression = Compiler.compile(plan)
return object : PartiQLStatement.Query {
override fun execute(): PartiQLValue {
return expression.eval(Record.empty)
}
}
}
@JvmStatic
public fun builder(): PartiQLEngineBuilder = PartiQLEngineBuilder()

@OptIn(PartiQLValueExperimental::class)
override fun execute(statement: PartiQLStatement<*>): PartiQLResult {
return when (statement) {
is PartiQLStatement.Query -> try {
val value = statement.execute()
PartiQLResult.Value(value)
} catch (ex: Exception) {
PartiQLResult.Error(ex)
}
}
}
@JvmStatic
fun default() = PartiQLEngineBuilder().build()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.partiql.eval

import org.partiql.spi.connector.ConnectorBindings

class PartiQLEngineBuilder {

private var catalogs: MutableMap<String, ConnectorBindings> = mutableMapOf()

/**
* Build the builder, return an implementation of a [PartiQLEngine]
*
* @return
*/
public fun build(): PartiQLEngine = PartiQLEngineDefault(catalogs)

/**
* Java style method for assigning a Catalog name to [ConnectorBindings].
*
* @param catalog
* @param metadata
* @return
*/
public fun addCatalog(catalog: String, bindings: ConnectorBindings): PartiQLEngineBuilder = this.apply {
this.catalogs[catalog] = bindings
}

/**
* Kotlin style method for assigning Catalog names to [ConnectorBindings].
*
* @param catalogs
* @return
*/
public fun catalogs(vararg catalogs: Pair<String, ConnectorBindings>): PartiQLEngineBuilder = this.apply {
this.catalogs = mutableMapOf(*catalogs)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package org.partiql.eval

import org.partiql.eval.internal.Compiler
import org.partiql.eval.internal.Record
import org.partiql.plan.PartiQLPlan
import org.partiql.spi.connector.ConnectorBindings
import org.partiql.value.PartiQLValue
import org.partiql.value.PartiQLValueExperimental

internal class PartiQLEngineDefault(
private val catalogs: Map<String, ConnectorBindings>,
) : PartiQLEngine {

@OptIn(PartiQLValueExperimental::class)
override fun prepare(plan: PartiQLPlan): PartiQLStatement<*> {
try {
val compiler = Compiler(plan, catalogs)
val expression = compiler.compile()
return object : PartiQLStatement.Query {
override fun execute(): PartiQLValue {
return expression.eval(Record.empty)
}
}
} catch (ex: Exception) {
// TODO wrap in some PartiQL Exception
throw ex
}
}

@OptIn(PartiQLValueExperimental::class)
override fun execute(statement: PartiQLStatement<*>): PartiQLResult {
return when (statement) {
is PartiQLStatement.Query -> try {
val value = statement.execute()
PartiQLResult.Value(value)
} catch (ex: Exception) {
PartiQLResult.Error(ex)
}
}
}
}
Loading

0 comments on commit a05115c

Please sign in to comment.