Merge branch 'NIFI-1412' of https://github.com/mattyb149/nifi into NIFI-1412

This commit is contained in:
Mark Payne 2016-01-26 12:30:19 -05:00
commit 0e92607466
2 changed files with 60 additions and 34 deletions

View File

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

View File

@ -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;
@ -100,6 +103,26 @@ public class TestJdbcCommon {
con.close();
}
@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
@ -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();