defmodule ExTypesense do
@moduledoc since: "0.1.0"
@moduledoc """
Public API functions to interact with Typesense.
If you want to implement field types for your Ecto schema,
you may need to encode the schema and add the callback `get_field_types/0`:
```elixir
# this example module can be found at: lib/ex_typesense/test_schema/person.ex
defmodule App.Person do
@behaviour ExTypesense
defimpl Jason.Encoder, for: __MODULE__ do
def encode(value, opts) do
value
|> Map.take([:id, :person_id, :name, :age])
|> Enum.map(fn {key, val} ->
cond do
key === :id -> {key, to_string(Map.get(value, :id))}
key === :person_id -> {key, Map.get(value, :id)}
true -> {key, val}
end
end)
|> Enum.into(%{})
|> Jason.Encode.map(opts)
end
end
schema "persons" do
field :name, :string
field :age, :integer
field :person_id, :integer, virtual: true
end
def get_field_types do
%{
default_sorting_field: "person_id",
fields:
[
%{name: "person_id", type: "int32"},
%{name: "name", type: "string"},
%{name: "age", type: "integer"}
]
}
end
end
```
"""
@callback get_field_types :: any()
# collection-specific tasks
defdelegate list_collections, to: ExTypesense.Collection
defdelegate create_collection(schema), to: ExTypesense.Collection
defdelegate get_collection(name), to: ExTypesense.Collection
defdelegate get_collection_name(alias_name), to: ExTypesense.Collection
defdelegate drop_collection(collection_name), to: ExTypesense.Collection
defdelegate update_collection_fields(collection_name, fields), to: ExTypesense.Collection
# collection alias
defdelegate list_collection_aliases, to: ExTypesense.Collection
defdelegate get_collection_alias(alias_name), to: ExTypesense.Collection
defdelegate delete_collection_alias(alias_name), to: ExTypesense.Collection
defdelegate upsert_collection_alias(alias_name, collection_name), to: ExTypesense.Collection
# document-specific tasks
defdelegate get_document(collection_name, document_id), to: ExTypesense.Document
defdelegate create_document(document), to: ExTypesense.Document
defdelegate delete_document(document), to: ExTypesense.Document
defdelegate delete_document(collection_name, document_id), to: ExTypesense.Document
defdelegate update_document(document), to: ExTypesense.Document
defdelegate upsert_document(document), to: ExTypesense.Document
defdelegate index_multiple_documents(documents), to: ExTypesense.Document
defdelegate update_multiple_documents(documents), to: ExTypesense.Document
defdelegate upsert_multiple_documents(documents), to: ExTypesense.Document
# search
defdelegate search(collection_name, params), to: ExTypesense.Search
# geo search
# multisearch
# curation
# synonyms
# cluster operations
defdelegate api_stats, to: ExTypesense.Cluster
defdelegate cluster_metrics, to: ExTypesense.Cluster
defdelegate health, to: ExTypesense.Cluster
end