Table - Абстрактный класс таблицы
=====================================

.. currentmodule:: axioma.core.dp

.. class:: Table

	Абстрактный класс таблицы

	Унаследован от:

	* :class:`~axioma.core.dp.DataObject`
	* :class:`~axioma.core.dp.QuerySupport`

	От него наследуются:

	* :class:`~axioma.core.dp.EditableTable`
	* :class:`~axioma.core.dp.SelectionTable`

		.. method:: Table()

			Конструктор класса

		.. method:: Table(table)

			Конструктор класса.
			Создать копию таблицы.

			:param table: таблица
			:type table: :class:`~axioma.core.dp.Table`

		.. method:: attributeNames()

			Список имен атрибутов

			:rtype: :class:`list` [:class:`str`]

		.. method:: tableSchema()

			Схема таблицы

			:rtype: :class:`~axioma.core.dp.TableSchema`

		.. py:method:: saveSchemaToJson()

			Сохранение схемы таблицы в формате JSON-представления. Пример см. :meth:`~axioma.core.dp.EditableTable.modifyTableSchema`

			:rtype: :class:`list` [ :class:`~PyQt5.QtCore.QJsonValue` ]
			
			
			.. code-block:: python
				:caption: Пример получения параметров схемы таблицы:

				table = axioma.core.open_json({'src': '/tmp/world.tab'})
				json = table.saveSchemaToJson()
				for field in json:
				    def_feild = field.toObject()
				    print('-----------------')
				    for key in def_feild.keys():
				        v = def_feild[key]
				        print('ParameterName={}, Value={}'.format(key, def_feild[key].toVariant()))

		..	.. method:: tableSchemaController()

		..		Контроллер схемы таблицы

		.. method:: coordSystem()

			Координатная система таблицы. Если несколько, берется первая попавшаяся

			:return: координатная система таблицы, либо None
			:rtype: :class:`~axioma.cs.CoordSystem`

		.. method:: sourceOfChanges()

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

			:rtype: :class:`~axioma.core.dp.Table`

		.. method:: featureIdComparator()

			Получение функтора сравнения двух идентификаторов записей в этой таблице. Используется для сортировки записей.

			:return: функтор сравнения двух идентификаторов
			:rtype: :class:`~axioma.core.dp.VariantComparator`

		.. method:: sourceTable()

			Изначальная таблица

			:rtype: :class:`~axioma.core.dp.Table`

		.. method:: allFeatures()

			Запрашиваются все записи таблицы. При выполнении данного запроса все записи загружаются в память. Если необходимо использовать более гибкий механизм с последовательной частичной загрузкой рекомендуется использовать :meth:`~axioma.core.dp.Table.selectToFeatureList`

			:rtype: :class:`list` [:class:`Feature`]

			.. code-block:: python
				:caption: Пример последовательного анализа всех записей таблицы:

				features = table.allFeatures()
				for f in features:
					print("id", f.id(), f.getAttribute('Страна'))


		.. method:: selectToFeatureList(query, range=PageRange())

			Запрашиваются записи, удовлетворяющие запросу query

			:param query: запрос к таблице
			:type query: :class:`~axioma.core.dp.TableQuery`
			:param range: диапазон записей. Может использоваться как ограничитель записей при загрузке порциями (см. пример)
			:type range: :class:`~axioma.core.dp.PageRange`
			:return: Список записей
			:rtype: :class:`list` [:class:`~axioma.core.dp.Feature`]

			.. code-block:: python
				:caption: Пример использования:

				# Запросим последовательно порциями по 10 записей
				count = table.count(QuerySelectAll())
				print('Общее количество записей =', count)
				part_count = 10
				start_record = 0
				while start_record < count:
					print('--- Запрашиваем от {} до {}'.format(start_record+1, start_record+part_count))
					features = table.selectToFeatureList(QuerySelectAll(table.tableSchema().attributeNames()), PageRange(start_record, part_count))
					start_record = start_record + part_count
					for f in features:
						print('ID =', f.id())

		.. method:: selectFeaturesById(ids, attribute_names=list(), range=PageRange())

			Получить записи по списку идентификаторов

			:param ids: идентификаторы запрашиваемых записей
			:type ids: :class:`list` [:class:`~PyQt5.QtCore.QVariant`]
			:param attribute_names: имена запрашиваемых атрибутов записей
			:type attribute_names: :class:`list` [:class:`str`]
			:param range: диапазон записей
			:type range: :class:`~axioma.core.dp.PageRange`
			:return: Список записей
			:rtype: :class:`list` [:class:`~axioma.core.dp.Feature`]

			.. code-block:: python
				:name: code_sample_select_features_by_id
				:caption: Пример использования:

				# Восстановление; получение записей с полным количеством атрибутов

				# ...
				# features - записи с усеченным набором атрибутов
				# ...

				ids = [feature.id() for feature in features]
				full_features = table.selectFeaturesById(ids, table.attributeNames())


		.. method:: selectFeaturesInMbr(rect, attribute_names=list(), geom_attr_name=str(), range=PageRange())

			Получить записи в прямоугольнике. Сравнение производится с ограничивающим прямоугольником объекта. Для более точного соответствия необходимо произвести дополнительную проверку.

			:param rect: географический прямоугольник, в границах которого выбираются объекты (записи)
			:type rect: :class:`~axioma.core.dp.GeoRect`
			:param attribute_names: имена запрашиваемых атрибутов записей
			:type attribute_names: :class:`list` [:class:`str`]
			:param geom_attr_name: имя атрибута с геометрией; если пустая строка, будет выполнена попытка найти атрибут; если несколько - берется первый попавшийся, если нет - возвращается пустой список записей
			:type geom_attr_name: :class:`str`
			:param range: диапазон записей
			:type range: :class:`~axioma.core.dp.PageRange`
			:return: Список записей
			:rtype: :class:`list` [:class:`~axioma.core.dp.Feature`]

			.. code-block:: python
				:name: sample_select_features_in_mbr
				:caption: Пример использования:

				# ...
				# coord_system - Долгота-Широта
				# ...

				georect = GeoRect(QRectF(-180, 0, 90, 90), coord_system)
				features = table.selectFeaturesInMbr(georect, table.attributeNames())



		..	.. method:: makeIdSet()

		..		!!!
		..
		..		:param: !!!
		..		:return: !!!
		..		:rtype: !!!

		..	.. method:: tableProperties()

		..		Свойства таблицы
		..
		..		:rtype: :class:`~axioma.core.dp.Table`Properties

		..	.. method:: setTableProperties(properties)

		..		Задать свойства таблицы
		..
		..		:param properties: свойства
		..		:type properties: :class:`TableProperties`

		.. method:: hasDataChangeConnection()

			Имеет ли кто-то подписку на сигнал изменения данных

			:return: True, если имеет, иначе - False
			:rtype: :class:`bool`

		.. method:: contentType()

			Тип контента. Используется при первоначальной организации слоев внутри карты. Например, слой с точечными объектами \
			должен располагаться выше слоя с полигональными, а растровый слой размещается снизу по списку.

			:rtype: :class:`~axioma.core.dp.ContentType`
			
		.. method:: contentTypes()

			Перечень типов объектов, которые реально содержится в таблице.

			:rtype: :class:`list` [ :class:`~axioma.core.dp.ContentType` ]


		..	!!!SIGNALS!!!
		..	.. method:: dataChanged(event)
		..
		..		[signal]Данные изменились
		..
		..		:param event: событие изменения данных
		..		:type event: :class:`TableDataChangedEvent`

		.. method:: dataReset()

			[signal] Изменились данные таблицы

		.. method:: schemaChanged()

			[signal] Изменилась схема таблицы
