README.md

# Xarango

Elixir client library for [ArangoDB](https://www.arangodb.com).

Xarango has a low level API that maps directly to the Arango REST API.


## Usage

Configure xarango in `config/confix.exs`:

    config :xarango, db: [
      server: "http://localhost:8529",
      database: "test_db",
      version: 30000,
      username: System.get_env("ARANGO_USER"),
      password: System.get_env("ARANGO_PASSWORD")
    ]

Set your credentials:

    $ export ARANGO_USER=root
    $ export ARANGO_PASSWORD=secret

Run tests:

    mix test # <= beware: running tests will destroy all data in the configured database.
    
## Documents

```elixir
defmodule Article, do: use Xarango.Domain.Document

lorem = Article.create(%{author: "Author", text: "Lorem"})
ipsum = Article.create(%{author: "Author", text: "Ipsum"})

IO.inspect lorem[:text] #=> "Lorem"

Article.one(%{author: "Author"}) #=> %Article{...}
Article.list(%{author: "Author"}) #=> [%Article{...}, %Article{...}]

Article.update(ipsum, %{status: "review"})
Article.replace(lorem, %{author: "Author", text: "Foo"})

Article.destroy(ipsum)

```


## Graphs

```elixir
defmodule Brand, do: use Xarango.Domain.Node
defmodule Car, do: use Xarango.Domain.Node, graph: Vehicles
defmodule Vehicles do
  use Xarango.Domain.Graph
  
  relationship Car, :made_by, Brand
end

subaru = Brand.create(%{name: "Subaru"}, Vehicles)
outback = Car.create(%{type: "Outback"})
impreza = Car.create(%{type: "Impreza"})

subaru[:name] #=> "Subaru"
outback[:type] #=> "Outback"

Vehicles.add_made_by(outback, subaru)
Vehicles.add_made_by(impreza, subaru)

Vehicles.car_made_by(subaru) #=> [%Car{...}, %Car{...}] #outbound edges for car
Vehicles.made_by_brand(outback) #=> [%Brand{...}] #inbound edges for car

Vehicles.remove_made_by(impreza, subaru)

Vehicles.car_made_by(subaru) #=> [%Car{...}]


```

## Transactions

```
defmodule Brand, do: use Xarango.Domain.Node
defmodule Car, do: use Xarango.Domain.Node, graph: Vehicles
defmodule Vehicles do
  use Xarango.Domain.Graph

  relationship Car, :made_by, Brand
end

alias Xarango.Transaction

Transaction.begin(Vehicles)
|> Transaction.create(Car, %{name: "Foo"}, var: :car1)
|> Transaction.create(Car, %{name: "Bar"}, var: :car2)
|> Transaction.create(Brand, %{name: "Baz"}, var: :brand)
|> Transaction.add(:car1, :made_by, :brand)
|> Transaction.add(:car2, :made_by, :brand)
|> Transaction.get(Car, :made_by, :brand)
|> Transaction.execute #=> [%Car{vertex: ...}, %Car{vertex: ...}]
```

## Low level API

See tests for low level usage examples.

## Todo

- [x] Transactions
- [ ] Graph operations
- [ ] Sync/Async

## Installation

The package can be installed as:

  1. Add `xarango` to your list of dependencies in `mix.exs`:

    ```elixir
    def deps do
      [{:xarango, "~> 0.4.0"}]
    end
    ```

  2. Ensure `xarango` is started before your application:

    ```elixir
    def application do
      [applications: [:xarango]]
    end
    ```