public static HashResult fromSpannerStruct()

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;
  }