diff options
| author | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2022-05-02 14:28:28 +0200 |
|---|---|---|
| committer | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2022-05-02 15:37:04 +0200 |
| commit | e4d3a8add5388182cf7a12b1099678a0b769b106 (patch) | |
| tree | 44221b3a39516a235a0b41adf525a79a60abb998 /opendc-trace/opendc-trace-calcite/src/main | |
| parent | 670cd279ea7789e07b6d778a21fdec68347ab305 (diff) | |
perf(trace/calcite): Add support for projections
This change adds support for projections in the Apache Calcite
integration with OpenDC. This enables faster queries when only a subset
of the table columns is selected.
Diffstat (limited to 'opendc-trace/opendc-trace-calcite/src/main')
| -rw-r--r-- | opendc-trace/opendc-trace-calcite/src/main/kotlin/org/opendc/trace/calcite/TraceTable.kt | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/opendc-trace/opendc-trace-calcite/src/main/kotlin/org/opendc/trace/calcite/TraceTable.kt b/opendc-trace/opendc-trace-calcite/src/main/kotlin/org/opendc/trace/calcite/TraceTable.kt index af521297..8c571b82 100644 --- a/opendc-trace/opendc-trace-calcite/src/main/kotlin/org/opendc/trace/calcite/TraceTable.kt +++ b/opendc-trace/opendc-trace-calcite/src/main/kotlin/org/opendc/trace/calcite/TraceTable.kt @@ -35,10 +35,7 @@ import org.apache.calcite.rel.logical.LogicalTableModify import org.apache.calcite.rel.type.RelDataType import org.apache.calcite.rel.type.RelDataTypeFactory import org.apache.calcite.rex.RexNode -import org.apache.calcite.schema.ModifiableTable -import org.apache.calcite.schema.ScannableTable -import org.apache.calcite.schema.SchemaPlus -import org.apache.calcite.schema.Table +import org.apache.calcite.schema.* import org.apache.calcite.schema.impl.AbstractTableQueryable import org.apache.calcite.sql.type.SqlTypeName import java.time.Duration @@ -50,7 +47,7 @@ import java.util.concurrent.atomic.AtomicBoolean */ internal class TraceTable(private val table: org.opendc.trace.Table) : AbstractQueryableTable(Array<Any?>::class.java), - ScannableTable, + ProjectableFilterableTable, ModifiableTable, InsertableTable { private var rowType: RelDataType? = null @@ -65,11 +62,15 @@ internal class TraceTable(private val table: org.opendc.trace.Table) : return rowType } - override fun scan(root: DataContext): Enumerable<Array<Any?>> { + override fun scan(root: DataContext, filters: MutableList<RexNode>, projects: IntArray?): Enumerable<Array<Any?>> { + // Filters are currently not supported by the OpenDC trace API. By keeping the filters in the list, Calcite + // assumes that they are declined and will perform the filters itself. + + val projection = projects?.map { table.columns[it] } val cancelFlag = DataContext.Variable.CANCEL_FLAG.get<AtomicBoolean>(root) return object : AbstractEnumerable<Array<Any?>>() { override fun enumerator(): Enumerator<Array<Any?>> = - TraceReaderEnumerator(table.newReader(), table.columns, cancelFlag) + TraceReaderEnumerator(table.newReader(projection), projection ?: table.columns, cancelFlag) } } |
