in cassandra-bigtable-migration-tools/cassandra-bigtable-proxy/translator/utils.go [2099:2158]
func createOrderedCodeKey(primaryKeys []schemaMapping.Column, values map[string]interface{}, encodeIntValuesWithBigEndian bool) ([]byte, error) {
fixedValues, err := convertAllValuesToRowKeyType(primaryKeys, values)
if err != nil {
return nil, err
}
var result []byte
var trailingEmptyFields []byte
for i, pmk := range primaryKeys {
if i != pmk.PkPrecedence-1 {
return nil, fmt.Errorf("wrong order for primary keys")
}
value, exists := fixedValues[pmk.ColumnName]
if !exists {
return nil, fmt.Errorf("missing primary key `%s`", pmk.ColumnName)
}
var orderEncodedField []byte
var err error
switch v := value.(type) {
case int64:
orderEncodedField, err = encodeInt64Key(v, encodeIntValuesWithBigEndian)
if err != nil {
return nil, err
}
case string:
orderEncodedField, err = Append(nil, v)
if err != nil {
return nil, err
}
// the ordered code library always appends a delimiter to strings, but we have custom delimiter logic so remove it
orderEncodedField = orderEncodedField[:len(orderEncodedField)-2]
default:
return nil, fmt.Errorf("unsupported row key type %T", value)
}
// Omit trailing empty fields from the encoding. We achieve this by holding
// them back in a separate buffer until we hit a non-empty field.
if len(orderEncodedField) == 0 {
trailingEmptyFields = append(trailingEmptyFields, kOrderedCodeEmptyField...)
trailingEmptyFields = append(trailingEmptyFields, kOrderedCodeDelimiter...)
continue
}
if len(result) != 0 {
result = append(result, kOrderedCodeDelimiter...)
}
// Since this field is non-empty, any empty fields we held back are not
// trailing and should not be omitted. Add them in before appending the
// latest field. Note that they will correctly end with a delimiter.
result = append(result, trailingEmptyFields...)
trailingEmptyFields = nil
// Finally, append the non-empty field
result = append(result, orderEncodedField...)
}
return result, nil
}