[ https://issues.apache.org/jira/browse/FLINK-4554?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15726106#comment-15726106 ]
ASF GitHub Bot commented on FLINK-4554: --------------------------------------- Github user fhueske commented on a diff in the pull request: https://github.com/apache/flink/pull/2919#discussion_r91123689 --- Diff: flink-libraries/flink-table/src/main/scala/org/apache/flink/api/table/expressions/array.scala --- @@ -0,0 +1,140 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.flink.api.table.expressions + +import org.apache.calcite.rex.RexNode +import org.apache.calcite.sql.fun.SqlStdOperatorTable +import org.apache.calcite.tools.RelBuilder +import org.apache.flink.api.common.typeinfo.BasicTypeInfo.INT_TYPE_INFO +import org.apache.flink.api.common.typeinfo.{BasicTypeInfo, PrimitiveArrayTypeInfo, TypeInformation} +import org.apache.flink.api.java.typeutils.ObjectArrayTypeInfo +import org.apache.flink.api.table.FlinkRelBuilder +import org.apache.flink.api.table.validate.{ValidationFailure, ValidationResult, ValidationSuccess} + +import scala.collection.JavaConverters._ + +case class ArrayConstructor(elements: Seq[Expression]) extends Expression { + + override private[flink] def children: Seq[Expression] = elements + + override private[flink] def toRexNode(implicit relBuilder: RelBuilder): RexNode = { + val relDataType = relBuilder + .asInstanceOf[FlinkRelBuilder] + .getTypeFactory + .createTypeFromTypeInfo(resultType) + val values = elements.map(_.toRexNode).toList.asJava + relBuilder + .getRexBuilder + .makeCall(relDataType, SqlStdOperatorTable.ARRAY_VALUE_CONSTRUCTOR, values) + } + + override def toString = s"array(${elements.mkString(", ")})" + + override private[flink] def resultType = ObjectArrayTypeInfo.getInfoFor(elements.head.resultType) + + override private[flink] def validateInput(): ValidationResult = { + if (elements.isEmpty) { + return ValidationFailure("Empty arrays are not supported yet.") + } + val elementType = elements.head.resultType + if (!elements.forall(_.resultType == elementType)) { + ValidationFailure("Not all elements of the array have the same type.") + } else { + ValidationSuccess + } + } +} + +case class ArrayElementAt(array: Expression, index: Expression) extends Expression { + + override private[flink] def children: Seq[Expression] = Seq(array, index) + + override private[flink] def toRexNode(implicit relBuilder: RelBuilder): RexNode = { + relBuilder + .getRexBuilder + .makeCall(SqlStdOperatorTable.ITEM, array.toRexNode, index.toRexNode) + } + + override def toString = s"($array).at($index)" + + override private[flink] def resultType = array.resultType match { + case oati: ObjectArrayTypeInfo[_, _] => oati.getComponentInfo + case pati: PrimitiveArrayTypeInfo[_] => pati.getComponentType + } + + override private[flink] def validateInput(): ValidationResult = { --- End diff -- Does it make sense to check that the index is `> 0` if it is a literal? > Add support for array types > --------------------------- > > Key: FLINK-4554 > URL: https://issues.apache.org/jira/browse/FLINK-4554 > Project: Flink > Issue Type: New Feature > Components: Table API & SQL > Reporter: Timo Walther > Assignee: Timo Walther > > Support creating arrays: > {code}ARRAY[1, 2, 3]{code} > Access array values: > {code}myArray[3]{code} > And operations like: > {{UNNEST, UNNEST WITH ORDINALITY, CARDINALITY}} -- This message was sent by Atlassian JIRA (v6.3.4#6332)