public static HashResult fromSourceRecord()

in spanner-data-validator-java/src/main/java/com/google/migration/dto/HashResult.java [328:422]


  public static HashResult fromSourceRecord(SourceRecord sourceRecord,
      Integer keyIndex,
      String rangeFieldType,
      Boolean adjustTimestampPrecision,
      Integer timestampThresholdIndex) throws RuntimeException {

    HashResult retVal = new HashResult();
    StringBuilder sbConcatCols = new StringBuilder();
    for (int i = 0; i < sourceRecord.length(); i++) {
      Object colValue = sourceRecord.getField(i).getFieldValue();
      if (colValue == null) {
        continue;
      }
      String type = sourceRecord.getField(i).getFieldDataType();
      switch (type) {
        case "VARCHAR":
        case "CHAR":
        case "TEXT":
        case "UUID":
        case "BIT":
        case "BOOLEAN":
        case "INT":
        case "INTEGER":
        case "FLOAT":
        case "DOUBLE":
        case "BIGINT":
          sbConcatCols.append(colValue);
          break;
        case "JSONB":
        case "OTHER":
          sbConcatCols.append(getNormalizedJsonString(colValue.toString()));
          break;
        case "LONGVARBINARY":
        case "VARBINARY":
          sbConcatCols.append(Base64.encodeBase64String((byte[]) colValue));
          break;
        case "NUMERIC":
        case "DECIMAL":
          sbConcatCols.append(new BigDecimal(colValue.toString()).stripTrailingZeros().toPlainString());
          break;
        case "DATE":
          LocalDate localDate = ((java.sql.Date) colValue).toLocalDate();
          sbConcatCols.append(
              String.format("%d%d%d",
                  localDate.getYear(),
                  localDate.getMonth().getValue(),
                  localDate.getDayOfMonth())
          );
        case "TIMESTAMP":
          Timestamp timeStampVal = (Timestamp) colValue;
          Long rawTimestamp = timeStampVal.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 "ARRAY":
          String[] vals = (String[]) colValue;
          for (String val : vals) {
            sbConcatCols.append(val);
          }
          break;
        default:
          LOG.error("Unsupported type: {}", type);
          throw new RuntimeException(String.format("Unsupported type: %s", type));
      }
    }

    switch(rangeFieldType) {
      case TableSpec.UUID_FIELD_TYPE:
      case TableSpec.STRING_FIELD_TYPE:
      case TableSpec.TIMESTAMP_FIELD_TYPE:
      case TableSpec.INT_FIELD_TYPE:
      case TableSpec.LONG_FIELD_TYPE:
        retVal.key = sourceRecord.getField(keyIndex).getFieldValue().toString();
        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 = true;
    LOG.debug("SourceHash=> Key={}, OrigValue={} \n HashResult={}", retVal.key, retVal.origValue, retVal.sha256);
    return retVal;
  }