# ExAliyunOts

[![Coverage Status](](
[![Module Version](](
[![Hex Docs](](
[![Total Download](](
[![Last Updated](](

Aliyun [TableStore]( SDK for Elixir/Erlang

> TableStore is a NoSQL database service built on Alibaba Cloud’s Apsara distributed operating system that can store and access large volumes of structured data in real time.

## Installation

def deps do
    {:ex_aliyun_ots, "~> 0.11"}

## Configuration

Add these settings below into the `config/ots.secret.exs` file.

config :ex_aliyun_ots, :my_instance,
  name: "MyInstanceName",
  endpoint: "MyInstanceEndpoint",
  access_key_id: "MyAliyunRAMKeyID",
  access_key_secret: "MyAliyunRAMKeySecret",
  pool_size: 100,
  pool_count: 1

config :ex_aliyun_ots,
  instances: [:my_instance],
  debug: false,
  enable_tunnel: false

* `debug`, optional, specifies whether to enable debug logger, by default it is false, and please DO NOT use debug mode in production.
* `enable_tunnel`, optional, specifies whether to enable tunnel functions, there will startup tunnel related supervisor and registry when enable it, by default it is false.
* `pool_size`, optional, number of connections to maintain in each pool, involved when use `Finch` as Tesla http adapter, see `Finch.request/6` for details, defaults to 100.
* `pool_count`, optional, number of pools to start, involved when use `Finch` as Tesla http adapter, see `Finch.request/6` for details, defaults to 1.

## Using ExAliyunOts

To use `ExAliyunOts`, a module that calls `use ExAliyunOts` has to be defined:

defmodule MyApp.TableStore do
  use ExAliyunOts, instance: :my_instance

This automatically defines some macros and functions in the `MyApp.TableStore` module, here are some examples:

import MyApp.TableStore

# Create table
create_table "table",
  [{"pk1", :integer}, {"pk2", :string}]

# Put row
put_row "table",
  [{"pk1", "id1"}],
  [{"attr1", 10}, {"attr2", "attr2_value"}],
  condition: condition(:expect_not_exist),
  return_type: :pk

# Search index
search "table", "index_name",
  search_query: [
  query: match_query("age", 28),
  sort: [
    field_sort("age", order: :desc)

# Local transaction
start_local_transaction "table", {"partition_key", "partition_value"}

## ExAliyunOts API

There are two ways to use ExAliyunOts:

* using macros and functions from your own ExAliyunOts module, like `MyApp.TableStore`.
* using macros and functions from the `ExAliyunOts` module.

All defined functions and macros in `ExAliyunOts` are available and referable for your own ExAliyunOts module as well, except that the given arity of functions may different, because the `instance` parameter of each invoke request is NOT needed from your own ExAliyunOts module although the `ExAliyunOts` module defines it.

## Ecto Adapter

Here is a [Tablestore adapter for Ecto]( implementation as an alternative.

## Supported Functions

* Table Operations
* Row Operations
* Conditional update
* Auto-increment function of the primary key column
* Filter
* Atomic counters
* Search index
* Local transaction
* Tunnel service
* Timeline mode

## Supported API

* Table
  * CreateTable
  * ListTable
  * DeleteTable
  * UpdateTable
  * DescribeTable
  * ComputeSplitPointsBySize

* Row
  * PutRow
  * GetRow
  * UpdateRow
  * DeleteRow
  * GetRange
  * BatchGetRow
  * BatchWriteRow

* SearchIndex
  * CreateSearchIndex
  * DescribeSearchIndex
  * DeleteSearchIndex
  * Search
  * ParallelScan

* LocalTransaction
  * StartLocalTransaction
  * CommitTransaction
  * AbortTransaction

* SDK built-in
  * IterateAllRange
  * IterateParallelScan
  * IterateSearch
  * Sequence
  * StreamParallelScan
  * StreamRange
  * StreamSearch

* Tunnel service
* Timeline mode

## Thanks

Thanks very much for the help and support of the Alibaba TableStore offical support team.

## References

Alibaba Tablestore product official references:

* [English document](
* [中文文档](

## License

This project is licensed under the MIT license. Copyright (c) 2018- Xin Zou.