SundayT1998/milvus-client/column does not have a README file

    ColumnError

    pub(all) suberror ColumnError {
    DataTypeNotMatch(String)
    UnsupportedType(String)
    IndexOutOfRange(String)
    MalformedPayload(String)
    NullValue(String)
    } derive(
    Debug
    )

    Errors raised while decoding a FieldData into a column, or while reading a row out of one. The text is the observable behaviour of this module, so it is phrased after the upstream client/column wording where the two reject the same input.

    ColumnError::to_repr

    #deprecated("`ColumnError::to_repr` is deprecated, use `@moonbitlang/core/debug.Debug::to_repr` instead.")
    fn ColumnError::to_repr(ColumnError) ->
    Repr

    ArrayValue

    pub(all) enum ArrayValue {
    Bool(Array[Bool])
    Int8(Array[Int])
    Int16(Array[Int])
    Int32(Array[Int])
    Int64(Array[Int64])
    Float(Array[Float])
    Double(Array[Double])
    String(Array[String])
    } derive(Eq,
    Debug
    )

    Array 列的一行:元素类型固定的一种标量数组。数组元素只能是标量, 所以比 ColumnValue 窄。

    Cell

    pub(all) enum Cell {
    Bool(Bool)
    Int8(Int)
    Int16(Int)
    Int32(Int)
    Int64(Int64)
    Float(Float)
    Double(Double)
    String(String)
    VarChar(String)
    Text(String)
    Timestamptz(Int64)
    Json(Bytes)
    Geometry(String)
    Array(ArrayValue)
    FloatVector(Array[Float])
    Float16Vector(Array[Float])
    BFloat16Vector(Array[Float])
    BinaryVector(Bytes)
    Int8Vector(Bytes)
    SparseFloatVector(
    SparseFloatVector
    )
    Null
    } derive(Eq,
    Debug
    )

    一行的值。与 ColumnValue 一一对应,只是每项至多一个元素。

    Null 单独一个成员,而不是让 Get 返回 Cell?:一整列全空时 仍要能区分「第 3 行是 null」和「列就这么长」,Cell 自己承载这个区别。

    Column

    pub(all) struct Column {
    column : ColumnValue
    nullable : Bool
    valid : Array[Bool]
    } derive(
    Debug
    )

    一列:列的值加上可空信息。nullable 为 false 时 valid 为空, 每一行都有值;为 true 时 valid 逐行给出该行是否有值(false 即 null),长度等于逻辑行数。

    上游把 nullable 和 validData 放在共享的 genericColumnBase 里, 具体列类型各自内嵌它;这里把两者提到 Column 这一层,因为 MoonBit 的枚举没法共享字段。

    Column::data_type

    该列对应的 Milvus 数据类型。ColumnValue 的成员是逐类型展开的, 所以这是一张直接表。

    Column::get

    fn Column::get(self : Column, idx : Int) -> Cell raise ColumnError

    第 idx 行的值。null 行返回 Cell::Null。

    可空列的数据按上游约定分两种布局:valid 长度等于数据长度时(行满) 数据行与逻辑行一一对应;否则数据是紧凑的,null 行不占位,需要把逻辑 下标映射到物理下标。value_index 负责这件事,下面所有取值都走它。

    Column::get_as_bool

    fn Column::get_as_bool(self : Column, idx : Int) -> Bool raise ColumnError

    第 idx 行读成布尔。

    Column::get_as_bytes

    fn Column::get_as_bytes(self : Column, idx : Int) -> Bytes raise ColumnError

    第 idx 行读成原始字节。JSON 列(动态字段)与 Bytes 语义的列走这里。

    Column::get_as_double

    fn Column::get_as_double(self : Column, idx : Int) -> Double raise ColumnError

    第 idx 行读成双精度浮点。Float / Double 可读,Int* 不隐式转浮点。

    Column::get_as_int64

    fn Column::get_as_int64(self : Column, idx : Int) -> Int64 raise ColumnError

    第 idx 行读成整数。

    与上游一致,Int8 / Int16 / Int32 / Int64 与 Timestamptz 都可读, 不做跨大类转换:读 Float 列要整数是调用方的错,直接报出来。

    Column::get_as_json_string

    fn Column::get_as_json_string(self : Column, idx : Int) -> String raise ColumnError

    第 idx 行动态字段(JSON)的文本。上游把动态字段按 tidwall/gjson 取路径后再返回;本 Issue 明确不提供路径查询,所以这里只把服务端给的 JSON 原样解成字符串——它就是原 payload 的 UTF-8 文本,不做重新序列化, 免得改变键序或数字格式。

    非 UTF-8 的 payload 会被替换字符顶掉(Bytes::to_unchecked_string 不校验,String::from_utf8? 会校验)。这里校验并报错,因为「取回一段 读不了的文本」比报错更难查。

    Column::get_as_string

    fn Column::get_as_string(self : Column, idx : Int) -> String raise ColumnError

    第 idx 行读成字符串。String / VarChar / Text / Geometry 可读; JSON 列要的是原始字节,用 get_as_bytes。

    Column::is_null

    fn Column::is_null(self : Column, idx : Int) -> Bool raise ColumnError

    第 idx 行是否为 null。越界报错;非空列恒为 false。

    Column::len

    fn Column::len(self : Column) -> Int

    逻辑行数。可空列以 valid 的长度为准——数据行可能比它短,那是紧凑 布局;非空列就是数据的长度。

    Column::slice

    fn Column::slice(self : Column, begin : Int, end : Int) -> Column

    圈出 [begin, end) 这几行,得到一列等价的窄列。end 为负表示到末尾, 与 from_field_data 的区间参数同一套约定。越界即夹取,不报错 —— 想取 5 行而列里只有 2 行,是调用方正常会撞上的情形,不是 bug。

    与 from_field_data 的 begin / end 是同一件事,区别是那个作用于 线上 payload(还没成列),这个作用于已经解好的列。

    Column::valid_count

    fn Column::valid_count(self : Column) -> Int

    有效行数:valid 里 true 的个数,非空列等于 len()。 上游 ValidCount。

    ColumnValue

    pub(all) enum ColumnValue {
    Bool(Array[Bool])
    Int8(Array[Int])
    Int16(Array[Int])
    Int32(Array[Int])
    Int64(Array[Int64])
    Float(Array[Float])
    Double(Array[Double])
    String(Array[String])
    VarChar(Array[String])
    Text(Array[String])
    Timestamptz(Array[Int64])
    Json(Array[Bytes])
    Geometry(Array[String])
    Array(Array[ArrayValue])
    FloatVector(Int, Array[Array[Float]])
    Float16Vector(Int, Array[Array[Float]])
    BFloat16Vector(Int, Array[Array[Float]])
    BinaryVector(Int, Array[Bytes])
    Int8Vector(Int, Array[Bytes])
    SparseFloatVector(Array[
    SparseFloatVector
    ])
    } derive(Eq,
    Debug
    )

    一列的值。每个成员对应上游一个 ColumnXxx。

    定长标量按原宽度保存(Int8 存 Int,不是 Byte),因为 Milvus 的 IntArray 在线上就是 int32,缩短再还原只会引入一类没必要的截断。 Json 与 Bytes 保留原始字节而不是解析后的树:Issue 要求动态字段 以 JSON 字符串形式取回,路径查询留给调用方。

    from_field_data

    fn from_field_data(field :
    FieldData
    , begin? : Int, end? : Int) -> Column raise ColumnError

    把一条 FieldData 解成一列。

    begin / end 是行区间,end 为负表示到末尾(上游用 -1 表达这一点, 这里照搬,因为查询/检索回读确实会按批次切片)。区间按逻辑行算: 可空列先圈 valid_data,再据此找到数据里的对应段。

    这是本 Issue 的核心入口:Query / Search 返回的每一种列类型都从这里过。