Current section
Files
Jump to
Current section
Files
lib/ecto/roaring_bitset_64.ex
defmodule EctoRoaring.RoaringBitmap64 do
@moduledoc """
Ecto support for loading RoaringBitmap64 from the DB.
Usage:
create table(:sets) do
add :membership_64, :bytea
end
schema "sets" do
field :membership_64, EctoRoaring.RoaringBitmap64
end
"""
use Ecto.Type
def type(), do: :binary
def cast(nil), do: {:ok, nil}
def cast(list) when is_list(list) do
RoaringBitmap64.from_list(list)
end
def cast(bitset) when is_reference(bitset) do
{:ok, bitset}
end
def cast(data) when is_binary(data) do
RoaringBitmap64.deserialize(data)
end
def load(data) when is_binary(data) do
RoaringBitmap64.deserialize(data)
end
def load(nil), do: {:ok, nil}
def dump(nil), do: {:ok, nil}
def dump(bitset) when is_reference(bitset) do
RoaringBitmap64.serialize(bitset)
end
def dump(data) when is_binary(data) do
{:ok, data}
end
def dump(_), do: :error
def equal?(nil, nil), do: true
def equal?(nil, _), do: false
def equal?(_, nil), do: false
def equal?(bitset_ref_1, bitset_ref_2)
when is_reference(bitset_ref_1) and is_reference(bitset_ref_2) do
# Ecto uses equal? to determine if a field has changed in a changeset. However,
# our bitset membership may have changed even if the reference did not change.
# If that is the case, bitset_ref_1 will be the same as bitset_ref_2 and will always
# look to be equal when serialized even if the membership used to be different.
# Always return false so we always capture changes.
false
end
end