From e1547206e2262243c1dfba4f6f4d0b5886d86562 Mon Sep 17 00:00:00 2001 From: Lionel Sambuc Date: Tue, 29 Oct 2019 15:13:19 +0100 Subject: [PATCH] Updating to new Index<> API --- 10k.index | Bin 664931 -> 807428 bytes src/evaluators.rs | 9 ++-- src/executors.rs | 121 +++++++++++++++++++++++++++++++-------------- src/expressions.rs | 15 ++++-- src/main.rs | 2 +- src/symbols.rs | 30 +++++++---- 6 files changed, 122 insertions(+), 55 deletions(-) diff --git a/10k.index b/10k.index index 0c1c8377f550e02dfbde9f41bc2065ecb58d1e59..06facd8a922ebbd6f9468dc0b475bee125c6990e 100644 GIT binary patch delta 34907 zcmc&-2e7SYRn5Kc?)UOSOQ<5DU3%|D1QH;MBAQU73Q`ml6sZb=O7Ci7l&69M3P=+W zP*93Wks=~U7wLixH7X(sqHFEFcKOb^nQ_K(Wae>l&-wP+YpuP%^8e?Ydq4N?D?jlC z*E#dnXJ7o#dC$7bX?w@ve`lR>-LtR0bKVP{bBh1Sr}V#gx#P|5i8Z4M=e{HW|0uq4&!2=;}7bK1r%#09-5);`IBam2(M^2;A zrlAXctj?cGAfb=9}__W8)rj!v2(;x@>M~pB0`bZLzA(w zq9!|*Ik){QpIS#Ia!XGrl-;9Mb5d}~9IEt;AYfQ3hRkW_DK)$3Q;i#J5jE|Usv*_R z3j|G(<12-LoDa)Zd(G*ita!*wOEb6u=Wl?W1Q7ATG7XkyI^f>e z1rV+(?4(RBJRT0XJ4M>%gTUQtJt zr%l01x!tLYb~L(P<(^5sz-l42fi!#5T&&~KtZ5~u_$;32ELEf3-+*YXrpT`7wdd4A zMA%XSADjgD^@dS=*vt-+eJlInkZiVZOc)kF!m(Dk5InI#tD7$IN#A&y5EU$`ZloI_ z4nzf(sE7lRvnRa^PX>tE_ej|yBi7JS3c$YaYe#)e7lDo)Vx4Vf6PQ>@q4(saN(XzH zHb_B2g?>fOCQ%g$ZI@0IIy%*klBB;(o4kZUbh`{Nj?{@kf;E7UOQU(#%OXOXYxlIW zOR*P5BqDJvl5YQgvfkhA1(<i90a$^HOSUJAok*-!ft6Hs9nBccB>WS zdd5d7yatq%CPrI9mtCO^QS*gqbF?I=2S#1(iinPG?2To#O4d)}XXKTdJo38FOG@q? za#PW3dJ42FHwf0ZZKsLsK(Vh2A%XQ^yV((#h8Jb9O{Me)vI~cj@PtCT8|L_ zNr8ab87|>!C1Gbb1)rRrx)X_}QgX<^ z^8*1t5#6p+96Fp#dh}@Fr4xo_cHJVu^WBIbOrVVx#FG>_i*DBgLa**b$Qi3V;x059 zL{Pi_LCK>Qp+1r=GeJcpn%$r**v00cbmejzv8I;D>NvY$)96KstWyZ%qq)>jO64MM zR3uP`(Qsu_xEQiR%4#!3+KrP#p44PD9;8?~-QemFXK3Gq;Mh}kjxLoRW;c*qcazMw zPwU+0$#ABbE?k61@JX&f=$)oXcU$z?552DzWdAKuu7JSt^%jH-7H0u zfy_~>t^RhQZ;p^&a=cNrS`6wyQ@^;?ToCP)Vk(1IwfJdGDIUexPAvf1y~f zKd-0V0`YMS(x#Q&rQxYRdTk{mZRBLP1dcX8Toh@E!3$83)eQ(YP1PWr-KrQ21tBnc zMNDSkXj!^S0;e?$pNeFBC8v(qGG|OVRcLr--vSVwh_H1CWKA|{%tDi;ed`i0w>(10 zhO5a-S%_t~M!e=*U7Iqb91U5M^0zIzvs?!`AIihi;DjMkEu5_DMmhoTkQJpK%m7@wVQUhg#r@IZi{g$2j;Q(3?jLVO0}3)(d|1^7H2Y_ z#>1uyc&dqg7Xoxq&}S$~R$iCM2KVGCc#yZ#TV0(1VnS$?_v;yzYNzfZ=ymDnOk)8B zUHRZBw<{DDZfZ-LLbYOK)M&Y=|LqF~x0aYKogJnjb7DppuC6nK-Jx)}>1Vb!zS#>Z zO9sU7(^thiHjEl;P2Tf2{TI$O_`3n3+hw(Vict>ptWlc5$BEdTibLPCqZ>IDvkJse zeS|TR*qs{%x7;xIGW6Zlf*?NW@W&BqW{WWp@RJCM!<%O3#>#_vYE| zG`kxDH3@Mf6=c?phA1Yu#PTwxjNKjazNT>!$|9wgUVF6tX5Wj*y-35W-_aWG_q`I>Z&r!EbaOxo zbMZrw-5Y^ggD{6y`l|6jTbfE7$=L1#7?n-8jGT6+6~tOjNo5whZ`07twvA9R6GG@8 z4elhquSuZz%;_N6aHg(Ol5QM7$kNSA z%_+qm-r>6$PTZuSjH4sycJF<4M(&kAh|c3Y{s|VwP`6)4jpc&7^%hqJ^Hbolt&y^M@dyffvEjt6XWf1 z2vt$A?5ijmux*RX3%#M8>>t0dS2EW=n}4KjGnvDlfOxHtSnWm?H%t&cCblOwai9(2 z8M9O?7>gNmdI#8(0HP|#Z5~;ShgsRdNV)9EEm@}oydt*?f6FeyqdNAKj_%9tsbQ2a z^|akjt!T9NbU5=zpQ?Nmo&C-f_OuG;-CjPGDWsE`$TTK?wNqI3^p1w`BGu|A;4nO; zKLhc-3aCgEMrp||>>jK` z4PO~`QEKn0=U}jAQEhrrmNCB(KkMO@{1pVsnZC~@Bf^_#2vyhfv*6+DuOeEl6X&*+ zJF=!z&hxn~3j2(Faz9!BjAmkc9)@o2{|Xp&pCO*fo{u;wg3017MH!ebdc=gVUqiGO zM?{aX9Cd&)Z*29iQ~&h^WJI6>VXA7w84<$6|UbyAQ zmTC;8(wwLX!Y+JKN9%Nwqg?gcx6~#sZkPQ=MPr?iL-LfROi#T5#>xW>a`J)OFWiKfZUD4u&Sp@aeS|ufMS4hlW+DdAh7@j8+fyoGA62)Ft0Q~Hl z@P}cdi-%H!|4wo&#mh?wKbIL2hUOd^s|ph&DOL(tq-(#~AeiqW=vdq3A(swyw3uSA zC@p;fppjy6Kt-jM#O##?Kq>N(p-EYT#V^F9R(n-PW3h`qj0rWncrbww8UCtI9v&aR zIrz;@4OO3tf;fijNM^4F3B8f9RAcOh_8N@Q@_0Cvd36t%^Q3F9tpI+kMJ7ZOhCtB} z#WS9I{QQ6@c&G}4bmkRUm<%iBiTw^zYEQyb5-oh8wdmI!#E*kBixO8I?DdGyNue%J zHOLF6t{e7(#Ux26``tp}fmtNQ&IgB~@F-VD<&bK^+wTFS_sA7Qf@fmJxGZ}E0(FTU z7qb5J##%!Jdm~0_@8R8-IeEfzCTN>UGMyt+dsD}cQGoGekyh)Zlu0LX?ahdeb{n&* zs__s6G!-BLA`a?GL*686?k+jsb8yr|0Qfo5+*sC>g>t^um8#<>g; zkqjnJgS;c(-Y~E=c(RA1o5M+gueM1BaqW*1B;KJ(*UK!HZz=3bm%#Rp#MtKzv?Vl; zN`R>uA+mTF?ChNY(Sfb*Kg$!ffP1ptzxFOf_8R0i)r3Y8X=g5bcQNh7TaGJ`Gr(vsgJ1s#2a4#}1Q_o*v+qY2_$p!_T*6{}5Xw%86BFen2x;4g zN}TRr9=s|E#g(qCDcC*?6fMfAJJ~JMTTaUxui;0Ua9@HX*Flmo({B4{5guRM5%OY7 zE}n`XCDfdfp^T)O`Z@;_yiTsAAZ}C2;nQEcJ?e z#HSFkd26ODvrpqyO%g4xpi;r=hVWK0<@%_ZeWpoi)}&`*GYWwLM6k~yrcWc%>9b2~ zaB)P$(21Xz+CH}s=TqJ=nRrBG8;XngGo$@wgW%{kVvwawAY*p+I6U*I+2XdPS9wv~yp3*L2k_P<5Ew&{9XM*gK$p(vz8V|qXRT}5&M zjz-eUNnQ>%eX_7GB5<7nv1I#(tf?=$tKCV6wflR3`0BzvTZG+HHBF8M75fK_RfTk$ zDVtWUDXR{M_X_`G=Gq@0CX$mC;~MOoPPG;jEW;w!bSf25PxMb6o%ikJhls9Kj7bvR zMIQFg3(?U4IU@z*gZ~AC`;t|!tfi+$`x3_W`D0ks)eU7)d{T6K?Oze7I=2@};1Sf8 z%*w}s%G!N7C9%$uKZM~)Mk>hutu^)g-Ofn!mu}lvS`kLg#vWKnOvy;t{(T7)8x>If zFouH^)kb6dM~9*Z6*|qBJs}!y|5p*H{RjL1ASie|gh1FIslJ8?wL5kg@gmEERx;Jy zA$&pj&(5dGf(%MqqdK?y^7R&nzI8*hZ)5TBa%*N1D~SGAhv`ZWxFY0y4{Q)SZm0Bt zp$wPIwSPt1vx^WV7{4X1&IE#Digqrb97;kVVPN4&?<0P{++o<8>o6~T(C=x1QA;&2 zbL|i?R9<)>@zZCumjlv4<9FA4H517q-%Nxhb>TYW`NixIj|0_OCV|yhf}!v65bYC7 z4Raa4C$Cijb11Ef!L(xOwV}cIo%*29b2OWFR#`3%ACSBYbn+@bYZ4XeVO}CoVAmZ$G*PX-XRAi&XrMqP?4kB z1%cC-4dZ3tdG4*%@In>Q_cG*=IIE-rBZ^%ZL4A?M0kd9Hpk1Vu#TP`uWYjr%X+_A) zQBAKPo6#-`l-^uslPOS;6_NAF>0Yd(k#Cf6X^-JnMib7yp~UvNKY7N=6V8(7#VgbJ z)N~A5ZCrcN0jR{ju>kmP6Q9QenWd>C&{?MOP8EZ5dBoX=Pi^S+nO(~tUZfDiefV4) z>n#H2N$jK^cnnE4Zto=#-us%eZjM4O!31)z4S0psvr82Ver8HADhdZ=Q3NAzilKUJZevCX~@EjPkNv331w``%@qtLKT3YDki>NxpZ*y957V=GQC}; zbM^0`h+HyG+Lvl@XXN~`tER;L?luJ|T**eeMhF~75-m%aVQ#s&U~7M!Z5?COZ` zqq&l0$uT(X85Oi^6kBeVdZk*q%!(~*VA(YhsLM4@%Ecd!iw3$@!=sBczS}&jB!N=K z{B~`GYGubLHN&V=c8)k#Q6uqn5Ur(0=h%(8CP25BGcwH)M>4VN0wfI8{c8HLC|wNW zI)A;+y9#!?nS>z8M?}<2p7;6yshbIIrq+xxHd^Ke#c;fDKS+Tv5i=J}vKt~s(-ez( z_AN$AI>YToNnzh-Oo*PIsbZvUH^$)Q2w(XkZY8vKLD1vG`6i%fj@S2+)WnMh_b!%* z$@nG}PAd*fITxG-lD2$v$K%3Q(-xw(VB*A&X`%$)~(8_*{K-U3+Sd21tgoT`DwR6xTcfd z15sz;pXEWyOe#1f(SA}2rWv?8Go z{Y-QWiiEM=t$vHJOZk>U;gLisnTu({zRAf&&Q*q4>{|h%^}64u_55SHrz{tL>q^^u z3j>gK=*3TBq@+e}+ZKWOFq$snP2X!dwQUJ=>u zS&8+QxdQM&{7M=9EVG4A9Q$4XXxZs&G7e~C?Ox3e%Z{SuTNZpwnCMv^f9~CZy~UD5 zfY0Vm95(5FI*fOp1KK$)#>aVS^sn6)fm%}NLkG$ZJjlEzq1GYH-uEGXzD-_Vknw)_ ze!QxF0IewU!eLhQel@ty*|I;Sf}ZVwA9C7qRRCof)UNXzw*8p%Xyv4*(Ux9++}Dm4~#99Gzu9gt6zg zn=BbsDTG}@U$Hu_@J${t!U`t1(%I9s6WI_$uct8Q2Gumf-u zv^~0UXDYA4!-1nKvuIbZQI?we>=78EdBt9Y)4*H%Mhb~;KbnZ6ee}ARxqu(TFkP$E zJmKq^dN`16<7^&@IMqQn0WxBc06{O!C?KBl(y&_gs7lVQLt3Uc&Sb1+h<3Yv9D#i( zVuWzwaDJhzR_}-!R zM4))b<38`!zNGR8foa2&D)-oY7KTfV1$Y@373Pi9@SV?y^W7^tJrvhRKTt1EpI!dY{ zEBl$uz0Va-S)C}+ldUFEl8%|>3Vj~@Y=hu1I?^U7C&MJU>%QxwJ`p^>-EOA2!W!cYV^f0jMxo{tT!fSW&Yy@lZ)(y7l-kQxz{_~YB z9pRv~tEvwC1Dfs^GI*bF;B`woRAQ_whu`)rgljR!^}TlzK{Al#vtt+&AJojJReQqP zFXC10wP+fZVkGpK6sFXb2bw&^FBM4t8V^CudP|?%Ga6o9Zogba+pBKOXXDkSEzP`dQnet%*_a39XTRR@>pLGxfQQnwfkig<0>rCr;upN+Ajy^q9P6!aFRTE5 zEkwS03bpKNypwzpVsv~)eb)lX6X`qWwfKEoodMh2XhLWS{W>~SBfl6C<3POBO>|~c zZ5iTDykr3xVX6cl8rf}HRwUmZUJ4Lzs@&h!^`RGGX~6@PM@PLZgXZF(HEm^Z)6sQ!X zz+TybID(WKM@8(pT5qpHpib5Cfh%U}nzS52%(fhTX1|p}{oZj93&Bo?l}z%ij=dV= zwTa~?KLF|Z$*vOvMEj#${-_n-Suq1Rnpkj@SEPDOwrJ z4B#rhe6Y78x)+}zIWsZ`n}G|FPw3MhdGwOpT3k7cJTURopym)chrLvz-1d&IokzVzL$Wk-ApKIj zJItQ2Kkn$h?Orbn2@lLD$NGxH-qX>j?kr{1P_cNB=;4I@3F7-sw!BPnFac2n!UM7G zy%^r@Fj)$84RsS}ul*?kwM1qY%67+nU(3+SkBrq*{BO527CT1ZsWQagk7%7sP$)9V z=I}Affo`wRS+mfd>S zX00OQ%I;`#u~2#@u}=V}Hk1u*Tpm7&*SnxG7siQ3d{=jw#y*9>(53GLg=DfY(+RFE z>5hJ`Y1CH$hvVHeqp*0g7~sF3cNP5F4ZyVV8ta4BDp6rt>o$D81;mETj6r#z;K>q@ z;e@g;AY6TmgLq1gxmM-3zrrXj4E5V;m?WX(n2P1Vf8D$=M|*Y89$m?avFhi>{!QiN zom&mp01cPVqr~>Nh?0+p8im-%>+DB4?e99BHr8B#q-yO7r})LvI4G{9M0i#*j6-+s z{XOF6`v7(L=WzQ6yy{ab-rYwD1tu>@0Z;naf5cdQm@V4a&M9vFB^@bI{2-d{iY)qnAga%DvbqRi6cOyJJxa%rRU}RQTII*RFhA96YN%D{ z1n@{D+T%YF;3m)&4H850*!wzOpVu`wLuwQ;E{?D5;eY4UA7womKlwlZqpW-WD*hBJ z|0wHq_`?q1>VLS9>;E0fAO812cO>fnAk!gb&&->Tr|NY+^a)ND4i~aNRcBRwxagHI z!V3m16;mj-wzWZo?48f*CA`m?-30M2=E|)C&vsF#5h#O|f}k6J2Q^0VoThG08Qm&q z4XKefhhd?lr;o)!W1KWxhOW1zOdvihtw8#hutj%i|A^s(4z@P*&O3MiILx@NC~A$lv|b1N7?*uqI#duSLRCv zq7b>GPU0w+3FZ>*e9dI@aOQ~f28Lh-B_?j{`3og~9XJ?m5ATID{he)pfd{4xsBl=pS*rO?+Wxmv!&+yWuT4kAMl?iGn!U&uY(2R2 zqf&6kO}XAnrOLyFS) zUsV-KeRWDU4E>8h(Nh}t<)Y~e+m>0f%wkQE*&l*cxYvqhvWq3g{EOKo7q}Bkg%y=3 zI4l@{XjQjYQ@Vl=tnd)zyp3D6DztT=iCoKqJL=V~)qiER@0p8rxDgN{Bzp3OfQ~f( z%qo~n&$La<2*Rh!Dm7CX4;fWs@01w1FxV(dPeE1GE}1B-G5Lnpm50|Wi?eKsBxILL z3}3BF=2~1O#6zKFJCS7nvDNvVAJss!Nn(nnAbYafWtvH@Ow*LL9x_uoMi1F#6DCbT zrtx|wlo~vUTg(#n?0#bS=Ul>+D2>$kP?;)X$}x&I{}3w{$)(47okG55C|QD}+4Ik^ z0;D)L`=XZt8^?s}ERGHMj!`z-PP0M@sie*Z_QN3yxm^=zzAunjdLc3C- z@LF{^&ur1+86VAB9VacZ9$dL$^gJG}X1ff^5IN58^$WhB8p^_;TbIiZl zDpzs^OEW^rusP<2K%B`nOHen<$QAyr+p|>5I;V22LgBk+sizmQmXa=~|3Q(A{BO5v ztzB+x05Ph7CdqI~P^O`G{0Uc{(Z$u{t0rlaIBe7Pzu>C+bg#&kOy(7Wp-CxWSVbD< zf5f%B)>~35(VCcAa+R*SL$o`4{dTq+P84RK$caR{OODKGH)t4~zT}=$(k3LxGP=u1 ztN^)TgXk>=j8YpY@$jf5r6CwhEW1&|@a9Ey$r2c=0U^`e!8l=VTrmA9(NGlO@<70& zTLDnc`JZ`J)8Q?Qm>;uLOSKnZQ6j$Gq`0vE^@5};U>r< d5mMb!F`YT3VEUbZ4I6!z#?ZN95n7q%zX4Iii(vo& delta 143 zcmZo!V)*!!#sqgxMg|DTo#^d@#F>rEc^%Hf0##OKpl7(*i*X5~AWY+bFnC|jJbj`r xm-O@vTr3>ZYgD-;nyr}It(X~sm bool { +impl<'e> Evaluator<'e> for Predicate { + type Object = (&'e String, &'e space::Position, &'e Properties); + + fn eval(&self, object: Self::Object) -> bool { match self { Predicate::Not(predicate) => !predicate.eval(object), Predicate::And(lh, rh) => lh.eval(object) && rh.eval(object), diff --git a/src/executors.rs b/src/executors.rs index 8633292..7f3cc95 100644 --- a/src/executors.rs +++ b/src/executors.rs @@ -1,9 +1,9 @@ -use std::collections::HashSet; +use std::collections::{HashMap, HashSet}; use mercator_db::space; use mercator_db::Core; use mercator_db::CoreQueryParameters; -use mercator_db::SpaceObject; +use mercator_db::Properties; use super::expressions::*; use super::symbols::*; @@ -24,23 +24,36 @@ impl From<&LiteralNumber> for space::Coordinate { } } -fn complement_helper( - core: &Core, - parameters: &CoreQueryParameters, +fn complement_helper<'c>( + core: &'c Core, + parameters: &CoreQueryParameters<'c>, space_id: &str, - inside: Vec, -) -> mercator_db::ResultSet { + inside: Vec<(&'c String, Vec<(space::Position, &'c Properties)>)>, +) -> mercator_db::ResultSet<'c> { let (low, high) = parameters.db.space(space_id)?.bounding_box(); match core.get_by_shape(parameters, &space::Shape::BoundingBox(low, high), space_id) { e @ Err(_) => e, - Ok(points) => Ok(points - .into_iter() - .filter(|o| !inside.contains(&o)) - .collect::>()), + Ok(points) => { + let hashmap = inside.into_iter().collect::>(); + + Ok(points + .into_iter() + .filter_map(|(space, v)| match hashmap.get(space) { + None => None, + Some(list) => { + Some((space, v.into_iter().filter(|t| !list.contains(t)).collect())) + } + }) + .collect::>()) + } } } -fn view_port(core_id: &str, parameters: &CoreQueryParameters, bag: &Bag) -> mercator_db::ResultSet { +fn view_port<'c>( + core_id: &str, + parameters: &CoreQueryParameters<'c>, + bag: &Bag, +) -> mercator_db::ResultSet<'c> { if let Some((low, high)) = parameters.view_port { let vp = Bag::Inside(Shape::HyperRectangle( bag.space().clone(), @@ -52,7 +65,11 @@ fn view_port(core_id: &str, parameters: &CoreQueryParameters, bag: &Bag) -> merc } } -fn distinct(core_id: &str, parameters: &CoreQueryParameters, bag: &Bag) -> mercator_db::ResultSet { +fn distinct<'c>( + core_id: &str, + parameters: &CoreQueryParameters<'c>, + bag: &Bag, +) -> mercator_db::ResultSet<'c> { match bag.execute(core_id, parameters) { e @ Err(_) => e, Ok(mut v) => { @@ -64,30 +81,42 @@ fn distinct(core_id: &str, parameters: &CoreQueryParameters, bag: &Bag) -> merca } } -fn filter( +fn filter<'c>( core_id: &str, - parameters: &CoreQueryParameters, + parameters: &CoreQueryParameters<'c>, predicate: &Option, bag: &Bag, -) -> mercator_db::ResultSet { +) -> mercator_db::ResultSet<'c> { match predicate { None => bag.execute(core_id, parameters), Some(predicate) => match bag.execute(core_id, parameters) { e @ Err(_) => e, Ok(results) => Ok(results .into_iter() - .filter(|o| predicate.eval(&o)) + .filter_map(|(space, positions)| { + let filtered = positions + .into_iter() + .filter(|(position, properties)| { + predicate.eval((space, position, properties)) + }) + .collect::>(); + if filtered.is_empty() { + None + } else { + Some((space, filtered)) + } + }) .collect::>()), }, } } -fn complement( +fn complement<'c>( core_id: &str, - parameters: &CoreQueryParameters, - core: &Core, + parameters: &CoreQueryParameters<'c>, + core: &'c Core, bag: &Bag, -) -> mercator_db::ResultSet { +) -> mercator_db::ResultSet<'c> { match bag.execute(core_id, parameters) { // FIXME: The complement of a set is computed within its definition space. e @ Err(_) => e, @@ -100,12 +129,12 @@ fn complement( } } -fn intersection( +fn intersection<'c>( core_id: &str, - parameters: &CoreQueryParameters, + parameters: &CoreQueryParameters<'c>, rh: &Bag, lh: &Bag, -) -> mercator_db::ResultSet { +) -> mercator_db::ResultSet<'c> { let l = lh.execute(core_id, parameters); if let Ok(l) = l { let r = rh.execute(core_id, parameters); @@ -134,12 +163,12 @@ fn intersection( } } -fn union( +fn union<'c>( core_id: &str, - parameters: &CoreQueryParameters, + parameters: &CoreQueryParameters<'c>, rh: &Bag, lh: &Bag, -) -> mercator_db::ResultSet { +) -> mercator_db::ResultSet<'c> { let l = lh.execute(core_id, parameters); if let Ok(mut l) = l { let r = rh.execute(core_id, parameters); @@ -159,7 +188,11 @@ fn union( } } -fn bag(core_id: &str, parameters: &CoreQueryParameters, bags: &[Bag]) -> mercator_db::ResultSet { +fn bag<'c>( + core_id: &str, + parameters: &CoreQueryParameters<'c>, + bags: &[Bag], +) -> mercator_db::ResultSet<'c> { let mut v = vec![]; for bag in bags { let b = bag.execute(core_id, parameters); @@ -176,7 +209,11 @@ fn bag(core_id: &str, parameters: &CoreQueryParameters, bags: &[Bag]) -> mercato Ok(v) } -fn inside(parameters: &CoreQueryParameters, core: &Core, shape: &Shape) -> mercator_db::ResultSet { +fn inside<'c>( + parameters: &CoreQueryParameters<'c>, + core: &'c Core, + shape: &Shape, +) -> mercator_db::ResultSet<'c> { let db = parameters.db; let param = match shape { Shape::Point(space_id, position) => { @@ -220,7 +257,11 @@ fn inside(parameters: &CoreQueryParameters, core: &Core, shape: &Shape) -> merca } } -fn outside(parameters: &CoreQueryParameters, core: &Core, shape: &Shape) -> mercator_db::ResultSet { +fn outside<'c>( + parameters: &CoreQueryParameters<'c>, + core: &'c Core, + shape: &Shape, +) -> mercator_db::ResultSet<'c> { match shape { Shape::Point(space_id, position) => { let position: Vec = position.into(); @@ -273,10 +314,14 @@ fn outside(parameters: &CoreQueryParameters, core: &Core, shape: &Shape) -> merc } } -impl Executor for Projection { - type ResultSet = mercator_db::ResultSet; +impl<'e> Executor<'e> for Projection { + type ResultSet = mercator_db::ResultSet<'e>; - fn execute(&self, core_id: &str, parameters: &CoreQueryParameters) -> Self::ResultSet { + fn execute<'f: 'e>( + &self, + core_id: &str, + parameters: &CoreQueryParameters<'f>, + ) -> Self::ResultSet { match self { Projection::Nifti(_, _, _bag) => Err("Proj-Nifti: not yet implemented".to_string()), Projection::JSON(_, _format, bag) => { @@ -287,10 +332,14 @@ impl Executor for Projection { } } -impl Executor for Bag { - type ResultSet = mercator_db::ResultSet; +impl<'e> Executor<'e> for Bag { + type ResultSet = mercator_db::ResultSet<'e>; - fn execute(&self, core_id: &str, parameters: &CoreQueryParameters) -> Self::ResultSet { + fn execute<'f: 'e>( + &self, + core_id: &str, + parameters: &CoreQueryParameters<'f>, + ) -> Self::ResultSet { let core = parameters.db.core(core_id)?; match self { diff --git a/src/expressions.rs b/src/expressions.rs index 22669c3..8f0d330 100644 --- a/src/expressions.rs +++ b/src/expressions.rs @@ -1,6 +1,5 @@ use mercator_db::CoreQueryParameters; use mercator_db::DataBase; -use mercator_db::SpaceObject; pub trait Validator { type ValidationResult; @@ -12,12 +11,18 @@ pub trait Predictor { fn predict(&self, db: &DataBase) -> Result; } -pub trait Executor { +pub trait Executor<'e> { type ResultSet; - fn execute(&self, core_id: &str, parameters: &CoreQueryParameters) -> Self::ResultSet; + fn execute<'f: 'e>( + &self, + core_id: &str, + parameters: &CoreQueryParameters<'f>, + ) -> Self::ResultSet; } -pub trait Evaluator { - fn eval(&self, object: &SpaceObject) -> bool; +pub trait Evaluator<'e> { + type Object; + + fn eval(&self, object: Self::Object) -> bool; } diff --git a/src/main.rs b/src/main.rs index b287394..539345b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,7 +32,7 @@ fn main() { output_space: None, threshold_volume: None, view_port: &None, - resolution: None, + resolution: &None, }; let parser = QueryParser::new(); let parser = FiltersParser::new(); diff --git a/src/symbols.rs b/src/symbols.rs index 24094c1..026f548 100644 --- a/src/symbols.rs +++ b/src/symbols.rs @@ -1,7 +1,7 @@ use std::cmp::Ordering; use mercator_db::space; -use mercator_db::SpaceObject; +use mercator_db::Properties; pub use super::types::*; @@ -217,7 +217,10 @@ pub enum Position { } impl Position { - pub fn value(&self, object: &SpaceObject) -> LiteralPosition { + pub fn value<'e>( + &self, + object: (&'e String, &'e space::Position, &'e Properties), + ) -> LiteralPosition { match self { Position::Literal(literal) => literal.clone(), Position::Selector(selector) => selector.position(object), @@ -347,6 +350,12 @@ impl From<&Vec> for LiteralPosition { LiteralPosition(lv) } } +impl From<&space::Position> for LiteralPosition { + fn from(position: &space::Position) -> Self { + let lv: Vec = position.into(); + (&lv).into() + } +} impl PartialOrd for LiteralPosition { fn partial_cmp(&self, other: &LiteralPosition) -> Option { @@ -394,24 +403,25 @@ impl LiteralSelector { } // FIXME: THIS IS SOOO WRONG - pub fn position(&self, object: &SpaceObject) -> LiteralPosition { + pub fn position<'e>( + &self, + object: (&'e String, &'e space::Position, &'e Properties), + ) -> LiteralPosition { println!("LiteralSelector.position(): {:?}", self); - let v: Vec = object.position.clone().into(); - - LiteralPosition(v.into_iter().map(LiteralNumber::Float).collect::>()) + object.1.into() } // FIXME: THIS IS SOOO WRONG - pub fn str(&self, object: &SpaceObject) -> String { + pub fn str<'e>(&self, object: (&'e String, &'e space::Position, &'e Properties)) -> String { let LiteralSelector(v) = self; let last = v.last(); if let Some(Field(name, _)) = last { if name == "id" { - return object.value.id().into(); + return object.2.id().into(); } else if name == "type" { - return object.value.type_name().into(); + return object.2.type_name().into(); } else if name == "reference_space" { - return object.space_id.clone(); + return object.0.clone(); } }