From e2c1139ac8e104d4f4a8a8b7075875652b0174b9 Mon Sep 17 00:00:00 2001
From: Vladimir Sitnikov <sitnikov.vladimir@gmail.com>
Date: Wed, 2 Sep 2020 16:01:14 +0300
Subject: [PATCH] Refactor ResultSetEnumerable to avoid nested lambdas

This reduces the likelihood of javac issues.

See https://github.com/policeman-tools/forbidden-apis/issues/173
---
 .../calcite/runtime/ResultSetEnumerable.java  | 70 ++++++++++---------
 1 file changed, 37 insertions(+), 33 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java b/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java
index 9dc39a7893a9..20870cad13c9 100644
--- a/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java
+++ b/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java
@@ -91,30 +91,32 @@ public class ResultSetEnumerable<T> extends AbstractEnumerable<T> {
             }
           };
         } else {
-          //noinspection unchecked
-          return (Function0) () -> {
-            try {
-              final List<Object> list = new ArrayList<>();
-              for (int i = 0; i < columnCount; i++) {
-                if (metaData.getColumnType(i + 1) == Types.TIMESTAMP) {
-                  long v = resultSet.getLong(i + 1);
-                  if (v == 0 && resultSet.wasNull()) {
-                    list.add(null);
-                  } else {
-                    list.add(v);
-                  }
-                } else {
-                  list.add(resultSet.getObject(i + 1));
-                }
-              }
-              return list.toArray();
-            } catch (SQLException e) {
-              throw new RuntimeException(e);
-            }
-          };
+          return () -> convertColumns(resultSet, metaData, columnCount);
         }
       };
 
+  private static Object[] convertColumns(ResultSet resultSet, ResultSetMetaData metaData,
+      int columnCount) {
+    final List<Object> list = new ArrayList<>(columnCount);
+    try {
+      for (int i = 0; i < columnCount; i++) {
+        if (metaData.getColumnType(i + 1) == Types.TIMESTAMP) {
+          long v = resultSet.getLong(i + 1);
+          if (v == 0 && resultSet.wasNull()) {
+            list.add(null);
+          } else {
+            list.add(v);
+          }
+        } else {
+          list.add(resultSet.getObject(i + 1));
+        }
+      }
+      return list.toArray();
+    } catch (SQLException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
   private ResultSetEnumerable(
       DataSource dataSource,
       String sql,
@@ -423,21 +425,23 @@ private static class ResultSetEnumerator<T> implements Enumerator<T> {
           }
         };
       }
-      //noinspection unchecked
-      return (Function0) () -> {
-        try {
-          final List<Object> list = new ArrayList<>();
-          for (int i = 0; i < columnCount; i++) {
-            list.add(primitives[i].jdbcGet(resultSet, i + 1));
-          }
-          return list.toArray();
-        } catch (SQLException e) {
-          throw new RuntimeException(e);
-        }
-      };
+      return () -> convertPrimitiveColumns(primitives, resultSet, columnCount);
     };
   }
 
+  private static Object[] convertPrimitiveColumns(Primitive[] primitives,
+      ResultSet resultSet, int columnCount) {
+    final List<Object> list = new ArrayList<>(columnCount);
+    try {
+      for (int i = 0; i < columnCount; i++) {
+        list.add(primitives[i].jdbcGet(resultSet, i + 1));
+      }
+      return list.toArray();
+    } catch (SQLException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
   /**
    * Consumer for decorating a {@link PreparedStatement}, that is, setting
    * its parameters.