in spanner-data-validator-java/src/main/java/com/google/migration/dto/HashResult.java [77:171]
public static HashResult fromSpannerStruct(Struct spannerStruct,
Integer keyIndex,
String rangeFieldType,
Boolean adjustTimestampPrecision,
Integer timestampThresholdIndex) {
HashResult retVal = new HashResult();
int nCols = spannerStruct.getColumnCount();
StringBuilder sbConcatCols = new StringBuilder();
for(int i = 0; i < nCols; i++) {
Type colType = spannerStruct.getColumnType(i);
switch (colType.toString()) {
case "STRING":
sbConcatCols.append(spannerStruct.isNull(i) ? "" : spannerStruct.getString(i));
break;
case "JSON":
if(!spannerStruct.isNull(i)) {
sbConcatCols.append(getNormalizedJsonString(spannerStruct.getJson(i)));
}
break;
case "JSON<PG_JSONB>":
if(!spannerStruct.isNull(i)) {
sbConcatCols.append(getNormalizedJsonString(spannerStruct.getPgJsonb(i)));
}
break;
case "BYTES":
sbConcatCols.append(spannerStruct.isNull(i) ? "" : Base64.encodeBase64String(spannerStruct.getBytes(i).toByteArray()));
break;
case "INT64":
sbConcatCols.append(spannerStruct.isNull(i) ? "" : spannerStruct.getLong(i));
break;
case "FLOAT64":
sbConcatCols.append(spannerStruct.isNull(i) ? "" : spannerStruct.getDouble(i));
break;
case "NUMERIC":
sbConcatCols.append(spannerStruct.isNull(i) ? "" : spannerStruct.getBigDecimal(i));
break;
case "TIMESTAMP":
// TODO: This uses millisecond precision; consider using microsecond precision
if(!spannerStruct.isNull(i)) {
Long rawTimestamp = spannerStruct.getTimestamp(i).toSqlTimestamp().getTime();
if (adjustTimestampPrecision)
rawTimestamp = rawTimestamp / 1000;
sbConcatCols.append(rawTimestamp);
if(timestampThresholdIndex >= 0) {
if(i == timestampThresholdIndex) {
retVal.timestampThresholdValue = rawTimestamp;
if(adjustTimestampPrecision)
retVal.timestampThresholdValue = retVal.timestampThresholdValue * 1000;
}
}
}
break;
case "DATE":
if(!spannerStruct.isNull(i)) {
com.google.cloud.Date date = spannerStruct.getDate(i);
sbConcatCols.append(String.format("%d%d%d",
date.getYear(),
date.getMonth(),
date.getDayOfMonth()));
}
break;
case "BOOL":
case "BOOLEAN":
sbConcatCols.append(spannerStruct.isNull(i) ? "" : spannerStruct.getBoolean(i));
break;
default:
throw new RuntimeException(String.format("Unsupported type: %s", colType));
} // switch
} // for
switch(rangeFieldType) {
case TableSpec.UUID_FIELD_TYPE:
case TableSpec.STRING_FIELD_TYPE:
retVal.key = spannerStruct.getString(keyIndex);
break;
case TableSpec.TIMESTAMP_FIELD_TYPE:
retVal.key = spannerStruct.getTimestamp(keyIndex).toSqlTimestamp().toString();
break;
case TableSpec.INT_FIELD_TYPE:
case TableSpec.LONG_FIELD_TYPE:
retVal.key = String.valueOf(spannerStruct.getLong(keyIndex));
break;
default:
throw new RuntimeException(String.format("Unexpected range field type %s", rangeFieldType));
}
retVal.rangeFieldType = rangeFieldType;
retVal.origValue = sbConcatCols.toString();
retVal.sha256 = Helpers.sha256(retVal.origValue);
retVal.isSource = false;
LOG.debug("SpannerHash=> Key={}, OrigValue={} \n HashResult={}", retVal.key, retVal.origValue, retVal.sha256);
return retVal;
}