tessl install tessl/maven-org-apache-flink--flink-table-api-scala_2-12@1.20.0Scala API for Apache Flink's Table/SQL ecosystem providing idiomatic Scala interfaces for table operations
Core trait providing implicit conversions from Scala values to Flink expressions, enabling natural Scala syntax in table operations. This allows using Scala literals, symbols, and collections directly in table expressions.
Main entry point that extends ImplicitExpressionConversions to provide all implicit functionality.
package object api extends ImplicitExpressionConversionsUsage:
import org.apache.flink.table.api._
// All implicit conversions are now availablePredefined constants for over window operations.
implicit val UNBOUNDED_ROW: Expression
implicit val UNBOUNDED_RANGE: Expression
implicit val CURRENT_ROW: Expression
implicit val CURRENT_RANGE: ExpressionUsage:
// Use in over window definitions
table.window(Over.partitionBy($"userId").orderBy($"timestamp").preceding(UNBOUNDED_ROW))Methods for creating column references with different syntax styles.
/**
* Creates an unresolved reference to a table's column
* @param name Column name
* @return Expression representing the field reference
*/
def $(name: String): Expression
/**
* Synonym for $ method for cases where dollar sign would be inconvenient
* @param name Column name
* @return Expression representing the field reference
*/
def col(name: String): ExpressionSupport for creating field references using string interpolation.
implicit class FieldExpression(val sc: StringContext) {
/**
* Creates an unresolved reference to a table's column via string interpolation
* @param args Interpolation arguments
* @return Expression representing the field reference
*/
def $(args: Any*): Expression
}Usage:
// String interpolation syntax
table.select($"key", $"value")
// Dynamic field names
val fieldName = "userId"
table.select($"$fieldName", $"amount")Implicit conversion from Scala symbols to field expressions.
implicit def symbol2FieldExpression(sym: Symbol): Expression
implicit class UnresolvedFieldExpression(s: Symbol) extends ImplicitExpressionOperations {
def expr: Expression
}Usage:
// Using symbols for field references
table.select('name, 'age, 'email)
table.filter('age > 18)Implicit conversions from Scala primitives to expression literals.
// Numeric conversions
implicit def byte2Literal(b: Byte): Expression
implicit def short2Literal(s: Short): Expression
implicit def int2Literal(i: Int): Expression
implicit def long2Literal(l: Long): Expression
implicit def float2Literal(f: Float): Expression
implicit def double2Literal(d: Double): Expression
// Java numeric types
implicit def byte2Literal(b: JByte): Expression
implicit def short2Literal(s: JShort): Expression
implicit def int2Literal(i: JInteger): Expression
implicit def long2Literal(l: JLong): Expression
implicit def float2Literal(f: JFloat): Expression
implicit def double2Literal(d: JDouble): Expression
// String and boolean
implicit def string2Literal(str: String): Expression
implicit def boolean2Literal(bool: Boolean): Expression
implicit def boolean2Literal(bool: JBoolean): Expression
// Decimal types
implicit def javaDec2Literal(javaDec: JBigDecimal): Expression
implicit def scalaDec2Literal(scalaDec: BigDecimal): Expression
// Date/time types
implicit def sqlDate2Literal(sqlDate: Date): Expression
implicit def sqlTime2Literal(sqlTime: Time): Expression
implicit def sqlTimestamp2Literal(sqlTimestamp: Timestamp): Expression
implicit def localDate2Literal(localDate: LocalDate): Expression
implicit def localTime2Literal(localTime: LocalTime): Expression
implicit def localDateTime2Literal(localDateTime: LocalDateTime): ExpressionImplicit conversions from Scala and Java collections to array/map expressions.
implicit def javaList2ArrayConstructor(jList: JList[_]): Expression
implicit def seq2ArrayConstructor(seq: Seq[_]): Expression
implicit def array2ArrayConstructor(array: Array[_]): Expression
implicit def javaMap2MapConstructor(map: JMap[_, _]): Expression
implicit def map2MapConstructor(map: Map[_, _]): Expression
implicit def row2RowConstructor(rowObject: Row): ExpressionUsage:
// Collections as expressions
val numbers = List(1, 2, 3, 4)
table.select($"id", lit(numbers) as "numbers")
val config = Map("timeout" -> 30, "retries" -> 3)
table.select($"request", lit(config) as "config")Implicit conversion from Scala ranges to range expressions.
implicit def scalaRange2RangeExpression(range: Range.Inclusive): ExpressionUsage:
// Using ranges in column selection
table.select(withColumns(1 to 5)) // Select columns 1 through 5Wrapper classes that add expression operations to literal values.
implicit class LiteralLongExpression(l: Long) extends ImplicitExpressionOperations
implicit class LiteralIntExpression(i: Int) extends ImplicitExpressionOperations
implicit class LiteralStringExpression(str: String) extends ImplicitExpressionOperations
implicit class LiteralBooleanExpression(bool: Boolean) extends ImplicitExpressionOperations
// ... additional literal wrapper classes for all primitive typesUsage:
// Direct operations on literals
val result = table.select(
$"price" * 1.2 as "priceWithTax",
"Hello " + $"name" as "greeting",
42 + $"bonus" as "total"
)Explicit functions for creating literals with optional type specification.
/**
* Creates a SQL literal from a value with automatic type inference
* @param v Value to convert to literal
* @return Expression literal
*/
def lit(v: Any): Expression
/**
* Creates a SQL literal with explicit DataType
* @param v Value to convert to literal
* @param dataType Explicit data type
* @return Expression literal
*/
def lit(v: Any, dataType: DataType): ExpressionUsage:
// Automatic type inference
table.select(lit(42), lit("hello"), lit(true))
// Explicit typing
table.select(
lit(42, DataTypes.BIGINT()),
lit("2021-01-01", DataTypes.DATE()),
lit(null, DataTypes.STRING())
)Generic wrapper that adds operations to any type convertible to Expression.
implicit class AnyWithOperations[T](e: T)(implicit toExpr: T => Expression) extends ImplicitExpressionOperations {
def expr: Expression
}Wrapper that adds operations to existing Expression instances.
implicit class WithOperations(e: Expression) extends ImplicitExpressionOperations {
def expr: Expression
}Usage:
// Chain operations on any expression
val complexExpr = ($"amount" + 100) * 1.2 > $"threshold"
table.filter(complexExpr)