# DataManager - Каталог данных

class axipy.DataManager

  Хранилище объектов данных. При открытии таблицы или растра эти объекты автоматически попадают в данный каталог. Для отслеживания изменений в каталоге используются события `added` и `removed`.

  Примечание

  Создание `axipy.DataManager` не требуется, используйте объект `axipy.data_manager`.

  Пример использования.

      # Отслеживание добавления или удаления в каталоге.
      data_manager.added[str].connect(lambda n: print(f'Таблица "{n}" добавлена в каталог'))
      data_manager.removed[str].connect(lambda n: print(f'Таблица "{n}" удалена из каталога'))
      # Отслеживание изменения в каталоге.
      data_manager.updated.connect(lambda params: print(f"Каталог изменен: {params}"))
      # Открываем таблицу
      table = provider_manager.openfile(filepath)
      # Список объектов каталога
      for t in data_manager:
          print(t.name)
      # Доступ по имени
      'world' in data_manager
      try:
          found_table = data_manager['world']
      except KeyError:
          pass
      # Закрываем таблицу
      table.close()
      # Убираем отслеживание
      data_manager.added[str].disconnect()
      data_manager.removed[str].disconnect()
      '''
      Таблица "world" добавлена в каталог
      world
      Таблица "world" удалена из каталога
      '''

  Свойства:

  `all_objects` | Список всех объектов, включая скрытые.
  `count` | Количество объектов данных.
  `objects` | Список объектов.
  `selection` | Таблица выборки, если она существует.
  `sql_dialect` | Тип используемого диалекта по умолчанию для выполнения SQL-предложений.
  `tables` | Список таблиц.

  Методы:

  `add`(data_object) | Добавляет объект данных в хранилище.
  `check_query`(query_text[, dialect]) | Производит проверку SQL-запроса на корректность.
  `exists`(obj) | Проверяет, присутствует ли объект в каталоге.
  `find`(name) | Производит поиск объект данных по имени.
  `query`(query_text[, dialect]) | Выполняет SQL-запрос к перечисленным таблицам.
  `query_hidden`(query_text[, dialect]) | Выполняет SQL-запрос к таблицам.
  `remove`(data_object) | Удаляет объект данных.
  `remove_all`() | Удаляет все объекты данных.

  Сигналы:

  `added` | Сигнал о добавлении объекта.
  `removed` | Сигнал об удалении объекта.
  `table_data_changed` | Сигнал об изменении данных таблиц, присутствующих в каталоге.
  `updated` | Сигнал об изменении каталога.

  Специальные методы:

  `__contains__`(name) | Проверяет наличие элемента в объекте (оператор `in`).
  `__getitem__`(key) | Доступ к элементу по индексу (`obj[i]`).
  `__iter__`() | Возвращает итератор по объекту (функция `iter()`).
  `__len__`() | Длина объекта (функция `len()`).

  __contains__(name: str) → bool

    Проверяет наличие элемента в объекте (оператор `in`).

  __getitem__(key: str) → DataObject

    Доступ к элементу по индексу (`obj[i]`).

  __iter__() → Iterator[DataObject]

    Возвращает итератор по объекту (функция `iter()`).

  __len__() → int

    Длина объекта (функция `len()`).

  add(data_object: DataObject)

    Добавляет объект данных в хранилище.

    Параметры:

      data_object – Объект данных для добавления.

  property added: Signal

    Сигнал о добавлении объекта. В качестве параметра передается наименование таблицы.

    Тип результата:

      Signal[str]

  property all_objects: List[DataObject]

    Список всех объектов, включая скрытые.

  check_query(query_text: str, dialect: TypeSqlDialect = TypeSqlDialect.sqlite) → Tuple[bool, str]

    Производит проверку SQL-запроса на корректность.

    Параметры:

      - query_text – Текст запроса.

      - dialect – Диалект, который используется при выполнении запроса. Значение по умолчанию установлено как значение свойства `sql_dialect`.

    Результат:

      Пара значений [Успешность проверки, Сообщение].

    Пример использования, если работа ведется в рамках Аксиома .

        filepath = 'path/to/world.tab'
        # Открываем таблицу
        table = provider_manager.openfile(filepath)
        table.name = 'world1'
        # Проверка текста запроса
        succ, mess = data_manager.check_query(f"select * from world1")
        print(f'Check result: {succ}; {mess}')
        '''
        Check result: True; Запрос составлен верно
        '''

  property count: int

    Количество объектов данных.

  exists(obj: DataObject) → bool

    Проверяет, присутствует ли объект в каталоге. Проверяет так-же и скрытые объекты, которые отсутствуют в общем списке.

    Параметры:

      obj – проверяемый объект данных.

  find(name: str) → Optional[DataObject]

    Производит поиск объект данных по имени.

    Параметры:

      name – Имя объекта данных.

    Результат:

      Искомый объект данных или None.

  property objects: List[DataObject]

    Список объектов.

  query(query_text: str, dialect: TypeSqlDialect = TypeSqlDialect.sqlite) → Optional[Table]

    Выполняет SQL-запрос к перечисленным таблицам.

    Параметры:

      - query_text – Текст запроса.

      - dialect – Диалект, который используется при выполнении запроса. Значение по умолчанию установлено как значение свойства `sql_dialect`.

    Результат:

      Таблица, если результатом запроса является таблица.

    Исключение:

      RuntimeError – При возникновении ошибки.

    Пример использования, если работа ведется в рамках Аксиома .

        filepath = 'path/to/world.tab'
        # Открываем таблицу
        table = provider_manager.openfile(filepath)
        table.name = 'world1'
        # Выполняем запрос
        qry = data_manager.query('select * from world1 where Страна like "А%"')
        # Выполняем тот-же запрос, но с явным указанием диалекта
        qry = data_manager.query('select * from world1 where Страна like "А%"', TypeSqlDialect.axioma)

  query_hidden(query_text: str, dialect: TypeSqlDialect = TypeSqlDialect.sqlite) → Optional[Table]

    Выполняет SQL-запрос к таблицам. В отличие от `query()` результирующий объект `Table` добавляется в каталог как скрытый объект. Он не учитывается в общем списке и от него из этого каталога не приходят события.

    Параметры:

      - query_text – Текст запроса.

      - dialect – Диалект, который используется при выполнении запроса. Значение по умолчанию установлено как `sql_dialect`.

    Результат:

      Таблица, если результатом запроса является таблица.

  remove(data_object: DataObject)

    Удаляет объект данных.

    Объект данных при этом закрывается.

    Параметры:

      data_object – Объект данных для удаления.

  remove_all()

    Удаляет все объекты данных.

  property removed: Signal

    Сигнал об удалении объекта.

    Тип результата:

      Signal[str]

  property selection: Optional[SelectionTable]

    Таблица выборки, если она существует.

    См.также

    `axipy.selection_manager`

  property sql_dialect: TypeSqlDialect

    Тип используемого диалекта по умолчанию для выполнения SQL-предложений. Если необходимо переопределить, то для конкретного sql предложения необходимо указывать диалект явно `query()`.

    Результат:

      Тип диалекта. Возможные значения TypeSqlDialect.axioma или TypeSqlDialect.sqlite.

  property table_data_changed: Signal

    Сигнал об изменении данных таблиц, присутствующих в каталоге. Испускается когда были изменены данные таблицы. В качестве параметров передаются имя изменяемой таблицы и дополнительная информация в виде dict (подробнее `Table.data_changed`) .

    Пример подписки на изменение таблиц.

        # Подписываемся на все присутствующие в менеджере таблицы
        func = lambda name, info: print(f'Таблица {name} была изменена {info}')
        data_manager.table_data_changed.connect(func)
        # Отписаться от сигнала, если он больше не нужен
        data_manager.table_data_changed.disconnect(func)

  property tables: List[Table]

    Список таблиц.

  property updated: Signal

    Сигнал об изменении каталога. В качестве параметра передается дополнительная информация в виде dict.

    Доступные параметры
    Наименование | Значение | Описание
    --- | --- | ---
    operation | added | Таблица добавлена в каталог
    operation | removed | Таблица удалена из каталога
    operation | nameChanged | Изменено наименование таблицы
    operation | selectionChanged | Произведены изменения в выборке
    name |  | Наименование таблицы, если оно доступно

    Тип результата:

      Signal[Dict[str, str]]