in nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/AbstractDatabaseFetchProcessor.java [330:465]
protected static String getMaxValueFromRow(ResultSet resultSet,
int columnIndex,
Integer type,
String maxValueString)
throws ParseException, IOException, SQLException {
// Skip any columns we're not keeping track of or whose value is null
if (type == null || resultSet.getObject(columnIndex) == null) {
return null;
}
switch (type) {
case CHAR:
case LONGNVARCHAR:
case LONGVARCHAR:
case NCHAR:
case NVARCHAR:
case VARCHAR:
case ROWID:
String colStringValue = resultSet.getString(columnIndex);
if (maxValueString == null || colStringValue.compareTo(maxValueString) > 0) {
return colStringValue;
}
break;
case INTEGER:
case SMALLINT:
case TINYINT:
Integer colIntValue = resultSet.getInt(columnIndex);
Integer maxIntValue = null;
if (maxValueString != null) {
maxIntValue = Integer.valueOf(maxValueString);
}
if (maxIntValue == null || colIntValue > maxIntValue) {
return colIntValue.toString();
}
break;
case BIGINT:
Long colLongValue = resultSet.getLong(columnIndex);
Long maxLongValue = null;
if (maxValueString != null) {
maxLongValue = Long.valueOf(maxValueString);
}
if (maxLongValue == null || colLongValue > maxLongValue) {
return colLongValue.toString();
}
break;
case FLOAT:
case REAL:
case DOUBLE:
Double colDoubleValue = resultSet.getDouble(columnIndex);
Double maxDoubleValue = null;
if (maxValueString != null) {
maxDoubleValue = Double.valueOf(maxValueString);
}
if (maxDoubleValue == null || colDoubleValue > maxDoubleValue) {
return colDoubleValue.toString();
}
break;
case DECIMAL:
case NUMERIC:
BigDecimal colBigDecimalValue = resultSet.getBigDecimal(columnIndex);
BigDecimal maxBigDecimalValue = null;
if (maxValueString != null) {
DecimalFormat df = new DecimalFormat();
df.setParseBigDecimal(true);
maxBigDecimalValue = (BigDecimal) df.parse(maxValueString);
}
if (maxBigDecimalValue == null || colBigDecimalValue.compareTo(maxBigDecimalValue) > 0) {
return colBigDecimalValue.toString();
}
break;
case DATE:
Date rawColDateValue = resultSet.getDate(columnIndex);
java.sql.Date colDateValue = new java.sql.Date(rawColDateValue.getTime());
java.sql.Date maxDateValue = null;
if (maxValueString != null) {
maxDateValue = java.sql.Date.valueOf(maxValueString);
}
if (maxDateValue == null || colDateValue.after(maxDateValue)) {
return colDateValue.toString();
}
break;
case TIME:
// Compare milliseconds-since-epoch. Need getTimestamp() instead of getTime() since some databases
// don't return milliseconds in the Time returned by getTime().
Instant colTimeValue = Instant.ofEpochMilli(resultSet.getTimestamp(columnIndex).getTime());
LocalTime maxTimeValue = null;
if (maxValueString != null) {
try {
maxTimeValue = LocalTime.parse(maxValueString, TIME_TYPE_FORMAT);
} catch (DateTimeParseException ignored) {
// Shouldn't happen, but just in case, leave the value as null so the new value will be stored
}
}
if (maxTimeValue == null || colTimeValue.isAfter(maxTimeValue.atDate(LocalDate.now()).atZone(ZoneId.systemDefault()).toInstant())) {
return TIME_TYPE_FORMAT.format(LocalTime.ofInstant(colTimeValue, ZoneId.systemDefault()));
}
break;
case TIMESTAMP:
Timestamp colTimestampValue = resultSet.getTimestamp(columnIndex);
java.sql.Timestamp maxTimestampValue = null;
if (maxValueString != null) {
// For backwards compatibility, the type might be TIMESTAMP but the state value is in DATE format. This should be a one-time occurrence as the next maximum value
// should be stored as a full timestamp. Even so, check to see if the value is missing time-of-day information, and use the "date" coercion rather than the
// "timestamp" coercion in that case
try {
maxTimestampValue = java.sql.Timestamp.valueOf(maxValueString);
} catch (IllegalArgumentException iae) {
maxTimestampValue = new java.sql.Timestamp(java.sql.Date.valueOf(maxValueString).getTime());
}
}
if (maxTimestampValue == null || colTimestampValue.after(maxTimestampValue)) {
return colTimestampValue.toString();
}
break;
case BIT:
case BOOLEAN:
case BINARY:
case VARBINARY:
case LONGVARBINARY:
case ARRAY:
case BLOB:
case CLOB:
default:
throw new IOException("Type for column " + columnIndex + " is not valid for maintaining maximum value");
}
return null;
}