Использование cube
Обзор
Расширение cube реализует тип данных сube для представления многомерных массивов. Этот тип позволяет эффективно хранить и индексировать многомерные массивы, а также выполнять над ними операции. Обратите внимание, что в контексте этой статьи под термином куб понимается многомерный массив.
|
ПРИМЕЧАНИЕ
Оператор CUBE, который используется при создании наборов группирования, не имеет отношения к расширению cube и может использоваться без его установки.
|
Пакет, требуемый для установки cube, поставляется с ADP. Чтобы использовать cube, выполните команду CREATE EXTENSION в той базе данных, в которую необходимо поставить расширение:
CREATE EXTENSION cube;
|
ПРИМЕЧАНИЕ
Если расширение cube создано в базе данных template1, используемой в качестве шаблона БД по умолчанию, во всех вновь создаваемых базах данных будет установлено это расширение.
|
ADP использует версию
1.5
расширения cube. Чтобы это проверить, выполните следующий запрос:
SELECT extversion FROM pg_extension
WHERE extname = 'cube';
extversion ------------ 1.5
Значения cube хранятся как 64-битные числа с плавающей точкой. В соответствии с этим, числа, содержащие более 16 значащих цифр, будут усечены.
В таблице ниже показаны внешние представления типа cube.
| Синтаксис | Описание |
|---|---|
x |
Одномерная точка (одномерный интервал нулевой длины) |
(x) |
|
x1,x2,…,xn |
Точка в n-мерном пространстве, внутренне представленная как куб нулевого объема |
(x1,x2,…,xn) |
|
(x),(y) |
Одномерный интервал, начинающийся с |
[(x),(y)] |
|
(x1,…,xn),(y1,…,yn) |
N-мерный куб, представленный парой диагонально противоположных углов |
[(x1,…,xn),(y1,…,yn)] |
Не имеет значения в каком порядке вводятся противоположные углы куба. Функции, принимающие тип cube, меняют углы местами, чтобы получить единое внутреннее представление "левый нижний — правый верхний". Когда эти углы совмещаются, в cube хранится только один угол с флагом "is point" (является точкой).
Операторы типа данных cube
У типа данных cube есть специальные операторы, перечисленные в таблице ниже.
| Оператор | Описание |
|---|---|
cube && cube → boolean |
Определяет, пересекаются ли кубы |
cube @> cube → boolean |
Определяет, содержит ли первый куб второй |
cube <@ cube → boolean |
Определяет, содержит ли второй куб первый |
cube -> integer → float8 |
Выдает |
cube ~> integer → float8 |
Выдает |
cube <-> cube → float8 |
Вычисляет евклидово расстояние между двумя кубами |
cube <#> cube → float8 |
Рассчитывает расстояние между точками, имитирующее путь такси по сетке улиц (метрика L-1) |
cube <=> cube → float8 |
Вычисляет расстояние Чебышева (метрика L-inf) между двумя кубами |
Помимо вышеперечисленных операторов, для типа cube доступны стандартные операторы сравнения. Эти операторы сравнивают первые координаты, и если они равны, сравнивают вторые координаты и т.д. Они предназначены в основном для поддержки класса операторов индекса B-дерева для типа cube.
Примеры
SELECT '38, 102.30'::cube = '38, 102.30'::cube AS result;
result -------- t
SELECT '(2,0),(3,1)'::cube = '(2,0,0,0,0),(3,1,0,0,0)'::cube AS result;
result -------- f
SELECT '38, 102.30'::cube != '38, 102.31'::cube AS result;
result -------- t
SELECT '(2,0),(3,1)'::cube < '(2,0,0,0,0),(3,1,0,0,0)'::cube AS result;
result -------- t
SELECT '(2,0,0,0,0),(3,1,0,0,1)'::cube > '(2,0),(3,2)'::cube AS result;
result -------- f
SELECT '[(-1,-1,-1),(1,1,1)]'::cube && '0'::cube AS result;
result -------- t
SELECT '[(-1,-1,-1),(1,1,1)]'::cube && '[(1,1,1),(2,2,2)]'::cube AS result;
result -------- t
SELECT '(1,0,0),(0,0,1)'::cube <@ '(-1,-1,-1),(1,1,1)'::cube AS result;
result -------- t
SELECT '(-2),(1)'::cube <@ '(-1),(1)'::cube AS result;
result -------- f
SELECT '(1,0,0),(0,0,1)'::cube @> '(-1,-1,-1),(1,1,1)'::cube AS result;
result -------- f
SELECT '(-1,-1,-1,-1),(1,1,1,1)'::cube @> '(1,0,0),(0,0,1)'::cube AS result;
result -------- t
SELECT cube(array[10,20,30], array[40,50,60])-> 5 AS result;
result
--------
50
Два примера ниже возвращают один и тот же результат, поскольку функция cube(array[10,20,30]) создает куб, координаты обоих углов которого совпадают.
SELECT cube(array[10,20,30])-> 3 AS result;
result
--------
30
SELECT cube(array[10,20,30])-> 6 AS result;
result
--------
30
SELECT cube(array[40,50,60], array[10,20,30])~> 1 AS result;
result
----------
10
SELECT cube(array[40,50,60], array[10,20,30])~> 2 AS result;
result
----------
40
SELECT cube(array[40,50,60], array[10,20,30])~> 3 AS result;
result
----------
20
SELECT cube(array[40,50,60], array[10,20,30])~> 4 AS result;
result
----------
50
SELECT cube(array[40,50,60], array[10,20,30])~> (-4) AS result;
result
----------
-50
SELECT '(1,1)'::cube <-> '(4,5)'::cube AS result;
result
----------
5
SELECT '(1,1)'::cube <#> '(4,5)'::cube AS result;
result
----------
7
SELECT '(1,1)'::cube <=> '(4,5)'::cube AS result;
result
----------
4
Функции типа данных cube
| Функция | Описание | Пример |
|---|---|---|
cube(float8) → cube |
Создает одномерный куб с одинаковыми обеими координатами |
cube(1) → (1) |
cube(float8, float8) → cube |
Создает одномерный куб |
cube(1, 2) → (1),(2) |
cube(float8[]) → cube |
Создает куб нулевого объема, используя координаты, определенные массивом |
cube(ARRAY[1,2,3]) → (1, 2, 3) |
cube(float8[], float8[]) → cube |
Создает куб с координатами верхнего правого и нижнего левого углов, определяемыми двумя массивами, которые должны иметь одинаковую длину |
cube(ARRAY[1,2], ARRAY[3,4]) → (1, 2),(3, 4) |
cube(cube, float8) → cube |
Создает новый куб путем добавления измерения к существующему кубу с одинаковыми значениями для обеих конечных точек новой координаты. Это полезно для построения кубов по частям на основе вычисляемых значений |
cube('(1,2),(3,4)'::cube, 5) → (1, 2, 5),(3, 4, 5) |
cube(cube, float8, float8) → cube |
Создает новый куб путем добавления измерения в существующий куб |
cube('(1,2),(3,4)'::cube, 5, 6) → (1, 2, 5),(3, 4, 6) |
cube_dim(cube) → integer |
Возвращает количество измерений куба |
cube_dim('(1,2),(3,4)') → 2 |
cube_ll_coord(cube, n integer) → float8 |
Возвращает |
cube_ll_coord('(1,2),(3,4)', 2) → 2 |
cube_ur_coord(cube, n integer) → float8 |
Возвращает |
cube_ur_coord('(1,2),(3,4)', 2) → 4 |
cube_is_point(cube) → boolean |
Возвращает |
cube_is_point(cube(1,1)) → t |
cube_distance(cube, cube) → float8 |
Возвращает расстояние между двумя кубами. Если оба куба являются точками, это стандартная функция определения расстояния |
cube_distance('(1,2)', '(3,4)') → 2.8284271247461903 |
cube_subset(cube, integer[]) → cube |
Создает новый куб из существующего куба, используя список индексов измерений из массива. Может использоваться для извлечения конечных точек одного измерения, удаления измерений или изменения их порядка |
cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[2]) → (3),(7) cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1]) → (5, 3, 1, 1),(8, 7, 6, 6) |
cube_union(cube, cube) → cube |
Производит объединение двух кубов |
cube_union('(1,2)', '(3,4)') → (1, 2),(3, 4) |
cube_inter(cube, cube) → cube |
Производит пересечение двух кубов |
cube_inter('(1,2)', '(3,4)') → (3, 4),(1, 2) |
cube_enlarge( |
Увеличивает размер куба на указанный радиус |
cube_enlarge('(1,2),(3,4)', 0.5, 3) → (0.5, 1.5, -0.5),(3.5, 4.5, 0.5) |