rcosnita commented on issue #1734:
URL: 
https://github.com/apache/cassandra-gocql-driver/issues/1734#issuecomment-2327419047

   Hello everyone,
   
   For people who are using version 4 of the protocol but need to be able to 
write vectors from their code base here is a possible idea:
   
   ```go
   package warm
   
   import (
        "fmt"
   
        "github.com/gocql/gocql"
   )
   
   func encInt(v int32) []byte {
        return []byte{byte(v >> 24), byte(v >> 16), byte(v >> 8), byte(v)}
   }
   
   func encFloat(v float32) []byte {
        return encInt(int32(math.Float32bits(v)))
   }
   
   type Float32Vector struct {
        value      []float32
        dimensions int
   }
   
   func (m *Float32Vector) MarshalCQL(info gocql.TypeInfo) ([]byte, error) {
        if len(m.value) != m.dimensions {
                return nil, fmt.Errorf("float32vector expects size %d but 
received size %d",
                        m.dimensions, len(m.value))
        }
   
        var results []byte
        for _, part := range m.value {
                results = append(results, encFloat(part)...)
        }
   
        return results, nil
   }
   
   func (m *Float32Vector) UnmarshalCQL(info gocql.TypeInfo, data []byte) error 
{
        panic("unmarshalling vector is not fully implemented")
   }
   
   func (m *Float32Vector) Value() []float32 {
        return m.value
   }
   
   func ensureVectorDimension(values []float32, dimensions int) []float32 {
        if len(values) == dimensions {
                return values
        }
   
        delta := dimensions - len(values)
        result := make([]float32, dimensions)
        for idx, v := range values {
                if idx < dimensions {
                        result[idx] = v
                } else {
                      break
                   }
        }
   
        for idx := len(values); idx < delta+len(values); idx++ {
                result[idx] = 0.0
        }
   
        return result
   }
   
   func FromVectorFloat32(value []float32, dimensions int) *Float32Vector {
        return &Float32Vector{
                value:      ensureVectorDimension(value, dimensions),
                dimensions: dimensions,
        }
   }
   ```
   
   You can opt to skip the padding completely and return an error if that feels 
more natural for your use case. The encoding functions are extracted from the 
existing gocql codebase.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to