Skip to content

Commit

Permalink
Better way to get product elements (#264)
Browse files Browse the repository at this point in the history
* Better way to get product elements

Signed-off-by: Hongxin Liang <[email protected]>

* More comment

Signed-off-by: Hongxin Liang <[email protected]>

---------

Signed-off-by: Hongxin Liang <[email protected]>
  • Loading branch information
honnix authored Oct 24, 2023
1 parent a4864aa commit 54d2410
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -229,11 +229,7 @@ object SdkLiteralTypes {

private def toStruct(product: Product): Struct = {
def productToMap(product: Product): Map[String, Any] = {
// by spec getDeclaredFields is not ordered but in practice it works fine
// it's a lot better since Scala 2.13 because productElementNames was introduced
// (product.productElementNames zip product.productIterator).toMap
product.getClass.getDeclaredFields
.map(_.getName)
productElementNames(product)
.zip(product.productIterator.toList)
.toMap
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,8 +165,7 @@ object SdkScalaType {
): ju.Map[String, SdkBindingData[_]] = {
value match {
case product: Product =>
value.getClass.getDeclaredFields
.map(_.getName)
productElementNames(product)
.zip(product.productIterator.toSeq)
.toMap
.mapValues {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* Copyright 2023 Flyte Authors.
*
* Licensed 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.flyte

package object flytekitscala {
private[flytekitscala] def productElementNames(
product: Product
): List[String] = {
try {
// scala 2.13
product.getClass
.getMethod("productElementNames")
.invoke(product)
.asInstanceOf[Iterator[String]]
.toList
} catch {
case _: Throwable =>
// fall back to java's way, less reliable and with limitations
product.getClass.getDeclaredFields.map(_.getName).toList
}
}
}

0 comments on commit 54d2410

Please sign in to comment.