F.8. cube
ÐÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ ÑеализÑÐµÑ Ñип даннÑÑ
cube Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¼ÐµÑнÑÑ
кÑбов.
F.8.1. СинÑакÑиÑ
РТаблиÑе F.3 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð²Ð½ÐµÑние пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñипа cube. ÐÑÐºÐ²Ñ x, y и Ñ. д. обознаÑаÑÑ ÑиÑла Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой.
ТаблиÑа F.3. ÐнеÑние пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÑбов
| ÐдномеÑÐ½Ð°Ñ ÑоÑка (или одномеÑнÑй инÑеÑвал нÑлевой длинÑ) |
( | То же, ÑÑо и вÑÑе |
| ТоÑка в n-меÑном пÑоÑÑÑанÑÑве, пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²Ð½ÑÑÑи как кÑб нÑлевого обÑÑма |
( | То же, ÑÑо и вÑÑе |
( | ÐдномеÑнÑй инÑеÑвал, наÑинаÑÑийÑÑ Ð² ÑоÑке x и заканÑиваÑÑийÑÑ Ð² y, либо наобоÑоÑ; поÑÑдок знаÑÐµÐ½Ð¸Ñ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ |
[( | То же, ÑÑо и вÑÑе |
( | N-меÑнÑй кÑб, пÑедÑÑавленнÑй паÑой диагоналÑно пÑоÑивоположнÑÑ Ñглов |
[( | То же, ÑÑо и вÑÑе |
Ркаком поÑÑдке вводÑÑÑÑ Ð¿ÑоÑивоположнÑе ÑÐ³Ð»Ñ ÐºÑба, не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениÑ. ФÑнкÑии, пÑинимаÑÑие Ñип cube, авÑомаÑиÑеÑки менÑÑÑ ÑÐ³Ð»Ñ Ð¼ÐµÑÑами, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÐµÐ´Ð¸Ð½Ð¾Ðµ внÑÑÑеннее пÑедÑÑавление «левÑй нижний â пÑавÑй веÑÑ
ний».
ÐÑобелÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¸Ð³Ð½Ð¾ÑиÑÑÑÑÑÑ, Ñак ÑÑо [( не оÑлиÑаеÑÑÑ Ð¾Ñ x),(y)][ ( .x ), ( y ) ]
F.8.2. ТоÑноÑÑÑ
ÐнаÑÐµÐ½Ð¸Ñ Ñ ÑанÑÑÑÑ Ð²Ð½ÑÑÑи как 64-биÑнÑе ÑиÑла Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой. ÐÑо знаÑиÑ, ÑÑо ÑиÑла Ñ Ð±Ð¾Ð»ÐµÐµ Ñем 16 знаÑаÑими ÑиÑÑами бÑдÑÑ ÑÑекаÑÑÑÑ.
F.8.3. ÐÑполÑзование
ÐодÑÐ»Ñ cube вклÑÑÐ°ÐµÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов индекÑа GiST Ð´Ð»Ñ Ð·Ð½Ð°Ñений cube. ÐпеÑаÑоÑÑ, поддеÑживаемÑе ÑÑим клаÑÑом опеÑаÑоÑов, пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе F.4.
ТаблиÑа F.4. ÐпеÑаÑоÑÑ GiST Ð´Ð»Ñ ÐºÑбов
| ÐпеÑаÑÐ¾Ñ | ÐпиÑание |
|---|---|
a = b | ÐÑÐ±Ñ a и b иденÑиÑнÑ. |
a && b | ÐÑÐ±Ñ a и b пеÑеÑекаÑÑÑÑ. |
a @> b | ÐÑб a вклÑÑÐ°ÐµÑ ÐºÑб b. |
a <@ b | ÐÑб a вклÑÑÑн в кÑб b. |
(Ðо веÑÑии PostgreSQL 8.2 опеÑаÑоÑÑ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ @> и <@ обознаÑалиÑÑ ÑооÑвеÑÑÑвенно как @ и ~. ÐÑи имена по-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑвÑÑÑ, но ÑÑиÑаÑÑÑÑ ÑÑÑаÑевÑими и в конÑе конÑов бÑдÑÑ ÑпÑаздненÑ. ÐамеÑÑÑе, ÑÑо ÑÑаÑÑе имена пÑоизоÑли из ÑоглаÑениÑ, коÑоÑÐ¾Ð¼Ñ ÑанÑÑе Ñледовали клÑÑевÑе геомеÑÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
!)
Также поддеÑживаÑÑÑÑ ÑÑандаÑÑнÑе опеÑаÑоÑÑ Ð´Ð»Ñ B-деÑева, напÑимеÑ:
| ÐпеÑаÑÐ¾Ñ | ÐпиÑание |
|---|---|
[a, b] < [c, d] | ÐенÑÑе |
[a, b] > [c, d] | ÐолÑÑе |
ÐÑи опеÑаÑоÑÑ Ð½Ðµ имеÑÑ Ð±Ð¾Ð»ÑÑого ÑмÑÑла ни Ð´Ð»Ñ ÐºÐ°ÐºÐ¾Ð¹ пÑакÑиÑеÑкой Ñели, кÑоме ÑоÑÑиÑовки. ÐÑи опеÑаÑоÑÑ ÑнаÑала ÑÑавниваÑÑ (a) Ñ (c), и еÑли они ÑавнÑ, ÑÑавниваÑÑ (b) Ñ (d). РезÑлÑÑÐ°Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ ÑпоÑÑдоÑиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¾Ð±Ñазом, Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑим Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва ÑлÑÑаев, ÑÑо полезно, еÑли Ð²Ñ Ñ Ð¾ÑиÑе пÑименÑÑÑ ORDER BY Ñ ÑÑим Ñипом.
РТаблиÑе F.5 пеÑеÑиÑÐ»ÐµÐ½Ñ Ð²Ñе доÑÑÑпнÑе ÑÑнкÑии.
ТаблиÑа F.5. ФÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ ÐºÑбами
cube(float8) returns cube | СоздаÑÑ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑнÑй кÑб, Ñ ÐºÐ¾ÑоÑого обе кооÑдинаÑÑ ÑавнÑ. cube(1) == '(1)' |
cube(float8, float8) returns cube | СоздаÑÑ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑнÑй кÑб. cube(1,2) == '(1),(2)' |
cube(float8[]) returns cube | СоздаÑÑ ÐºÑб нÑлевого обÑÑма по кооÑдинаÑам, опÑеделÑемÑм маÑÑивом. cube(ARRAY[1,2]) == '(1,2)' |
cube(float8[], float8[]) returns cube | СоздаÑÑ ÐºÑб Ñ ÐºÐ¾Ð¾ÑдинаÑами пÑавого веÑÑ
него и левого нижнего Ñглов, опÑеделÑемÑми двÑÐ¼Ñ Ð¼Ð°ÑÑивами, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾Ð¹ длинÑ. cube('{1,2}'::float[], '{3,4}'::float[]) == '(1,2),(3,4)' |
cube(cube, float8) returns cube | СоздаÑÑ Ð½Ð¾Ð²Ñй кÑб, добавлÑÑ ÑазмеÑноÑÑÑ Ðº ÑÑÑеÑÑвÑÑÑÐµÐ¼Ñ ÐºÑÐ±Ñ Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм знаÑением Ð´Ð»Ñ Ð¾Ð±ÐµÐ¸Ñ
ÑаÑÑей новой кооÑдинаÑÑ. ÐÑо бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, когда нÑжно поÑÑÑоиÑÑ ÐºÑÐ±Ñ Ð¿Ð¾ÑÑапно из вÑÑиÑлÑемÑÑ
знаÑений. cube('(1)',2) == '(1,2),(1,2)' |
cube(cube, float8, float8) returns cube | СоздаÑÑ Ð½Ð¾Ð²Ñй кÑб, добавлÑÑ ÑазмеÑноÑÑÑ Ðº ÑÑÑеÑÑвÑÑÑÐµÐ¼Ñ ÐºÑбÑ. ÐÑо бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, когда нÑжно поÑÑÑоиÑÑ ÐºÑÐ±Ñ Ð¿Ð¾ÑÑапно из вÑÑиÑлÑемÑÑ
знаÑений. cube('(1,2)',3,4) == '(1,3),(2,4)' |
cube_dim(cube) returns int | ÐозвÑаÑÐ°ÐµÑ ÑиÑло ÑазмеÑноÑÑей кÑба |
cube_ll_coord(cube, int) returns double | ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение n-ной кооÑдинаÑÑ Ð»ÐµÐ²Ð¾Ð³Ð¾ нижнего Ñгла кÑба |
cube_ur_coord(cube, int) returns double | ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение n-ной кооÑдинаÑÑ Ð¿Ñавого веÑÑ Ð½ÐµÐ³Ð¾ Ñгла кÑба |
cube_is_point(cube) returns bool | ÐозвÑаÑÐ°ÐµÑ true, еÑли кÑб ÑвлÑеÑÑÑ ÑоÑкой, Ñо еÑÑÑ ÐµÑли два опÑеделÑÑÑÐ¸Ñ ÐµÐ³Ð¾ Ñгла ÑовпадаÑÑ. |
cube_distance(cube, cube) returns double | ÐозвÑаÑÐ°ÐµÑ ÑаÑÑÑоÑние Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ ÐºÑбами. ÐÑли оба кÑба ÑвлÑÑÑÑÑ ÑоÑками, вÑÑиÑлÑеÑÑÑ Ð¾Ð±ÑÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ ÑаÑÑÑоÑниÑ. |
cube_subset(cube, int[]) returns 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) returns cube | СоздаÑÑ Ð¾Ð±Ñединение двÑÑ ÐºÑбов |
cube_inter(cube, cube) returns cube | СоздаÑÑ Ð¿ÐµÑеÑеÑение двÑÑ ÐºÑбов |
cube_enlarge(cube c, double r, int n) returns cube | УвелиÑÐ¸Ð²Ð°ÐµÑ ÑÐ°Ð·Ð¼ÐµÑ ÐºÑба на заданнÑй ÑадиÑÑ ÐºÐ°Ðº минимÑм в n измеÑениÑÑ . ÐÑли ÑадиÑÑ Ð¾ÑÑиÑаÑелÑнÑй, кÑб, наобоÑоÑ, ÑменÑÑаеÑÑÑ. ÐÑо Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ ÑоздаваÑÑ Ð¾Ð¿Ð¸ÑаннÑе вокÑÑг ÑоÑки кÑбÑ, полезнÑе Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка ÑоÑÐµÐ´Ð½Ð¸Ñ ÑоÑек. ÐÑе опÑеделÑннÑе измеÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÑÑ Ð½Ð° велиÑÐ¸Ð½Ñ ÑадиÑÑа r. ÐооÑдинаÑÑ Ð»ÐµÐ²Ð¾Ð³Ð¾ нижнего Ñгла ÑменÑÑаÑÑÑÑ Ð½Ð° r, а кооÑдинаÑÑ Ð¿Ñавого веÑÑ Ð½ÐµÐ³Ð¾ â ÑвелиÑиваÑÑÑÑ. ÐÑли кооÑдинаÑа левого нижнего Ñгла ÑÑановиÑÑÑ Ð±Ð¾Ð»ÑÑе ÑооÑвеÑÑÑвÑÑÑей кооÑдинаÑÑ Ð¿Ñавого веÑÑ Ð½ÐµÐ³Ð¾ (ÑÑо возможно, ÑолÑко когда r < 0), обоим кооÑдинаÑам пÑиÑваиваеÑÑÑ ÑÑеднее знаÑение. ÐÑли n пÑевÑÑÐ°ÐµÑ ÑиÑло опÑеделÑннÑÑ Ð¸Ð·Ð¼ÐµÑений и кÑб ÑвелиÑиваеÑÑÑ (r >= 0), базой Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÐºÐ¾Ð¾ÑÐ´Ð¸Ð½Ð°Ñ ÑÑиÑаеÑÑÑ 0. |
F.8.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.8.5. ÐамеÑаниÑ
ÐÑимеÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑвидеÑÑ Ð² ÑегÑеÑÑионном ÑеÑÑе sql/cube.sql.
Ðо избежание некоÑÑекÑного пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑого Ñипа, ÑиÑло ÑазмеÑноÑÑей кÑбов иÑкÑÑÑÑвенно огÑаниÑено знаÑением 100. ÐÑли ÑÑо огÑаниÑение Ð²Ð°Ñ Ð½Ðµ ÑÑÑÑаиваеÑ, его можно измениÑÑ Ð² cubedata.h.
F.8.6. ÐлагодаÑноÑÑи
ÐеÑвÑй авÑоÑ: Ðжин Селков мл. <selkovjr@mcs.anl.gov>, ÐÑгоннÑÐºÐ°Ñ Ð½Ð°ÑионалÑÐ½Ð°Ñ Ð»Ð°Ð±Ð¾ÑаÑоÑиÑ, ÐÑдел маÑемаÑики и компÑÑÑеÑнÑÑ
наÑк
Я оÑÐµÐ½Ñ Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñен в пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð¿ÑоÑеÑÑоÑÑ Ðжо ÐеллеÑÑÑÐµÐ¹Ð½Ñ (http://db.cs.berkeley.edu/jmh/) за поÑÑнение ÑÑÑи GiST (http://gist.cs.berkeley.edu/) и его бÑвÑÐµÐ¼Ñ ÑÑÑденÑÑ, Ðнди ÐонгÑ, за пÑимеÑ, напиÑаннÑй Ð´Ð»Ñ Illustra. Я Ñакже пÑизнаÑелен вÑем ÑазÑабоÑÑикам Postgres в наÑÑоÑÑем и пÑоÑлом за возможноÑÑÑ ÑоздаÑÑ Ñвой ÑобÑÑвеннÑй Ð¼Ð¸Ñ Ð¸ Ñпокойно жиÑÑ Ð² нÑм. ÐÑÑ Ñ Ñ Ð¾Ñел Ð±Ñ Ð²ÑÑазиÑÑ Ð¿ÑизнаÑелÑноÑÑÑ ÐÑгоннÑкой лабоÑаÑоÑии и ÐиниÑÑеÑÑÑÐ²Ñ ÑнеÑгеÑики СШРза Ð³Ð¾Ð´Ñ Ð¿Ð¾ÑÑоÑнной поддеÑжки Ð¼Ð¾Ð¸Ñ Ð¸ÑÑледований в облаÑÑи баз даннÑÑ .
ÐеболÑÑие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑÑÐ¾Ñ Ð¿Ð°ÐºÐµÑ Ð²Ð½ÑÑ ÐÑÑно ÐолÑÑ III <bruno@wolff.to> в авгÑÑÑе/ÑенÑÑбÑе 2002 г. Ð Ñом ÑиÑле он пеÑеÑÑл Ð¾Ñ Ð¾Ð´Ð¸Ð½Ð°Ñной к двойной ÑоÑноÑÑи и добавил неÑколÑко новÑÑ
ÑÑнкÑий.
ÐополниÑелÑнÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð½ÑÑ ÐжоÑÑа РейÑ
<josh@root.net> в иÑле 2006 г. Ð ÑаÑÑноÑÑи, он добавил cube(float8[], float8[]), подÑиÑÑил код и пеÑевÑл его на пÑоÑокол вÑзовов веÑÑии V1 Ñ ÑÑÑаÑевÑего пÑоÑокола V0.