From e4d3a8add5388182cf7a12b1099678a0b769b106 Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Mon, 2 May 2022 14:28:28 +0200 Subject: 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. --- .../main/kotlin/org/opendc/trace/calcite/TraceTable.kt | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'opendc-trace/opendc-trace-calcite') 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::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> { + override fun scan(root: DataContext, filters: MutableList, projects: IntArray?): Enumerable> { + // 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(root) return object : AbstractEnumerable>() { override fun enumerator(): Enumerator> = - TraceReaderEnumerator(table.newReader(), table.columns, cancelFlag) + TraceReaderEnumerator(table.newReader(projection), projection ?: table.columns, cancelFlag) } } -- cgit v1.2.3