Использование 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 или наоборот — порядок не имеет значения

[(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

Выдает n-ю координату куба (нумерация начинается с 1)

cube ~> integer → float8

Выдает n-ю координату куба, рассчитанную следующим образом: обозначает нижнюю границу k-й размерности; обозначает верхнюю границу k-й размерности. Отрицательные n обозначают обратное значение соответствующей положительной координаты. Этот оператор предназначен для поддержки KNN-GiST

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

Возвращает n-е значение координаты для левого нижнего угла куба

cube_ll_coord('(1,2),(3,4)', 2) → 2

cube_ur_coord(cube, n integer) → float8

Возвращает n-е значение координаты для правого верхнего угла куба

cube_ur_coord('(1,2),(3,4)', 2) → 4

cube_is_point(cube) → boolean

Возвращает true, если куб является точкой, то есть оба угла имеют одинаковые координаты

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(c cube, r double, n integer) → cube

Увеличивает размер куба на указанный радиус r как минимум в n измерениях. Если радиус (r) отрицательный, куб сжимается. Все измерения куба изменяются на величину радиуса r. Координаты нижнего левого угла уменьшаются на r, а координаты правого верхнего увеличиваются на r. Если нижняя левая координата увеличивается больше, чем соответствующая верхняя правая координата (это может произойти только при r < 0), то для обеих координат устанавливаются их средние значения. Если n больше количества определенных измерений и куб увеличивается (r > 0), то добавляются дополнительные измерения, так что общее количество измерений становится равным n; 0 используется в качестве начального значения для дополнительных координат. Эта функция полезна для создания окружающих точку прямоугольников при поиске ближайших точек

cube_enlarge('(1,2),(3,4)', 0.5, 3) → (0.5, 1.5, -0.5),(3.5, 4.5, 0.5)

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней