F.10. cube â Ñип даннÑÑ Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¼ÐµÑнÑÑ ÐºÑбов #
ÐÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ ÑеализÑÐµÑ Ñип даннÑÑ
cube Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¼ÐµÑнÑÑ
кÑбов.
ÐаннÑй модÑÐ»Ñ ÑÑиÑаеÑÑÑ Â«Ð´Ð¾Ð²ÐµÑеннÑм», Ñо еÑÑÑ ÐµÐ³Ð¾ могÑÑ ÑÑÑанавливаÑÑ Ð¾Ð±ÑÑнÑе полÑзоваÑели, имеÑÑие пÑаво CREATE в ÑекÑÑей базе даннÑÑ
.
F.10.1. СинÑакÑÐ¸Ñ #
РТаблиÑе F.1 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð²Ð½ÐµÑние пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñипа cube. ÐÑÐºÐ²Ñ x, y и Ñ. д. обознаÑаÑÑ ÑиÑла Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой.
ТаблиÑа F.1. ÐнеÑние пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÑбов
| ÐнеÑний ÑинÑакÑÐ¸Ñ | ÐнаÑение |
|---|---|
| ÐдномеÑÐ½Ð°Ñ ÑоÑка (или одномеÑнÑй инÑеÑвал нÑлевой длинÑ) |
( | То же, ÑÑо и вÑÑе |
| ТоÑка в n-меÑном пÑоÑÑÑанÑÑве, пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²Ð½ÑÑÑи как кÑб нÑлевого обÑÑма |
( | То же, ÑÑо и вÑÑе |
( | ÐдномеÑнÑй инÑеÑвал, наÑинаÑÑийÑÑ Ð² ÑоÑке x и заканÑиваÑÑийÑÑ Ð² y, либо наобоÑоÑ; поÑÑдок знаÑÐµÐ½Ð¸Ñ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ |
[( | То же, ÑÑо и вÑÑе |
( | N-меÑнÑй кÑб, пÑедÑÑавленнÑй паÑой диагоналÑно пÑоÑивоположнÑÑ Ñглов |
[( | То же, ÑÑо и вÑÑе |
Ркаком поÑÑдке вводÑÑÑÑ Ð¿ÑоÑивоположнÑе ÑÐ³Ð»Ñ ÐºÑба, не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениÑ. ФÑнкÑии, пÑинимаÑÑие Ñип cube, авÑомаÑиÑеÑки менÑÑÑ ÑÐ³Ð»Ñ Ð¼ÐµÑÑами, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÐµÐ´Ð¸Ð½Ð¾Ðµ внÑÑÑеннее пÑедÑÑавление «левÑй нижний â пÑавÑй веÑÑ
ний». Ðогда ÑÑи ÑÐ³Ð»Ñ ÑовмеÑаÑÑÑÑ, в cube Ð´Ð»Ñ Ñкономии пÑоÑÑÑанÑÑва Ñ
ÑаниÑÑÑ ÑолÑко один Ñгол Ñ Ñлагом «ÑвлÑеÑÑÑ ÑоÑкой».
ÐÑобелÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¸Ð³Ð½Ð¾ÑиÑÑÑÑÑÑ, Ñак ÑÑо [( не оÑлиÑаеÑÑÑ Ð¾Ñ x),(y)][ ( .x ), ( y ) ]
F.10.2. ТоÑноÑÑÑ #
ÐнаÑÐµÐ½Ð¸Ñ Ñ ÑанÑÑÑÑ Ð²Ð½ÑÑÑи как 64-биÑнÑе ÑиÑла Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой. ÐÑо знаÑиÑ, ÑÑо ÑиÑла Ñ Ð±Ð¾Ð»ÐµÐµ Ñем 16 знаÑаÑими ÑиÑÑами бÑдÑÑ ÑÑекаÑÑÑÑ.
F.10.3. ÐÑполÑзование #
РТаблиÑе F.2 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑÑ, пÑедназнаÑеннÑе ÑпеÑиалÑно Ð´Ð»Ñ ÑабоÑÑ Ñ Ñипом cube.
ТаблиÑа F.2. ÐпеÑаÑоÑÑ Ð´Ð»Ñ ÐºÑбов
ÐпеÑаÑÐ¾Ñ ÐпиÑание |
|---|
ÐÑÐ±Ñ Ð¿ÐµÑеÑекаÑÑÑÑ? |
ÐеÑвÑй кÑб ÑодеÑÐ¶Ð¸Ñ Ð²ÑоÑой? |
ÐеÑвÑй кÑб ÑодеÑжиÑÑÑ Ð²Ð¾ вÑоÑом? |
ÐÑдаÑÑ |
ÐÑдаÑÑ |
ÐÑÑиÑлÑÐµÑ ÐµÐ²ÐºÐ»Ð¸Ð´Ð¾Ð²Ð¾ ÑаÑÑÑоÑние Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ ÐºÑбами. |
ÐÑÑиÑлÑÐµÑ ÑаÑÑÑоÑние гоÑодÑÐºÐ¸Ñ ÐºÐ²Ð°ÑÑалов (меÑÑÐ¸ÐºÑ L-1) Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ ÐºÑбами. |
ÐÑÑиÑлÑÐµÑ ÑаÑÑÑоÑние ЧебÑÑева (меÑÑÐ¸ÐºÑ L-беÑконеÑноÑÑÑ) Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ ÐºÑбами. |
Ðомимо показаннÑÑ
вÑÑе опеÑаÑоÑов, Ð´Ð»Ñ Ñипа cube имеÑÑÑÑ Ð¾Ð±ÑÑнÑе опеÑаÑоÑÑ ÑÑавнениÑ, показаннÑе в ТаблиÑе 9.1. ÐÑи опеÑаÑоÑÑ ÑнаÑала ÑÑавниваÑÑ Ð¿ÐµÑвÑе кооÑдинаÑÑ Ð¸ еÑли они ÑавнÑ, ÑÑавниваÑÑ Ð²ÑоÑÑе и Ñ. д. Ðни пÑедназнаÑÐµÐ½Ñ Ð² оÑновном Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки клаÑÑа опеÑаÑоÑов индекÑа-B-деÑева Ð´Ð»Ñ Ñипа cube, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½, напÑимеÑ, еÑли Ð²Ñ Ñ
оÑиÑе ÑоздаÑÑ Ð¾Ð³ÑаниÑение UNIQUE Ð´Ð»Ñ ÑÑолбÑа Ñипа cube. ÐÐ»Ñ Ð´ÑÑгиÑ
пÑакÑиÑеÑкиÑ
пÑименений ÑеализÑÐµÐ¼Ð°Ñ Ð¸Ð¼Ð¸ ÑоÑÑиÑовка не оÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð°.
ÐодÑÐ»Ñ cube Ñакже пÑедоÑÑавлÑÐµÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов индекÑа GiST Ð´Ð»Ñ Ð·Ð½Ð°Ñений cube. ÐÐ½Ð´ÐµÐºÑ GiST Ð´Ð»Ñ cube Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка знаÑений в вÑÑажениÑÑ
Ñ Ð¾Ð¿ÐµÑаÑоÑами =, &&, @> и <@ в пÑедложениÑÑ
WHERE.
GiST-Ð¸Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ cube Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ и Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка ближайÑиÑ
ÑоÑедей Ñ Ð¸ÑполÑзованием опеÑаÑоÑов меÑÑики <->, <#> и <=> в пÑедложениÑÑ
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;
Ð ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð²ÑмеÑнÑе кÑбÑ, оÑÑоÑÑиÑованнÑе по ÑбÑÐ²Ð°Ð½Ð¸Ñ Ð¿ÐµÑвой кооÑдинаÑÑ Ð¿Ñавого веÑÑ Ð½ÐµÐ³Ð¾ Ñгла:
SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;
РТаблиÑе F.3 пеÑеÑиÑÐ»ÐµÐ½Ñ Ð²Ñе доÑÑÑпнÑе ÑÑнкÑии.
ТаблиÑа F.3. ФÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ ÐºÑбами
ФÑнкÑÐ¸Ñ ÐпиÑание ÐÑимеÑÑ |
|---|
СоздаÑÑ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑнÑй кÑб, Ñ ÐºÐ¾ÑоÑого обе кооÑдинаÑÑ ÑавнÑ.
|
СоздаÑÑ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑнÑй кÑб.
|
СоздаÑÑ ÐºÑб нÑлевого обÑÑма по кооÑдинаÑам, опÑеделÑемÑм маÑÑивом.
|
СоздаÑÑ ÐºÑб Ñ ÐºÐ¾Ð¾ÑдинаÑами пÑавого веÑÑ Ð½ÐµÐ³Ð¾ и левого нижнего Ñглов, опÑеделÑемÑми двÑÐ¼Ñ Ð¼Ð°ÑÑивами, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾Ð¹ длинÑ.
|
СоздаÑÑ Ð½Ð¾Ð²Ñй кÑб, добавлÑÑ ÑазмеÑноÑÑÑ Ðº ÑÑÑеÑÑвÑÑÑÐµÐ¼Ñ ÐºÑÐ±Ñ Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм знаÑением новой кооÑдинаÑÑ Ð´Ð»Ñ Ð¾Ð±Ð¾Ð¸Ñ Ñглов. ÐÑо бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, когда нÑжно поÑÑÑоиÑÑ ÐºÑÐ±Ñ Ð¿Ð¾ÑÑапно из вÑÑиÑлÑемÑÑ Ð·Ð½Ð°Ñений.
|
СоздаÑÑ Ð½Ð¾Ð²Ñй кÑб, добавлÑÑ ÑазмеÑноÑÑÑ Ðº ÑÑÑеÑÑвÑÑÑÐµÐ¼Ñ ÐºÑбÑ. ÐÑо бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, когда нÑжно поÑÑÑоиÑÑ ÐºÑÐ±Ñ Ð¿Ð¾ÑÑапно из вÑÑиÑлÑемÑÑ Ð·Ð½Ð°Ñений.
|
ÐозвÑаÑÐ°ÐµÑ ÑиÑло ÑазмеÑноÑÑей кÑба.
|
ÐÑдаÑÑ Ð·Ð½Ð°Ñение
|
ÐÑдаÑÑ Ð·Ð½Ð°Ñение
|
ÐозвÑаÑÐ°ÐµÑ true, еÑли кÑб ÑвлÑеÑÑÑ ÑоÑкой, Ñо еÑÑÑ ÐµÑли два опÑеделÑÑÑÐ¸Ñ ÐµÐ³Ð¾ Ñгла ÑовпадаÑÑ.
|
ÐозвÑаÑÐ°ÐµÑ ÑаÑÑÑоÑние Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ ÐºÑбами. ÐÑли оба кÑба ÑвлÑÑÑÑÑ ÑоÑками, вÑÑиÑлÑеÑÑÑ Ð¾Ð±ÑÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ ÑаÑÑÑоÑниÑ.
|
СоздаÑÑ Ð½Ð¾Ð²Ñй кÑб из ÑÑÑеÑÑвÑÑÑего, иÑполÑзÑÑ ÑпиÑок ÑазмеÑноÑÑей из маÑÑива. ÐÐ¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð¾ÑÐ´Ð¸Ð½Ð°Ñ Ñглов в одном измеÑении, Ð´Ð»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÑений и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ñ Ð¿Ð¾ÑÑдка.
|
СоздаÑÑ Ð¾Ð±Ñединение двÑÑ ÐºÑбов.
|
СоздаÑÑ Ð¿ÐµÑеÑеÑение двÑÑ ÐºÑбов.
|
УвелиÑÐ¸Ð²Ð°ÐµÑ ÑÐ°Ð·Ð¼ÐµÑ ÐºÑба на заданнÑй ÑадиÑÑ
|
F.10.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)');Ð ÑледÑÑÑем пÑедикаÑе вклÑÑÐµÐ½Ð¸Ñ Ð¿ÑименÑеÑÑÑ ÑинÑакÑÐ¸Ñ ÑоÑек, Ñ Ð¾ÑÑ ÑакÑиÑеÑки вÑоÑой аÑгÑÐ¼ÐµÐ½Ñ Ð¿ÑедÑÑавлÑеÑÑÑ Ð²Ð½ÑÑÑи кÑбом. ÐÑÐ¾Ñ ÑинÑакÑÐ¸Ñ Ð¸Ð·Ð±Ð°Ð²Ð»ÑÐµÑ Ð¾Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи опÑеделÑÑÑ Ð¾ÑделÑнÑй Ñип ÑоÑек и ÑÑнкÑии Ð´Ð»Ñ Ð¿ÑедикаÑов (cube,point).
select cube_contains('(0,0),(1,1)', '0.5,0.5');
cube_contains
--------------
t
(1 row)F.10.5. ÐÑимеÑÐ°Ð½Ð¸Ñ #
ÐÑимеÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑвидеÑÑ Ð² ÑегÑеÑÑионном ÑеÑÑе sql/cube.sql.
Ðо избежание некоÑÑекÑного пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑого Ñипа, ÑиÑло ÑазмеÑноÑÑей кÑбов иÑкÑÑÑÑвенно огÑаниÑено знаÑением 100. ÐÑли ÑÑо огÑаниÑение Ð²Ð°Ñ Ð½Ðµ ÑÑÑÑаиваеÑ, его можно измениÑÑ Ð² cubedata.h.
F.10.6. ÐлагодаÑноÑÑи #
ÐеÑвÑй авÑоÑ: Ðжин Селков мл. <[email protected]>, ÐÑгоннÑÐºÐ°Ñ Ð½Ð°ÑионалÑÐ½Ð°Ñ Ð»Ð°Ð±Ð¾ÑаÑоÑиÑ, ÐÑдел маÑемаÑики и компÑÑÑеÑнÑÑ
наÑк
Я оÑÐµÐ½Ñ Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñен в пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð¿ÑоÑеÑÑоÑÑ Ðжо ÐеллеÑÑÑÐµÐ¹Ð½Ñ (https://dsf.berkeley.edu/jmh/) за поÑÑнение ÑÑÑи GiST (http://gist.cs.berkeley.edu/) и его бÑвÑÐµÐ¼Ñ ÑÑÑденÑÑ, Ðнди ÐонгÑ, за пÑимеÑ, напиÑаннÑй Ð´Ð»Ñ Illustra. Я Ñакже пÑизнаÑелен вÑем ÑазÑабоÑÑикам Postgres в наÑÑоÑÑем и пÑоÑлом за возможноÑÑÑ ÑоздаÑÑ Ñвой ÑобÑÑвеннÑй Ð¼Ð¸Ñ Ð¸ Ñпокойно жиÑÑ Ð² нÑм. ÐÑÑ Ñ Ñ Ð¾Ñел Ð±Ñ Ð²ÑÑазиÑÑ Ð¿ÑизнаÑелÑноÑÑÑ ÐÑгоннÑкой лабоÑаÑоÑии и ÐиниÑÑеÑÑÑÐ²Ñ ÑнеÑгеÑики СШРза Ð³Ð¾Ð´Ñ Ð¿Ð¾ÑÑоÑнной поддеÑжки Ð¼Ð¾Ð¸Ñ Ð¸ÑÑледований в облаÑÑи баз даннÑÑ .
ÐеболÑÑие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑÑÐ¾Ñ Ð¿Ð°ÐºÐµÑ Ð²Ð½ÑÑ ÐÑÑно ÐолÑÑ III <[email protected]> в авгÑÑÑе/ÑенÑÑбÑе 2002 г. Ð Ñом ÑиÑле он пеÑеÑÑл Ð¾Ñ Ð¾Ð´Ð¸Ð½Ð°Ñной к двойной ÑоÑноÑÑи и добавил неÑколÑко новÑÑ
ÑÑнкÑий.
ÐополниÑелÑнÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð½ÑÑ ÐжоÑÑа РейÑ
<[email protected]> в иÑле 2006 г. Ð ÑаÑÑноÑÑи, он добавил cube(float8[], float8[]), подÑиÑÑил код и пеÑевÑл его на пÑоÑокол вÑзовов веÑÑии V1 Ñ ÑÑÑаÑевÑего пÑоÑокола V0.