Repository: nifi
Updated Branches:
  refs/heads/master 1c6abcbd5 -> 0e9260746


NIFI-1412: Fix error during Avro conversion where no fields are present


Project: http://git-wip-us.apache.org/repos/asf/nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/91e7ba84
Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/91e7ba84
Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/91e7ba84

Branch: refs/heads/master
Commit: 91e7ba84e06eef67baff489a1f7d8bf83f1ed663
Parents: 8d37af0
Author: Matt Burgess <[email protected]>
Authored: Thu Jan 21 15:20:14 2016 -0500
Committer: Matt Burgess <[email protected]>
Committed: Mon Jan 25 08:35:14 2016 -0500

----------------------------------------------------------------------
 .../processors/standard/util/JdbcCommon.java    |  9 ++-
 .../standard/util/TestJdbcCommon.java           | 85 +++++++++++++-------
 2 files changed, 60 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/91e7ba84/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java
index 1a81b4b..ece131f 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java
@@ -127,9 +127,12 @@ public class JdbcCommon {
     public static Schema createSchema(final ResultSet rs) throws SQLException {
         final ResultSetMetaData meta = rs.getMetaData();
         final int nrOfColumns = meta.getColumnCount();
-        String tableName = meta.getTableName(1);
-        if (StringUtils.isBlank(tableName)) {
-            tableName = "NiFi_ExecuteSQL_Record";
+        String tableName = "NiFi_ExecuteSQL_Record";
+        if(nrOfColumns > 0) {
+            String tableNameFromMeta = meta.getTableName(1);
+            if (!StringUtils.isBlank(tableName)) {
+                tableName = tableNameFromMeta;
+            }
         }
 
         final FieldAssembler<Schema> builder = 
SchemaBuilder.record(tableName).namespace("any.data").fields();

http://git-wip-us.apache.org/repos/asf/nifi/blob/91e7ba84/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java
index 7b29cf8..6e0eb40 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java
@@ -18,6 +18,9 @@ package org.apache.nifi.processors.standard.util;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -101,6 +104,26 @@ public class TestJdbcCommon {
     }
 
     @Test
+    public void testCreateSchemaNoColumns() throws ClassNotFoundException, 
SQLException {
+
+        final ResultSet resultSet = mock(ResultSet.class);
+        final ResultSetMetaData resultSetMetaData = 
mock(ResultSetMetaData.class);
+        when(resultSet.getMetaData()).thenReturn(resultSetMetaData);
+        when(resultSetMetaData.getColumnCount()).thenReturn(0);
+        when(resultSetMetaData.getTableName(1)).thenThrow(SQLException.class);
+
+        final Schema schema = JdbcCommon.createSchema(resultSet);
+        assertNotNull(schema);
+
+        // records name, should be result set first column table name
+        // Notice! sql select may join data from different tables, other 
columns
+        // may have different table names
+        assertEquals("NiFi_ExecuteSQL_Record", schema.getName());
+        assertNull(schema.getField("ID"));
+
+    }
+
+    @Test
     public void testConvertToBytes() throws ClassNotFoundException, 
SQLException, IOException {
         // remove previous test database, if any
         folder.delete();
@@ -165,14 +188,14 @@ public class TestJdbcCommon {
                 continue;
             }
 
-            final ResultSetMetaData metadata = 
Mockito.mock(ResultSetMetaData.class);
-            Mockito.when(metadata.getColumnCount()).thenReturn(1);
-            Mockito.when(metadata.getColumnType(1)).thenReturn(type);
-            
Mockito.when(metadata.getColumnName(1)).thenReturn(field.getName());
-            Mockito.when(metadata.getTableName(1)).thenReturn("table");
+            final ResultSetMetaData metadata = mock(ResultSetMetaData.class);
+            when(metadata.getColumnCount()).thenReturn(1);
+            when(metadata.getColumnType(1)).thenReturn(type);
+            when(metadata.getColumnName(1)).thenReturn(field.getName());
+            when(metadata.getTableName(1)).thenReturn("table");
 
-            final ResultSet rs = Mockito.mock(ResultSet.class);
-            Mockito.when(rs.getMetaData()).thenReturn(metadata);
+            final ResultSet rs = mock(ResultSet.class);
+            when(rs.getMetaData()).thenReturn(metadata);
 
             try {
                 JdbcCommon.createSchema(rs);
@@ -185,15 +208,15 @@ public class TestJdbcCommon {
 
     @Test
     public void testSignedIntShouldBeInt() throws SQLException, 
IllegalArgumentException, IllegalAccessException {
-        final ResultSetMetaData metadata = 
Mockito.mock(ResultSetMetaData.class);
-        Mockito.when(metadata.getColumnCount()).thenReturn(1);
-        Mockito.when(metadata.getColumnType(1)).thenReturn(Types.INTEGER);
-        Mockito.when(metadata.isSigned(1)).thenReturn(true);
-        Mockito.when(metadata.getColumnName(1)).thenReturn("Col1");
-        Mockito.when(metadata.getTableName(1)).thenReturn("Table1");
+        final ResultSetMetaData metadata = mock(ResultSetMetaData.class);
+        when(metadata.getColumnCount()).thenReturn(1);
+        when(metadata.getColumnType(1)).thenReturn(Types.INTEGER);
+        when(metadata.isSigned(1)).thenReturn(true);
+        when(metadata.getColumnName(1)).thenReturn("Col1");
+        when(metadata.getTableName(1)).thenReturn("Table1");
 
-        final ResultSet rs = Mockito.mock(ResultSet.class);
-        Mockito.when(rs.getMetaData()).thenReturn(metadata);
+        final ResultSet rs = mock(ResultSet.class);
+        when(rs.getMetaData()).thenReturn(metadata);
 
         Schema schema = JdbcCommon.createSchema(rs);
         Assert.assertNotNull(schema);
@@ -219,15 +242,15 @@ public class TestJdbcCommon {
 
     @Test
     public void testUnsignedIntShouldBeLong() throws SQLException, 
IllegalArgumentException, IllegalAccessException {
-        final ResultSetMetaData metadata = 
Mockito.mock(ResultSetMetaData.class);
-        Mockito.when(metadata.getColumnCount()).thenReturn(1);
-        Mockito.when(metadata.getColumnType(1)).thenReturn(Types.INTEGER);
-        Mockito.when(metadata.isSigned(1)).thenReturn(false);
-        Mockito.when(metadata.getColumnName(1)).thenReturn("Col1");
-        Mockito.when(metadata.getTableName(1)).thenReturn("Table1");
+        final ResultSetMetaData metadata = mock(ResultSetMetaData.class);
+        when(metadata.getColumnCount()).thenReturn(1);
+        when(metadata.getColumnType(1)).thenReturn(Types.INTEGER);
+        when(metadata.isSigned(1)).thenReturn(false);
+        when(metadata.getColumnName(1)).thenReturn("Col1");
+        when(metadata.getTableName(1)).thenReturn("Table1");
 
-        final ResultSet rs = Mockito.mock(ResultSet.class);
-        Mockito.when(rs.getMetaData()).thenReturn(metadata);
+        final ResultSet rs = mock(ResultSet.class);
+        when(rs.getMetaData()).thenReturn(metadata);
 
         Schema schema = JdbcCommon.createSchema(rs);
         Assert.assertNotNull(schema);
@@ -254,14 +277,14 @@ public class TestJdbcCommon {
 
     @Test
     public void testConvertToAvroStreamForBigDecimal() throws SQLException, 
IOException {
-        final ResultSetMetaData metadata = 
Mockito.mock(ResultSetMetaData.class);
-        Mockito.when(metadata.getColumnCount()).thenReturn(1);
-        Mockito.when(metadata.getColumnType(1)).thenReturn(Types.NUMERIC);
-        Mockito.when(metadata.getColumnName(1)).thenReturn("Chairman");
-        Mockito.when(metadata.getTableName(1)).thenReturn("table");
+        final ResultSetMetaData metadata = mock(ResultSetMetaData.class);
+        when(metadata.getColumnCount()).thenReturn(1);
+        when(metadata.getColumnType(1)).thenReturn(Types.NUMERIC);
+        when(metadata.getColumnName(1)).thenReturn("Chairman");
+        when(metadata.getTableName(1)).thenReturn("table");
 
-        final ResultSet rs = Mockito.mock(ResultSet.class);
-        Mockito.when(rs.getMetaData()).thenReturn(metadata);
+        final ResultSet rs = mock(ResultSet.class);
+        when(rs.getMetaData()).thenReturn(metadata);
 
         final AtomicInteger counter = new AtomicInteger(1);
         Mockito.doAnswer(new Answer<Boolean>() {
@@ -272,7 +295,7 @@ public class TestJdbcCommon {
         }).when(rs).next();
 
         final BigDecimal bigDecimal = new BigDecimal(38D);
-        Mockito.when(rs.getObject(Mockito.anyInt())).thenReturn(bigDecimal);
+        when(rs.getObject(Mockito.anyInt())).thenReturn(bigDecimal);
 
         final ByteArrayOutputStream baos = new ByteArrayOutputStream();
 

Reply via email to