Current section
Files
Jump to
Current section
Files
lib/cql/result/rows.ex
defmodule CQL.Result.Rows do
import CQL.DataTypes.Decoder
defstruct [:metadata, :data]
def decode(buffer) do
{meta, buffer} = unpack buffer,
metadata: &CQL.MetaData.decode/1,
rows_count: :int
{data, ""} = ntimes(meta.rows_count, row_content(meta.metadata), buffer)
keys = Keyword.keys(meta.metadata.column_types)
data = Enum.map(data, &to_map(keys, &1))
%__MODULE__{metadata: meta.metadata, data: data}
end
def to_map(%__MODULE__{metadata: metadata, data: data}) do
keys = Keyword.keys(metadata.column_types)
data
|> Enum.map(&to_map(keys, &1))
end
defp to_map(keys, values) do
keys
|> Enum.zip(values)
|> Enum.into(%{})
end
defp row_content(metadata) do
types = Keyword.values(metadata.column_types)
fn binary ->
{row, rest} = ntimes(metadata.columns_count, &bytes/1, binary)
{parse(row, types), rest}
end
end
defp parse(row_content, types) do
types
|> Enum.zip(row_content)
|> Enum.map(&CQL.DataTypes.decode/1)
end
end