stuff/guides/getting_started.md

# Getting Started with Pillar

This guide will help you get up and running with Pillar, the Elixir client for ClickHouse.

## Installation

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

```elixir
def deps do
  [
    {:pillar, "~> 0.39.0"}
  ]
end
```

Then run:

```bash
mix deps.get
```

## Basic Configuration

### Direct Connection

The simplest way to use Pillar is with a direct connection:

```elixir
# Create a connection to your ClickHouse server
conn = Pillar.Connection.new("http://user:password@localhost:8123/database")
```

The connection URL follows this format:
```
http://[username:password@]host[:port]/database
```

Where:
- `username` and `password` are your ClickHouse credentials (default: default/empty)
- `host` is the ClickHouse server hostname or IP
- `port` is the HTTP port (default: 8123)
- `database` is the database name

### Connection Options

You can provide additional options when creating a connection:

```elixir
conn = Pillar.Connection.new(
  "http://user:password@localhost:8123/database",
  %{
    timeout: 30_000,  # Connection timeout in milliseconds
    max_execution_time: 60,  # Maximum query execution time in seconds
    database: "analytics"  # Override database in URL
  }
)
```

## Basic Operations

### Running Queries

```elixir
# Simple query
{:ok, result} = Pillar.query(conn, "SELECT 1")

# Parameterized query
{:ok, users} = Pillar.select(
  conn,
  "SELECT * FROM users WHERE age > {min_age} LIMIT {limit}",
  %{min_age: 21, limit: 100}
)
```

### Inserting Data

```elixir
# Insert with parameters
{:ok, _} = Pillar.insert(
  conn,
  "INSERT INTO events (user_id, event_type, created_at) VALUES ({user_id}, {event_type}, {created_at})",
  %{user_id: 123, event_type: "login", created_at: DateTime.utc_now()}
)

# Insert a record using a map
{:ok, _} = Pillar.insert_to_table(
  conn,
  "users",
  %{
    id: 456,
    name: "John Doe",
    email: "john@example.com",
    created_at: DateTime.utc_now()
  }
)

# Insert multiple records
{:ok, _} = Pillar.insert_to_table(
  conn,
  "users",
  [
    %{id: 1, name: "Alice", email: "alice@example.com"},
    %{id: 2, name: "Bob", email: "bob@example.com"},
    %{id: 3, name: "Charlie", email: "charlie@example.com"}
  ]
)
```

## Understanding Responses

Most Pillar functions return one of these response patterns:

```elixir
{:ok, result} # Success with result data
{:error, reason} # Error with reason
```

For example:

```elixir
case Pillar.select(conn, "SELECT * FROM users LIMIT 10") do
  {:ok, users} ->
    # Do something with the users list
    Enum.each(users, &IO.inspect/1)
    
  {:error, error} ->
    # Handle the error
    Logger.error("Query failed: #{inspect(error)}")
end
```

## Next Steps

Now that you have a basic understanding of how to use Pillar, you might want to explore:

- [Connection Pool](connection_pool.html) for managing multiple connections
- [Migrations](migrations.html) for managing your ClickHouse schema
- [Bulk Insert Strategies](bulk_inserts.html) for efficiently loading data