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();
