F.12. cube — многомерный кубический тип данных#
F.12. cube — многомерный кубический тип данных #
Этот модуль реализует тип данных куб
для представления многомерных кубов.
Этот модуль считается "доверенным", то есть его можно установить
недоступным пользователям, у которых есть привилегия CREATE
в текущей базе данных.
F.12.1. Синтаксис #
Таблица F.2 показывает допустимые внешние представления для типа куб
.
x
, y
и т.д. обозначают числа с плавающей точкой.
Таблица F.2. Внешние представления кубов
Внешний синтаксис | Значение |
---|---|
| Одномерная точка (или одномерный интервал нулевой длины) |
( | То же самое, что и выше |
| Точка в n-мерном пространстве, представленная внутренне как куб нулевого объема |
( | То же самое, что и выше |
( | Одномерный интервал, начинающийся с x и заканчивающийся на y или наоборот; порядок не имеет значения
|
[( | То же самое, что и выше |
( | Пространственный куб n-мерности, представленный парой противоположных углов |
[( | То же самое, что и выше |
Не имеет значения, в каком порядке вводятся противоположные углы куба. Функции cube
автоматически меняют значения, если это необходимо, чтобы создать однородное внутреннее представление “нижний левый — верхний правый”. Когда углы совпадают, cube
хранит только один угол вместе с флагом “точка”, чтобы избежать пустого пространства.
Входные данные игнорируют пробелы, поэтому [(
эквивалентно x
),(y
)][ (
.
x
), ( y
) ]
F.12.2. Точность #
Значения хранятся внутренне в виде 64-битных чисел с плавающей точкой. Это означает, что числа с более чем около 16 значащими цифрами будут усечены.
F.12.3. Использование #
Таблица F.3 показывает специализированные операторы, предоставляемые для типа куб
.
Таблица F.3. Операторы куба
Оператор Описание |
---|
Перекрываются ли кубы? |
Содержит ли первый куб второй? |
Содержится ли первый куб во втором? |
Извлекает |
Извлекает |
Вычисляет евклидово расстояние между двумя кубами. |
Вычисляет такси (метрика L-1) расстояние между двумя кубами. |
Вычисляет расстояние Чебышева (метрика L-бесконечность) между двумя кубами. |
В дополнение к вышеперечисленным операторам, для типа cube
доступны обычные операторы сравнения, показанные в Таблица 9.1. Эти операторы сначала сравнивают первые координаты, а затем, если они равны, сравнивают вторые координаты и так далее. Они существуют в основном для поддержки класса операторов индекса b-tree для типа cube
, что может быть полезно, например, если нужно установить ограничение UNIQUE на столбец типа cube
. В противном случае, этот порядок не имеет большой практической пользы.
Модуль cube
также предоставляет класс операторов индекса GiST для значений типа cube
.
Индекс GiST типа cube
может использоваться для поиска значений с использованием операторов =
, &&
, @>
и <@
в предложениях WHERE
.
Кроме того, индекс GiST типа куб
может использоваться для поиска ближайших соседей с помощью операторов метрики <->
, <#>
и <=>
в предложениях ORDER BY
. Например, ближайший сосед трехмерной точки (0.5, 0.5, 0.5) можно эффективно найти с помощью следующего запроса:
SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1;
Оператор ~>
также может быть использован для эффективного извлечения первых нескольких значений, отсортированных по выбранной координате. Например, чтобы получить первые несколько кубов, упорядоченных по возрастанию первой координаты (нижний левый угол), можно использовать следующий запрос:
SELECT c FROM test ORDER BY c ~> 1 LIMIT 5;
И чтобы получить 2-мерные кубы, упорядоченные по первой координате верхнего правого угла по убыванию:
SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;
Таблица F.4 показывает доступные функции.
Таблица F.4. Функции куба
Функция Описание Пример(ы) |
---|
Создает одномерный куб с одинаковыми координатами.
|
Создает одномерный куб.
|
Создает куб нулевого объема, используя координаты, определенные массивом.
|
Создает куб с верхним правым и нижним левым координатами, определенными двумя массивами, которые должны быть одинаковой длины.
|
Создает новый куб, добавляя измерение к существующему кубу с одинаковыми значениями для обоих концов новой координаты. Это полезно для построения кубов по частям из вычисленных значений.
|
Создает новый куб, добавляя измерение к существующему кубу. Это полезно для построения кубов по частям из вычисленных значений.
|
Возвращает количество измерений куба.
|
Возвращает
|
Возвращает
|
Возвращает true, если куб является точкой, то есть, две определяющие углы совпадают.
|
Возвращает расстояние между двумя кубами. Если оба куба являются точками, это нормальная функция расстояния.
|
Создает новый куб из существующего куба, используя список индексов измерений из массива. Может использоваться для извлечения конечных точек одного измерения, удаления измерений или изменения их порядка по желанию.
|
Производит объединение двух кубов.
|
Производит пересечение двух кубов.
|
Увеличивает размер куба на указанный радиус
|
F.12.4. По умолчанию #
Этот союз:
select cube_union('(0,5,2),(2,3,1)', '0'); cube_union ------------------- (0, 0, 0),(2, 5, 2) (1 row)
не противоречит здравому смыслу, как и пересечение:
select cube_inter('(0,-1),(1,1)', '(-2),(2)'); cube_inter ------------- (0, 0),(1, 0) (1 row)
Во всех бинарных операциях с кубами разной размерности, куб с меньшей размерностью считается декартовой проекцией, т.е. имеющей нули на месте координат, опущенных в строковом представлении. Приведенные выше примеры эквивалентны:
cube_union('(0,5,2),(2,3,1)','(0,0,0),(0,0,0)'); cube_inter('(0,-1),(1,1)','(-2,0),(2,0)');
Следующий предикат содержания использует синтаксис точки, в то время как внутреннее представление второго аргумента осуществляется с помощью прямоугольника (box). Этот синтаксис позволяет избежать необходимости определения отдельного типа точки и функций для предикатов (box, точка).
select cube_contains('(0,0),(1,1)', '0.5,0.5'); cube_contains -------------- t (1 row)
F.12.5. Примечания #
Для примеров использования смотрите тест регрессии sql/cube.sql
.
Для того чтобы затруднить возможность поломки, существует ограничение в 100 на количество измерений кубов. Это установлено в файле cubedata.h
, если вам нужно что-то большее.
F.12.6. Заслуги #
Оригинальный автор: Ген Селков, мл. <selkovjr@mcs.anl.gov>
,
Отделение математики и компьютерных наук, Национальная лаборатория Аргонн.
Мои благодарности в первую очередь идут профессору Джо Хеллерштейну (https://dsf.berkeley.edu/jmh/) за ясное изложение сути GiST (http://gist.cs.berkeley.edu/), а также его бывшему студенту Энди Донгу за его пример, написанный для Illustra. Я также благодарен всем разработчикам Postgres, настоящим и прошлым, за возможность создать свой собственный мир и жить в нем непрерывно. И я хотел бы выразить свою благодарность Аргоннской лаборатории и Министерству энергетики США за годы верной поддержки моих исследований в области баз данных.
Незначительные обновления этого пакета были сделаны Бруно Вольфом III
<bruno@wolff.to>
в августе/сентябре 2002 года. Они включают
изменение точности с одинарной на двойную и добавление
некоторых новых функций.
Дополнительные обновления были внесены Joshua Reich <josh@root.net>
в июле 2006 года. Они включают функцию cube(float8[], float8[])
и очистку кода для использования протокола вызова V1 вместо устаревшего протокола V0.