# Примеры использования LineDb

Этот каталог содержит примеры использования библиотеки LineDb, переведенные с TypeScript тестов.

## Структура примеров

### 1. `basic/` - Базовые операции

Простой пример демонстрирующий основные CRUD операции:

- Создание базы данных
- Вставка данных
- Чтение данных
- Фильтрация
- Обновление и удаление

### 2. `delete/` - Операции удаления

Примеры на основе теста `LineDbv2.delete.vi.test.ts`:

- Удаление одной записи по ID
- Удаление по текстовому фильтру
- Удаление нескольких записей по массиву
- Удаление по частичному совпадению
- Удаление из партиционированных коллекций
- Обработка краевых случаев
- Тест производительности

### 3. `insert/` - Операции вставки

Примеры на основе теста `LineDbv2.insert.vi.test.ts`:

- Вставка одной записи
- Вставка массива записей
- Автоматическая генерация ID
- Вставка в партиционированные коллекции
- Проверка уникальности
- Работа с разными типами данных
- Массовая вставка
- Работа с несколькими коллекциями

### 4. `integration/` - Интеграционные тесты

Примеры на основе теста `LineDbv2.integration.vi.test.ts`:

- Базовые CRUD операции
- Сложные запросы и фильтрация
- Работа с несколькими коллекциями
- Тест производительности
- HTTP API сервер

### 5. `custom-json/` - Настраиваемые функции сериализации JSON

Демонстрирует использование настраиваемых функций сериализации и десериализации JSON:

- Использование go-json (по умолчанию)
- Использование стандартного encoding/json
- Кастомные функции сериализации с дополнительной логикой

## Запуск примеров

### Базовый пример

```bash
cd examples/basic
go run main.go
```

### Примеры удаления

```bash
cd examples/delete
go run main.go
```

### Примеры вставки

```bash
cd examples/insert
go run main.go
```

### Интеграционные тесты

```bash
cd examples/integration
go run main.go
```

### Настраиваемые функции JSON

```bash
cd examples/custom-json
go run main.go
```

## Особенности примеров

### Партиционирование

Примеры демонстрируют работу с партиционированными коллекциями, где данные автоматически распределяются по файлам на основе значения определенного поля.

### Кэширование

Показана работа с кэшем для улучшения производительности чтения данных.

### Уникальные поля (UniqueFields)

Коллекции могут иметь поля с ограничением уникальности. При вставке и обновлении LineDB проверяет, что значение поля не дублируется:

```go
UniqueFields: []string{"email"},
```

Пустые значения (`nil`, `""`) не проверяются. При `SkipCheckExistingForWrite: true` проверка уникальности пропускается.

### Фильтрация

Демонстрируются различные способы фильтрации:

- Объектные фильтры
- Строковые фильтры
- Частичное совпадение
- Строгое сравнение

### Производительность

Примеры включают тесты производительности для массовых операций.

### HTTP API

Интеграционный пример включает простой HTTP сервер с REST API для работы с базой данных.

### Настраиваемые функции сериализации JSON

Библиотека поддерживает настраиваемые функции сериализации и десериализации JSON:

```go
// Функции сериализации по умолчанию (используют go-json)
func defaultJSONMarshal(v any) ([]byte, error) {
    return json.Marshal(v)
}

func defaultJSONUnmarshal(data []byte, v any) error {
    return json.Unmarshal(data, v)
}

// Настройка в опциях коллекции
initOptions := &linedb.LineDbInitOptions{
    Collections: []linedb.JSONLFileOptions{
        {
            CollectionName: "users",
            JSONMarshal:    customMarshalFunction,
            JSONUnmarshal:  customUnmarshalFunction,
        },
    },
}
```

По умолчанию используется библиотека [go-json](https://github.com/goccy/go-json), но вы можете указать любые функции сериализации, соответствующие сигнатурам:

- `func(any) ([]byte, error)` для Marshal
- `func([]byte, any) error` для Unmarshal

## Структуры данных

Примеры используют следующие основные структуры данных:

```go
// Пользователь
type User struct {
    ID        int    `json:"id"`
    Username  string `json:"username"`
    Email     string `json:"email"`
    IsActive  bool   `json:"isActive"`
    Role      string `json:"role"`
    CreatedAt int64  `json:"createdAt"`
}

// Продукт
type Product struct {
    ID        int     `json:"id"`
    Name      string  `json:"name"`
    Price     float64 `json:"price"`
    Category  string  `json:"category"`
    InStock   bool    `json:"inStock"`
    SellerID  int     `json:"sellerId"`
    CreatedAt int64   `json:"createdAt"`
}

// Заказ
type Order struct {
    ID         int     `json:"id"`
    UserID     int     `json:"userId"`
    ProductID  int     `json:"productId"`
    Quantity   int     `json:"quantity"`
    TotalPrice float64 `json:"totalPrice"`
    Status     string  `json:"status"`
    CreatedAt  int64   `json:"createdAt"`
    UpdatedAt  int64   `json:"updatedAt"`
}
```

## Конфигурация

Каждый пример создает свою тестовую папку и настраивает базу данных с соответствующими коллекциями и индексами. После выполнения примеры автоматически очищают тестовые данные.

## Примечания

- Все примеры написаны на русском языке для лучшего понимания
- Примеры демонстрируют реальные сценарии использования
- Код включает обработку ошибок и логирование
- Производительность измеряется и выводится в консоль
