From d73281d48a782d27ff5cb5752b63b887b6571138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Mon, 28 Nov 2011 22:29:43 +0200 Subject: [PATCH] #57 : worked on DSL --- querydsl-scala/.cache | Bin 0 -> 35799 bytes querydsl-scala/pom.xml | 6 +- .../mysema/query/scala/BeanSerializer.scala | 13 ++- .../mysema/query/scala/EntitySerializer.scala | 6 +- .../com/mysema/query/scala/Expressions.scala | 2 +- .../com/mysema/query/scala/GroupBy.scala | 8 +- .../com/mysema/query/scala/Helpers.scala | 9 ++ .../com/mysema/query/scala/Projections.scala | 43 +++++----- .../com/mysema/query/scala/Templates.scala | 74 +++++++++------- .../com/mysema/query/scala/TypeDefs.scala | 8 +- .../com/mysema/query/scala/sql/Paths.scala | 8 +- .../com/mysema/query/scala/sql/Queries.scala | 81 ++++++++++-------- .../com/mysema/query/scala/sql/SQL.scala | 2 +- .../mysema/query/scala/sql/Serializers.scala | 44 ++++------ .../mysema/query/scala/sql/QueriesTest.scala | 8 +- 15 files changed, 176 insertions(+), 136 deletions(-) create mode 100644 querydsl-scala/.cache diff --git a/querydsl-scala/.cache b/querydsl-scala/.cache new file mode 100644 index 0000000000000000000000000000000000000000..6dcf1e95b567b34ca6b27232a5b52d65a15a8a9e GIT binary patch literal 35799 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
    )WBCyj!AOI{1***l>0c5{(^~ajAOs$WQNn;; zel7^qwTw4n?(Y4VZHc1$p%-YM<~BcB*sFgYIvk9U0FdsVAaG(M%4pBc9iXwUa*WL0 zD4T!uF(UqqoYL)>dPm2+~d`M#lYIG{x&8=+A0f8Od_0EI3{ep!mGp{uIl5w?{fcYAeoTFY&ohSo;sJqCuPS zd1-*u_p!$R5Pik|M+p|RJ@~eBkAfuG>c>dfA<>^!j~F7${9`cZ?g#*nJ3H2gY3a#= zkMqX6?PWwzXn zWuwr|qk{!dZ1+G(JJ*)|{qh*h>DwcaF?<7STOojV0{=rr@Ep!~*!B~p(w~&HheTt{K-=w1jLVd$M8=kfNW_tGkxjr^4BHcK# z9w+^BY};O2Op}6~;;@WA*K4*IMxe<`wa_CJ6;VybU9deJp8F+hUH;^_e#D3Bf!{s+V4qv zHQILPY!Tt;{R~fHi=*SS0M4nm^Kiza73N;j*m-RD%Fwrv9TTa=^~LY&Z9T!nYLP)J zYBf{tW<@7nnnXDx(rD0-TblpgHLqGiW>lKBu_fIiF<0tQQl{F|40XjWo{A_$@NB!OmBH{D6LCzn#@Hk=AQ&JtAv;L`DQQ@ zk*p6!m!?sohW=5mt2_=hM;5WL%Y(3npoD0@p~F>OWrBzW1|UYUQ<2MxKUKe z{D7YdGIq;hVf=e;gD`4;nRl!3w+ZnUyWzkYFkAEt>O($6?K<90<%g#XOr6{0fT`8j zPSqKUN0(VQF-&J&$is*NC`8r19jj``uzSL`zEW;1<6`M}GM#qZ7=30y&jS=<^)>p5T>owLU2Do> zXc2;=%xhG{Z62>!Wr8Z$qPWXOT^!0dvE9Yhz8Dp|Vn~>^MSkRvJ03I%7RF2e6vb%! zmYm`cd`SP~0dJJ@zDu10Gk745zT8Z149bzhNHk)pwOq7fAtO3W_Ol>E&!PW zx39cxjVUUQ%!C72WtE#=2i;{u$);K8A!qTF-(rnsXcU+HJuiQ2-{>(1{FCgC1ale3KaZ&6= zqFGPdfLj7cplTUlC_}PD-9U`#*o{7U34k1V1Q!(IK6q2sc4mDUcX@;=65~I}Txkm* zdt@8mtgg3z1*P%A4N=DlQA+stE9=h$9g#m_>Up#rg=K>K3h5Rpf_@@S-kZh4u^Vq7 z00|v!^^NE+D&K{o5^8aJz-qL&NN$~+-3@CNj|Gl$i$Y66^_xLp_1o@>>ZL^`_}b;K zK6$7RyT5^A@+X$DwA<;2sGNcS;F2lr%M#v^Ku;_JfAQer0yR)r)a(igA{7DQpNbmA zLRicHXu#N8hm55)?48)v;E5NGmCf`n$a8Hg^-*W+#z=ONklb3#Co@hUnX+cI-SB7Z$Pwi=tkLkA}3_N$M5znGbk zthv=EcS^ldBrASVc?0p`^N)4olSp#hCPXGV7OpBJ-?5Et4&Pp=fkNRMQ}6nnxvCcU zU`Vxf1|!T#xce}*xSyNNNwrNE4w^sy$O4)ENmDWT{&S3Es$KUAu)yHlBbwb3yPO>H zK!QaS*?r=igvAIs7y=87z4L2FXbGYpXo;pj&=OmSHi}>$^+j=w9UNchAXmpWk&2;MR*^|Esr6VEjoAGnkmiEfrylDK`SZRjKH$QbTbTsT`x6x7?A&JuCZ#?4 z0TOZ#5eGwI@U}Z?@xWA#Ahe7*-_#1Rj3bw2p-a?1a~V>;ktGyc3Pn9+Tv=50OWw!- zcKUu`IQ>k)G>M$Pqyq|N|4iWvQ;Fxt7APPd2SX;hJZCqIVPBgbK%!p)#fSk8lo6#K zG_eguaPI~@qKz38T?{o5=te0NwY1C@#OLX#_qt4#(%hqeZ*DSgf3mG*sTK^gz z582raB<}h(NbFKr8rq6Xjo3YXGM2!7Vd?=SE`oMv7v(J}EZYh@Y$jLr9Qm-?F*T7f zMx;#6FG7sUfT_olt|VS=j|dUk#HQ~j*zt#^t%w+R>LI@(i-595dE^dofTZ_oGH$h)*01Wqjq2~qXb7sE>znxAOZ>nBn?S@bXUEoO&f+m$T-Dh)f4WHu z7SbW^V>_XogRU{Ga?$e*Xhgp36gS^YKvWRUtS!K3>L^~htK{0!n;D5y&dkgB!M$B` zPWR}%!F2HldCW>3=8y<9-&&KW6zD#fb{DK2I;zw6F zAe;ObpC2iE({rEtwcUiGsCPM zY4%9E{q(jUUB@zLJf0y0_$45I}RS>4i#aLOty&zbY{e=loi`aF%Q9FevXz9D?kNu4-ORWT5oHJ{u4 z*F@56#>+Y~Y=4cex;wY1HEd8jINJPXxQy2@o98w--oMS~Q)JW4{vDQ{r7g0qZW5us-1YcQ0g(w@ia^d5urrkld? zy*23jfA*cL-#i*0g0#U@Iyh-*mMIoW;O}UETgfCEMX6+>NG61sp+}KGYZ+x$)P0&@ zMdBQh4MHfhG;QLEq|dqy<)W>ljcxmEmP{sTwCi{=7?Kx*C)>XBk7s84H2a4c@>AJM z^2$`=P}~$P>Efq`mNcEi36SwG)(pyR@%EJ%K6R(11bFhe0-ZsAX<S(>J9~KJ7!neZp5ytD1e#2ICeS3oo=CoNDA@<65=^^oqjE2o12uNv`jE$o{erv z3oC-Re#{D=MN7s^d&R2r*?Uc@qk;}D5g$Y3fxNw~AycuxF7Jyk@~?ll(W0fg(zhu& zc59ml_85_KI&>_7o_qVRvW2zE?KtS!TD3hYHBakjg}szrt3(P??qsE=x3YBMf zT;soN20HlwZcj>eBQ$IHb}cffmzxKRZdhK;zDE5SgH@EnY4$zB=drptp2e<5PIf(v z=kwUki|4WYJqKa3@;bi%)`C17)n@fF&c>`5Mhmg4)$?!J%fv+0ila`eM(LY!CA?d#kadJsjoP@C ztIu>mq80Co9i~UK>^h6{Q;!=w8i}L8;}q)znf{laHryi%Sn=Ww40R|+rd%bzst-v! zZJM3Eqj9@-(Y)RN%TJb(oanz}aALAT`om3%rtt6{!LZW^f9FBl1jFve6opxrpPZOI z3e1VAIYR436Xj{gkf#kj;*8zhji&YmspLCBF2Qvw^pBz;PgELHp{3LNY znI)rSw4|2I(h#|2N$?GoPi-cG=C-f(ds<^P8O5K6hZ0P=QvjyDYe01bv4Q{^kaZo? zG&Siom&bK}&cDgHQ3@F+j)e;3#Hx!XNlaGi@;oZ| zX^9s)CJo&g$j@RRDNpgOw|i63u855# z*m?A^WD$)?PD{3N6f>uP%$U;c;*n$f=quf&sg@Ao|ImhlQw+d%IR@+7g@GWqmGw`HQdZpyo@Dozd|-r(?G_M`+oc zMa}A*r9YBJeISYER2AZsy{zv;6Yuq^fBAf1&)0BW#8_gt&3m1%8dPF^XD-pWKoSe_ zNbc;h@|{UC%2#RRxfDRlGl9_lPe(D6WRx}%M#}qH+pfRC^*Gml=i_ueFt&_lf8T#Q z$q!B51Ure?$#dn6@8v~TCdnvUC6lFc?T3MPE+4O{^q;3unn~K`&i-F!#UZLT8cHcj z{&(NEYjv?Sf?Gu7k_>`Rgpx)&5J|+Q4D8VziZd}rb}B-R%xd%|tXj=G^^qYKd~wXO z&(x=3mU(CRWgn%JVHSA$6KRPwu3Rq7E5ok@jweT^_rV-<7b=UPmEi>;ig8&5)QZ?I z>KL7ZnlFnTmWCHZ-;JnsYZA1-apsIdMvA{+BT_Unv^)_hdg(AJO#_9bU_aDv;>_zQ zZJr$5b|CB*l&()%pLs8YBhvx|SlT(Wl|m)a;5`+z{u1*?L9|d ziQJfNF2_FBD`OP{M484G%kLwE=)e7c-BbhGUr9`Vwg4g-;=T0Uls<AI z4D1j3k1D@zq{jnWbe@lNb4DP%U&b>GY;+iLH0bT;;Sd0gcVSrr>F~f++Auh^>5$Jl zC%T|lFHl*TC7hP^AKhJ!((y9@9qaELHzljevlNV(ZF$akFh+LMlNhO~Ioh`@#!R@5 zSJ-N=fz}7tnm`my_FDDdw$ZBF5^)SDPVYzd?*Pwa=~uHt_N!T$B>B~>m_EHJnKlt; z%T>GK*zi}gnLN=#WwJo^-_C_DmXGUDs~tJx-3jzmc&@A~#$awq?7W>14};YCeckrn(uazET{|Tf`lUYUr$1!2Y4A9mHl5 zYi6csLxxeWB0uuo9LIO39k%ie;l2A}ksa5~HJN@ZU9lvMJo}2M$@NX_grEj?LN%!L51mcs16WF+Wth_%wK-_tEpmFRDFj&Qh z?(zIPQ9zVBRc)cz=+D3(CsI(VJb5n=0My=Wvw|XbMj$G$UpC3ehbTI#pJt`5nL*Vt zc*GwxaKx`UY?KEO?FmHlkC>~00|}PQT<1Id@iPCVLu2_OEV{J<`V`oB7UOsxeF%Ik zt5M3@BCzp{p@-i1Z{Q+RL7MmmaIyTdi@^)!8HiZ^FQgtL&l=EpURAn0Dl&l^9>oH_ z`o|7I*N0#703IXwQmC6tP~{sQeDQ}c=%UV}UTgw*9#q&mX78t-6K<>=-lJs-w!Til z-{xclxV~-MY|o_Asd^gNdHoDQ(E%F{hCfJX@b(wMQT!sffS_M2))mLKwnRb?wN3d71EP$S}dQuddXegWx{jpA);(7d`UWeQRNy!U>QQ55_-&-Nar=n1!=) z7e;%#<@;AO|69ToS7hr?<*|hAP;&;dxDVcdV~7q%7KajdpNjbCe?znGg9!1xjUl1| zLINOI{uvvWtm+j7N&(Ljz1gu)uP~)TgFm>bkB2aC_~HQE^hHnax1tz``;-g~%&o}- z-`qXWhyif_9!~>t8XU!j?os%gouca5IkROqcTzyTC$S6M4Pk45l7&lGSp6*YKT5rl zk*XAS(?O%^NQqp9o?qp#04GhbTM#LIa2E~7`5R7k&6Q0eHw1h`dg4`oSDG!uI=s<| zBf5WSg(Eo{*e2?=*w#qm{}7|iUt%P2E%!`whN6@Y?m$S29)`Gt*PVbS#oKBtVxfU-lU4hTpf~CkiS2AJ!A`J2S)il}i|M z82wTe;`;wkm5AT}iSvuz$lB|@C*j?9n&Jr#g&6U58qS&5Hk`2lz2%~5-fk-4;myB4 zW5E2cv>QOR_>yosZEiQkUqK?0%NACiWDX;V6me}x5i{}C48{*DpDxPNh0$8*N-CH4EA z!7%QBE-AT5zaWZ+80b3{@8dX5+zVVf4d%iuWD5=$9j9!LU@_L*Z}yw0+Ul_0%hUaH z#iZ|K{7Rb7_IKsCP- z(|e3J-q%AfroV52;pzh>@cCSCj_cI>(Bvf=YxAXnn3P?Vf?c?|7;PVM6XWMm!KkB5 zpOSLlG*Nm(q)yH$Vcep*ALjT)wDC(SN`FV3`uCCVPN6J4lB*Nz(d-ECGJenBTjP9w z*Tuznc)oYF=MZ~H(6|`_-z66<+p#@Vfj0MGE`^zy$qjAO3mdc zNZydwnA*u^=Ov8#v&^`J*h+`vuys&0>r}9vOEaiHH&WnS+bK6m=-OyTdnnIj8SR}8 zWvA5Jyh&9*fEWy`+y1QG(Hg7ED!h#yN;1cv0-C_AG3ycyif;aa$dpWd_acGl(*WHF4s{KZ352cVxVlonEsVlGIu!DWU(!k>N%? zsnt8P8j>m1lWo)Y$1}Zso-;iS<)1BmIYAghVe<18*VCrB;8NBXg+EUJ2-Ci9bD0AU zGxvF`y*60a;hfHd@%jDQMQEQj%f#BkaS>lLSHIYuGAr&>CR-9&R9Pu25^I0E=Q#K7 zP|ucQ_nz%W?!AhF81UcjnMxQ~>39r*t6N5=yYjjI`Nw*>J?kV=T}0oOCrKc*2^09U z;aZ>wp7~)Yz9YVC==G(s@qC-cUuUNKemS+>1v|$B^eSXYMr#_I%15OXdn4siMU(Fk z(M+r<(hSz^bm)BA&eVPhZN$zZdYNDk0(!te72|5srI#$+&bYpG>-f+s{@m*2TxPdy zw`d#Ve!=k`X+D9twF&QF5F+85W}Z$R1wwgZP9z^}2H4ejU@<&)Z8U(-mdg6diio{{ z{|#rM3JI)b51@@asNkSJsF>jEj0DJmH?aS6T`=pBq}%Kp%m3Lvh~=2lZT2G;>UfK) zUOP{|jATJnZ`LbU2^yjw8c(&Ate|LKWElKw@H_~d3dwa_V!f`@czkd3b3?h6-Q3K_ zb$`xVuTyFNGaf;$xjoUvomNF0;MP?L-WJsAT-yur2LYN7bq0BPLL^T?3R*IOD=WoF z3w7lfr2^{q^qOEC;u`GLX2H`aTq#WM1eu6K}$~ydTeX2lDRc{8z;X_fu6o( zEnJeCvM;WkKZ!5ynI`%YWN>CDO%UzvcEcsQ`?6q#>IKN^aq@}SVR`vi^cn@LEhVOm z{Hv)67g#UOTVn@3O)G`bitL7W#Vzv}KR8u8YOq`tU@)~oz4!~Lz1-Zq3434-psG~V zrZR*@A*%gkzSlfz5;oB7jyPx5oqqJH@HlNBx(@WbZt@$w$Wk!}kWbc{N)gWDGsbpE zfQslMURz{)z}s}`B*mPyb%R`0-^e_`EoURoE%UlET&S9VzTsVfSbpnd9hogi0J(N$ zaC2r6D2VWc?CcKU)P5RX*X?t8)ZRn|J)|x!q3_75-h0_W`DhDVwZ8c?L6Ooa9 zlWNiy67CO<)9yys%si?H-8ul0ms^nL#Kl@`U70~YQOmBnTCnDa^{;%jDB4&d5MBW^ zW*6&m9W=L@JK~*akubpl4#Api#mWwfnu)Trr;#vZ6U-MM&g$4~Da?+M7JBl8)mG6` z48_buD#KPIgGypCBhF2lc_=6D647G#8Hi=n^fx&6NqgozgdDev;RQ}kvpL&~q%{?Y$C z#NoBz^f9`bEl~xyoGp15^yPHr=`pxn-}9q6Zg>9;=*UJVbrwwJ?P9;ydzzZyK=BzH zqhb-Ly1|}kk8*^CSP8(QpATH~@a;FE)vb8cLgk`T##dOpd~>UZ$QIU87-pKqE70(Y zd`)v;5L*;BhIMuzZc#0By8vk`h*SD0OHR^gzKzThO0sfllW^8H%iJ2F@qb}qHXu#F0Hp$SKEMw1B;|nO&UO~jkf$ky%DIlh& z0<8*)2A_~ZT9CV6>Zb)~7^4CaHrL&9hM`DYc&vp2W7bR#l0i4XD2pR+91g4V&y>Ps z6CG5*O{5vwY{@oYXD7cKFv;d__RS2QG=_5rf>gh%Slr^7!)ffs*z0xNiu!y>n@RC} zS*v3{|-j)Ebp5CE+mU9HU5>aiZxDAFHi>ytcBd#q6$?_|w(CtbcIwThi%VC(F@ zLXDYolW>C?=WfMPGpTXMX-Aa;ST+{4*Cp8p!FS%$zF7QB4alwlTXF_iLyUluRnh9y}Bb?#!f}h`cJ*zuF-! za8{SnCHx)LjK3wrtN$u0(`=5Uny4=@jcJ+ z3m4>Epy`Ib&i2uQ4dh0+c@JI5T@Ts^WiUbwr3xsx~&Ru+`3zhb4IqerrpW`Xg6aKKL-;2~xpKi~@P5;rzTA$O_$5Ig`~UI~K*ko`Z(dEH{%)s5gitf^y5} zE(l!Hd|Ai1r4R4eGArQmtzF1sFgvs&FxA46k10o8)c91~NC3qB%Nua<-uKV6yD)slOXYMYEz!ULo;;i<0$g=OLS4TstvI6lM z>)|gc))Gy8P=%!34WeZMolu9Alp)XLe(GkV%9B8~#R-sdGhZuq3*3r|m2o|DzB}_` z1lNI2IBvX}0CneCubjSxv;X6>7 zvGHBc{^f^A#Kf@Ui6bbF5t~H!jC<%FJrZkj;~pU5V#46*S#**b z`S|K+u9I2g2{ZKR9oN+4Y84E5Vs=_vBbF+UFao2Z>}(ctBp}bEY{s--7+X4L@%oMB zJ*zUGQH_N%q_g4rqnv=B0ySPjLx-@VR-i}7p%$6R*ApER|7;TCKCPrpo&(oh+HuA- z+%6lDoG+)SHe3qGh`hmpTabhbI*g2T#1?NPJpq%}k)OgQ&TyxkHf%FpW!z&~D7C;k za=Ljc<(VCsC2wmh=o$myw;9G=Ahc>gH?Y;Mdeo@BFt}WWShXb_{Wqk7)x&|h&v6v^ z^ofeyhO7RDwL%#O=_%xXC7f$&G@LO?@7uN%PN?!-E@+NDbToCv{!?-J4{m2ITEiz? z%He!}wFh-ep3nlVsUacPipeF+YnfobN9*?1E|Vvogw@|ew3hg3xWRpjpe|7Bn?p;t zz&8vb^575|TIb*k$rKGd{h+CxvtmP{5OX=@jY&rzaI*-yrwiV+4LM z0s4{S1AtOP5fEp)CiNu8!6U%A%Yrz^EXx%uH_ukgKZ(~`eB{hP`t?E|x{un2xsRGP z37tA#2*eybaDM~buogq7Ks9+7Gsn7o{K|6p!Qp^%nZ6XKP_8058h8L;To z2iP5W^WPIJ@OZN9OOOVhR^$lK_~eoR&Q!?l%WpvU4uGkQsUz-ifY|#rgxa=uE$Y)U z$R$t|1j-vy!qM8+E^zt4C4`y?p5MT!_q%Jusjp~TrN-=e30VNe5XZ%hkHiS;{MtUf@Jh~_|NhDn-j4HGphpvB)D2y&I7!WlH~acCr4PVx8P_1wT@^dUS^ z!A9|{0T;*yF;jD>GblEj25CglMdKIw(i z4yl1hc*=cY$u}5nL%%1*=Gbo0+y?Nvd~wZ(2CJGAFmAOOc1L#ntg%9)8(Zt`?9q0*eRH#0?g=@p_NP*#&a56O>|D&U7k81iew*B8D{ zl?57Oi`>TITHCw6(n{g~t&{o=tA<&y<>8@k2b1>zlX=$6?nNhY=$qLUcwlxo(DxXP zGLBd{X&ixMA0cR@2$A;M80Psq%PE4`nVHpSSXIvL&CPtvOnUOP;XlZX4xNfK8&&1s zH{rr-!fQ^$!Mu8$Hl7(~ncVVnSCtcpg6ot(kV0J!qgIe|ZqEG>P^vBiDE8<0+H z>cPCnkq&zny!+Rxi?PpgfP)&KRg%ITB`)ZumNe4yl;nIw6RNnW z{pj98*Qh@?&{9XCtkBB9l#%{b#0=L#sX1_g9WHpDd4qwx7J7D7-c=>18@W?2<)cfu zxZmi7Xc*{p>uMaIJcI=Z(qD){u7oGU5pNA}#2%h9vao~3R8gN}+tRyFQm;KQSEeHO zo|Eg3OefSwg`KScrAm(N%PLk{?6izA)?z>o*|HyvIG_62T%ZC}kXulk{J8A2l<@bY zv1ru()ojMCgLoR0Fe-*V2z95I0do1F<-mYhXhJ~1aA*2s?{&KJPt@ZMR|Mm?IJ6tt zgfz|<^nRg0aOC|*7 z_vNNEY#sLOC??>gLXDN$de9q`hiTtf`so<^BFzcGaUyXMurDUcmZ@&kd(I;&-Ji#S z^mtw-pdg^|T&``7y4;!8)EixOof?9cPRK75tqj8PnFZv`9458;+{Zj6RlFgPKnqD^ zAjKsOa)HOu5PFb;+bajxYBUDu5P1}uvfw&@{&K6cWpHPkH`mx#89&m?#^7?ZMd5-mLaagn{UX(@xEciUN9gKz#Yy!|wv;Vx;S zW9aeCpPC=VG98g?#pY{$itt9aO{1iTWz&+-qG?9g+{M~tqmCJYT?YjtFL%}sVh}K^ zadHrkHoUxTkmDi#IgI0Hb&R7U(~S`@Zt)5=0E09KOBqz3c?`$t6TcCJm$EF7QJX?r zPqBD7#>=92Z(x--r_pq@$^V(V(_{yn^%}n4dbLoS{IeRl2jlt$0fX8#Dw`>H-ffE} zxp3Fj7^g?@n1hs@A9kt;1Duwuq;~q{(TxmhtDLDPQP_dctR|vk7aJ2OoB)Ljjokxg zRjrLBA4}p4e7G@HQ0In?7sy6vf&;g<7Ozzp!BU(H2XWO643xY@HoMWu;Nw)Y-PT~A z|1O2R<`JYeC?_(Tc}&4y%J=csJ2X+1mpz0T4Ob$#zCx?}l~?$ETP>{U7e2 z<)!#EDR{rx&1DI=8W4B!Fflu0Uz;!o2K=E24$V2Mlk3U-B?OE3$#*x7#Y*SSeKgHP z8Iz$d)**i5&W$bh&mEH-NYEXC)fCc_u}3Fezy|XwMN7k*j5Vp1Izf^(XWJ0ezDus9 z89=-p#y*iUEaNwDNJtJ)7cEU{(qkhbp$Epn7B{BFl8ZXx43NoN#8!QTUr+>VRj!WG z8zkHz&}xv=oW0FByFp^Si#zqdoVdo^c{|-ROSE9NGMvf944~a~wm4tI9{Zy;^*m^p zn~+#0Dfaec%&|A8S*OBo#_euUD{{!m1RPgj($l4ua&stqNv5|sW$v-~eo)yu!Qp*~ zyXMFjezaC`@p60*fQQPC+DeH((A0_KBZ)lB1xt(XPo zrc9cW+&71Qjroo0JM`A*H}tk7Z7og2UanFNGt%r+nJ*JxMN6QW ze`5H8TFNQ2574wj{p2fYD$rt4VS7`3iLy*oo0P>SrzuI37nCypCiNt0;fw)dE%q}r zC?mbWZh@mlQH@C5pbJo_M;8+(`c0;}QK1iaeWCUJIpUHSq7@NAI_j1gK*5y~GfN7z zGIMPa!@_zpy3>Y`)bw<{p59C;>CN5A$g4>8?@o=68s3?d4TvEJ>|{As=blae2ECaU zgrpjJ7ktDi>lgIPkGzzOoXq0SYR$JaW+BuL3x$M70i&9IMPcHaSjG@Ep8_b9LgD*- zsv>W+A=)SqtV*gB@$BhlVN9nQCiTBU^)gY*RrZP|l2mz%Uj++C1Vt#Z48XUDHp0?? zsZsKZT7udLn!Rqw>Wqxo>S>L2~&xFf;=8qaCr|P6YakfxW&2BUW$0j|*qGaAQopWA;Gl2dHQqA3$IvAH@Uy<^{v(HqMkl=5(j& z<5Na~;eu$Ki1w}2W8NTeC=e9Up^T6YfZGTnZAx49nF$Sx-kwQZaTn93uc4*^nMD5@jRAufXWI`+(6I*&nQ`YSM>_JM8dRjC? zu95&pwR$6|ciaCwQQ2$$H=i8Sgq586B}_#SiMhAvQ~UW#r>T>cv63@Wy0vABh>wzy zJyo)7k~E8!6eY7@!}Vm`cN`&Avq6PhwK>ODjey*kgJ|Mkm{BfO@z4+h7#_1Qg4mc$ zIP`L)r^JjfRcQDK%U~?ogQPPF1S_IOTcD^{DSPjtm4w+#e6Q90Gp%hT@#!r5Pm|^+ zQ%7XRnTJGY%2K8%wwY->M}2KDmjLdmV*IPYcF8!-+S8l zK`6RmYsfE9xX;tvGZA4TVV`>rr#$SsxFVJqmIEQ?bzyRd1_WGIu#I=)z9eNS7SrV= z+yF!3HQ+3A97{-43gns?ySbSg9G_23&j(AzFkD>#`I<0_>&Cl=7#WjEohJ9(2t7^$ z{_-FF#?03Cmg(v$)So)d&p7bhaQ6>`Rlrs-kd^=L)hTG-0rTiR`#h^C1rh|@xg`ywDSsLXQTg6bD#&cSQ}F@Jt3H$v6!K z&};{q@8Y%^ntMIxhVZ>bEur>miIa#?9di+7~mQW;f~F)YT%Ph;xogA z&@Dj;X`2p5Alw=_p;y~?0F6o-kT=JbSbol>kS$~UfsA|3UFG;0x5cxrjqQkJ|v0&IQVqQ$lro+b)(DaZ!fa*4lMS@B*}jw+I5RgQ8N>J6!aLq{RRsi~*meLJP6AclCu)o$_GZmT(@?>EN;G^*tJhaR92W3l@Z(PX-iV zKze*4I6Xdz=A*2jEO|6tJkIS8(8I9)vYAsfIQquJb2nlL)o-4tf#XdA*%WOWp$7y3 zL-1$uB%)^@ zV=m{}CiEyQK%Z7fO*zbcw3Rh)079q-C!W7c3xq@uH@WL~K-l&mJ8A&dmm+@oJV<>o zxPt(0xnS*i&kui&rbr8tBMasnCZd7-%h?-@)S+}7kzFR3u|lHssU81TY4V>>WU2h_ zDg%Dl4Hzl_mAkpqCI8WaVgrSL9vR&Og9}Lbqy`kJVPS1B0fWvuffl56C}N7Lh6mi* zZ|%t#zA208OycYugu}-8h$$?Ex(6PQ1qA@F0cg1Ac$bUgeBh8E^0=X20jJYOGD%=` zQB9&;HOQ#VnLYq=Ml(R~AavCL%GWitz+D?OUll%P4T0V884_^Z><+viDGCMfs7?>| z4PLL+JHeeA*A2gH!o zCrqc_)RD*B*pm@0-)RK4z8T<3!O;+Y6a$Ps46*fV5vTX)&{gegn_K_ltjBQ}x*=KI@s#HD1=!#E zEO9(Fpo#P~yYw*&56VWe5W{|0hN9CX@Sx07?3&g93Z-)GhP%^-@tucKP(L#}haQar zyblM(hK))O2I{bczrh)UHaG^$py0fnkv=#m*%tB{9;s9kt*9r-`M-R7uKgzY8!0!JYli`L1L&1mfC zngjy1W;m$c3^=J1%FpI5E%Iko39|@es@A3Rc=Tm*sMv#gaE<#-oH~&&AbbL#W8{_u zn|T50t+Ug2hdWy5^G08xEFUG9DLQmwbkG>8tw*XNRp?Taf_;JVI~k%viR`DV%F5iO zuTkHm3B&H=X6^TlSx*~ca|lLOhF>*_t{l6VOiqChAx89dSCHIKha!dN`7^21ts@&Q zUl!I4Xoqv0o(bh1no=2|9SkL|2m&#q!=N`w zKX}ST!EK{ZuT4;i$zQq4VN-z5Crz>9I?a;A0;EG$v*jv%1jy^I3{|UOZD{G9{IE0*&spy2z1Lle((*JISlzqO@+;YEpXu zbq&Ka@MmJwcN9gQ9r!WCQD^`XXZzM_VM% z3k{g!`y<@*-#RtyfeDJFy;9#?pt&3+)mXu>sCa}t+OwpK|(vbN6m zM%7;U0)dsUJ=FZnq8L6dza&j{1p4m^o`7t$%t-IlR1~7F^+%0rp&%I>ueo{#L@~;Ak zgx>tDeJ7X&O9;J58lMi8F6knE8P^XVeRB(dmYEr9VdR-(K4I2|nsg2KP#l~wSkmxS ziw`duCfOE(yyY!8gllkw*~s+|6bt6#0PI6Uybh&+!dl!u*pnyIp$tn1pGj@7+q#`J8l#8MhX9654IH3c>x=x$Q9vN^8ilpHM+BiJF!Sb9PTAB+zA|s`A3gr{!kq?Aq z9|q`O@s;KLS!YwOj^>ySX{X%?T+F#-a^AdO@$+vK1Nw_%$pF}e2rpSML?SqBV-EBM zAi6DgSKS0L0j4@Kr=Aiaxn>@T(YhkLgh=6T5hrY*t@B~nZqyeC2UV!To0T?D<8n`e z@rQsquekwG(`p~Mro_&V36Sfv;*G)M-gy5&e@krXs6qGlDYKo1NAJL85deW2XFo&2 zwBS_6hIDgIaYvuOp$lz;!i+~lKH*VW19ACu?P<&4~!)NcAF5og0nHGc19rNCOY)|&I@P1!J$Pc_^Hk;Q%mr`Igq30 z+HbDl&XXgrYbrNoXfpf)OpZ z642n%FdT>=ZPBrT!Zibc*g?d?w`on{)P03IA7U_cUgS=QZYBWzg?aWGirNham4pF^ z?K9u)ra90~u>Lwx=+FSSg8}47amr>Fv|(KQE-@;ok5+qbWOeF&{vD<34(vAIG()13 zp{xo-1hN^rzZ;*SlW1m@gy*3&^>S#=x_x!Pu(xk#;sEg;%q)N&^U0k4Zk!Uu?nL*76u0&2u2Ok zpM%Uut|3__OaH^{s&j-Dh;17HPa7_Wqm;(3QKe}_s_t^^p<9+0jwAjwBttVE;52jC zH}f!I8bF=B4fq@sF-l3f8U$QNDexy-W$qSidy=>w+9c;$0CtfC)d$u>nC=xQojc}L z=LK8gcy?i`OX(3Ne!O)RBj4C3PUWcYqsjr&j%Ju@ZWf$<8OU0CfZaxTJ`DNbl!q1L zA(`gk`kK|Imk0xkv6F+wu?t9_IRzI)Xj3H6{&*cO5hqxfIvFjT0>H;*$D*u<$`n<- z2MVjOB-FGKhYp=q!2S-_Tv}A%Rzk-xp0M)BFg1w%3ZVJu;&!GK2S#xJ8p>m_Ersqu zqxSnQ4s_&P$<3JVy;k5J8Map&=FI;f^N&@iqtj%F7E@u0iof&(DYBEK?I?uo-e}g! zOynQ$bR@X)Dj9Fg{1kuHI^qES0q#@X)C331^y%cCx`N4?=~C0(i~7HvWo0I0*_zrj zET}K{CyA-&nn|KHm8u#FThm{nmXRd(^l9#`sap)6x>xZudSX|m*$yHJ>5MqZPGjzB zWXY*24nmn3r|yh6`)Y=Imh{}D`AH(pmQu|cR)7)ZF(UmWG5R695B}_o{T6IOmA_k> zN#5qk{Mx&)LW6k-x~xNcIY&}HAtF) zW&22xp31UiZQrP9H9Ef;U?xe$k5ua=+3o%dGIaM#H+LhljU-8A| z4cmK~b~8{OaI`&kOta6ZI;5kUlH?dsdGCReFQeHM({9*NUW5sx;ju!3|3P;$#re;! zVi<0-REqR&hQuPR)U;r8EZ%`qO07vUby{KSho9>1u06ImYAI|+s1-~6pgvaLDun`z zBdrn>Y1?I?GGq40Yq7Fm9#9}sdmEw>iUbv{zklv%+|!%6z1{fS?lITk!)Rw`_HuJO z_uqBe8sD%z3{mp!Gdj87_jTu&9>L|g>jUU(uc73*>K%YK%UweyndIR&7e^lsC~{)d zn_tOv4;$c_#B$w_A-3!dLhDT6|9HGBc1<)qlMe)~1jpQod##L1UYzQ3DKp)?={~_; ze$$Ef`lKKCRr|EBDgS#89vuJjFSWMx=lr1Eh)e&;+7r-Br3W7UJ1v=Huk*EvK+f5% zW3N`pF^{(F0$~Do3O@_VS;Fnhf-*FUl=1LV>pUbLEWb!FO2LqM)&7YUzM@z7UU0T` zkutHtR-Q@frmRLjfv(RVqUOzsh8Ne~EUFX}M9;EWW43-jZ7AXFm-nx!X%9bfvuNgR z^~I?VJL=-k)0dkfoX}m+6Dxc{{_&<0r@Sog^>dSZ!|nL>_Gl@Wb(?KArN10!j8gwU z$ekA-AGy>l){h+~7I(xl;eM%ejqrOu>ozVfvQYB-=W_mND2?fo!JNSeB^-Z|UwAykhEmMhwm!U;D4>WH9-ijjl%wY+KoL8;2_z z>0bS6H`}=HI@x~+BZ~`(m_CRPLRW34^UeBeXP0VXMJx5ER$S{6t&rNVSU z?D>A)<1g$=i(Uh(LTcKxqC!wkz--YmGiASUy|^jz3eKy3(<`29s*=vEiw0w>Fo_D< zASEPi)-)IH*eU=f4BL_sEEu0{hS=?Qyi7(3Zjp4!gfRtFSgP_LzCJS9&`RN!^w4)A z-o$u8ke93c3I1uYvMdbNXc~GnW4~~rMJ5*5<{`)g|yQ-RW+Q9R! zXOXJ2TesGnpNxKa-|PTrwlqd{J6_6{6P)7g|G+IEpSKbKBq^!{0*rCWr{Yd_W$z1j zVlg%WOw=6kG!hb4~ zgKp9nhkrU8Z{Wh3Q3&t!5YME1YWkZj)4ZE4H~kO`iEfA4Qgc}F!#OFWppm*(fzsx71Lu5Efci6=yEEA70N$Q6irLst;lU5?}Bqn9b`QGMR}l z$B*YEe#va8qPvf)4OUr=yHndfDU{zEx|T_$Rn^~~^E8&O5xx5K=;-?N=F8|~-^KVJ z8q3cg_(`eG)w!X3J(|b$1JW;#e+~~d$4J8mtWB5b^=8qTOyXV3fqy+(SuHNyr;xwn z*+%zrDxE)O-PtdtU3CD;hXX-9GODV^04o2%HW&DNI%PK<&_0J}N@;_>{W-nDeN$xN zQC`PhxcqW*%|q#b#HNMSE1nQo z6XZ+-fO$s9GKCe(e_kMdFC@PcZiL)4;N*tK9h$DhESan3b;RciI#+PV;-G(5K?^)b zt`J9?)Lf`-on^3|jiGUBOd$GOGvO@^JVin~Vd;Juc_A8g!}t=zR1U{yoc;xV`*kF% zIP}6s*_f-HR>r|4;8jLYR3g(SJddTmO!wFzg+#oCO-qaL)XOxUu;!rDXh<>+y(*oJ z3O=vknWTWE7%iED7{l|P=2=EZ9^Y2h2Wo`$<>2^I6mKXe$*97tiq4L$Dj7ZJ!U_Ck zH^WMwJnNq%0?GKpsbS7`u0x;t8lADl~X19(X(co z#DOh7Wnm%eTNz3{vUY4nqHJ<4L!n%j?hsphqx&=j;S_DsaY29or=m*MFB@LLL^*VJ z2eAAW)xl)d6Z^!kmB^T+Ig@&YvQ|`cP`GW*T}27Y*&L8k?@eBZtbdovRZ6RckWi02 zcW{DgBA6uMsh|Rk+{{)DjkGG_qJ)QAQRxIMyDBc8CwLRdZg7PqC#uNKuvMfj>aC{F zTNVbFBDw*3k@nAq_b7hzJhJf^HiI+dwg4A5LBQ?(28dU`&&DS_&9gOafT?x{18!0M zF#*M+Oy$@okAdPIcPoh!j~xVpvQdwgbCUuJYweCdPj|1m7S@TMHm4+LVXwANe->6+ zNFc`HUc@=eZWZ3A$GLvR!ZNE+OcZygXU({PTcKXbZY>>%94xBi2$Rf|Dn!0|XpfNm z)@lslJ$ESf5T?LZOCtPuM`U$^SI-k}b}u-0Sh zfd)3ZW9eVDzA8P737<-7fuvtt#@%ZdS)OO6m+o8iE8yHgZ@;bBviTT&1AWmD1blQ5 zFTw{0jp_F4Qr^V$aiSE~F~ZNKSa}`=Ud+uBM%kjJqy%6fQ$D+MBPN1f(MyX*I;-vh zU5TbmhrzN_5^1~(Dk+f*XB=|MW$gfV9@SIW;?j*K*BW|wk=%4n-65l;6pYQrdVAnf zsv(b%zEnt~B&xToAB=5YR*z5HJJL7yK(At?)^zVsO;>>0>dwx`+uUVp^<<@coqBG6 zt@50Dj1u^z11y!Wqr1l(d!|1P8{aL7MdC^d3N7WOoAO1QA!ySy+xb_OT9@8ST^w2h z6K*u}_yNYxXY)u!1MQ5WdM}LDxFlsFuuCRYXLNvPVmkObAxqO7C)M`2{pu7}{K!a& z1+})(k%2fg_+)C_5W;ho7pr8)UeQ|@fGYh77D3$x6DVJA_8Fk6xl4g~>ZJ$FFvF(v zg=v)kUcEtuMyrHtH#$?X|9+Wgx08&{j=_szoH(=1?^bI*NmW!F8)8xv%~p6Qg}^~| zaI^zT3#$tfO@?Tuq^;qew~`ZvGwIR9m2$k1ggU!iZ&uT*O%^(+5hWU(=*Ue+7sFid zp>orJu7At~nXY+I5q1_I<@U~Qt> z+&t{h44`^+vR2f{H{!PCDQQi0NYWdHN=+k$$?>t!*0BLOwEPLsQZ0aE?oQYAkqG&- zHWk03TX0o;w3`jWsn(P@tMekZehBCU&(ySSaoVy$8Hu$yH)EkB89TK!7NEog#6!KF zcF52b0M-c6YnK+$l&wO#jK;Q@CtA2oJIz6hL@GRa;v&_xp)S>?MEbu^qoVy4PN!7i zWQ&0{XqM60T|H4+&_9JDt+~Tq4!o-x5kPu>jBp83S!)pZOfH2Eism}tcqXhpXoZg} zvZKu|R&njs-Ofqn4^^LFA!lr2_X>U_1iW0U1Bt6@wgR{jT~#)vyeV~^yHg$w*cm=$ zh>|_YEjm#_g&JyPT6n!Gp}hMadQLiMc#cJQHPT0{%s?={Wv??1zYgk=ET6H5u9(Rw z>5%&$gAC@;s&i%sOKa#7ZK?aIe$_ffxq#7mA6mfIW$;sWH00G(LXn8(ms?2R^B z!02dHx>vg`vY*7Y#Xvf%^z}qJkme?(cJyk)(_CzJ4{*sw@3m3y1H$1R$Z=l8S>!!e z&)UTBtvwTY$V^2J%KSa#Mrn~=^Yyo9>V@t~@1IwCp;NJaxxU5Rs&{2)Dy1-_cXyLa z?$(=RQRd%^r*j~4#$=*1P7BW-GJGQ>^C2cyyc}WUY*jFClJ#<)e*J^}h~(#9k&+ek z478~&pA+)B&A3tjYReSLk{frKB-GkXo66dnmrVQ4h|$6*T{OQ|o2vhRliSM(KxkgQ1M+e*QttqphFe7piotQ5UB)Ad%NW_n z8BfuRQ%S|I=mOST2}$n@$`(4C&!+3rMEA<~w4dj4@y-mtxx|CR@KM0K#_)Mey=(C% zuRg{eH*ChHj={*hbJ<4JtQ3@d3lq!tqoCNeJUfDy14Y^!x>-u$QiDgiIvkqp!ss!^ zj4kdUm#Of9NW0uRu9&3_uoX_KA5{29l+v;amMHZL^^j8<0p7(~$$d&u<~{@DOkapM3h*g}ET(h{0X=&=AgjK*xM}g5>g6qhsnR-d4{E)#^F#XzC8Nevvmf z^E;yLi;iW3&fiG-h(@W+$rwNN03kJ)2wLLY=AU6A4y2cG(fy>#RRXZ^F#cUtox>pwJNHb!!AR4ttz1o7RmD}Tq1`-*_7EL zOK@M3$3Tjf{60B8U{L(|bol7>(eTk~czpWg==00rorg.eclipse.jdt.launching.JRE_CONTAINER - org.scala-lang:scala-library - org.scala-lang:scala-compiler + org.scala-lang:scala-library + **/*.scala diff --git a/querydsl-scala/src/main/scala/com/mysema/query/scala/BeanSerializer.scala b/querydsl-scala/src/main/scala/com/mysema/query/scala/BeanSerializer.scala index feaad20ba..5f198a3e5 100644 --- a/querydsl-scala/src/main/scala/com/mysema/query/scala/BeanSerializer.scala +++ b/querydsl-scala/src/main/scala/com/mysema/query/scala/BeanSerializer.scala @@ -14,6 +14,10 @@ import scala.reflect.BeanProperty import scala.collection.JavaConversions._ import scala.collection.mutable.Set +/** + * @author tiwe + * + */ class ScalaBeanSerializer @Inject() (typeMappings: TypeMappings) extends BeanSerializer(typeMappings) { var javadocSuffix = " is a Querydsl bean type" @@ -40,6 +44,10 @@ class ScalaBeanSerializer @Inject() (typeMappings: TypeMappings) extends BeanSer } +/** + * @author tiwe + * + */ class CaseClassSerializer @Inject() (typeMappings: TypeMappings) extends BeanSerializer(typeMappings) { def javaBeanSupport = false @@ -51,8 +59,11 @@ class CaseClassSerializer @Inject() (typeMappings: TypeMappings) extends BeanSer } } - +/** + * @author tiwe + * + */ abstract class BeanSerializer(typeMappings: TypeMappings) extends Serializer { var createCompanionObject = true diff --git a/querydsl-scala/src/main/scala/com/mysema/query/scala/EntitySerializer.scala b/querydsl-scala/src/main/scala/com/mysema/query/scala/EntitySerializer.scala index f8da6c912..28a85af69 100644 --- a/querydsl-scala/src/main/scala/com/mysema/query/scala/EntitySerializer.scala +++ b/querydsl-scala/src/main/scala/com/mysema/query/scala/EntitySerializer.scala @@ -68,8 +68,10 @@ class ScalaEntitySerializer @Inject()(val typeMappings: TypeMappings) extends Se } def writeAdditionalConstructors(modelName: String, writer: ScalaWriter) = { - writer.line("def this(variable: String) = this(classOf[",modelName,"], forVariable(variable))\n") - writer.line("def this(parent: Path[_], variable: String) = this(classOf[",modelName,"], forProperty(parent, variable))\n") + writer.line("def this(variable: String) = this(classOf[", + modelName,"], forVariable(variable))\n") + writer.line("def this(parent: Path[_], variable: String) = this(classOf[", + modelName,"], forProperty(parent, variable))\n") } def writeAdditionalFields(model: EntityType, writer: ScalaWriter) = { diff --git a/querydsl-scala/src/main/scala/com/mysema/query/scala/Expressions.scala b/querydsl-scala/src/main/scala/com/mysema/query/scala/Expressions.scala index ba09c77d2..af7789f90 100644 --- a/querydsl-scala/src/main/scala/com/mysema/query/scala/Expressions.scala +++ b/querydsl-scala/src/main/scala/com/mysema/query/scala/Expressions.scala @@ -28,7 +28,7 @@ object Constants { } -trait SimpleExpression[T] extends Expression[T]{ +trait SimpleExpression[T] extends Expression[T] { def as(right: Path[T]): SimpleExpression[T] = simple(getType, ALIAS.asInstanceOf[Operator[T]], this, right) diff --git a/querydsl-scala/src/main/scala/com/mysema/query/scala/GroupBy.scala b/querydsl-scala/src/main/scala/com/mysema/query/scala/GroupBy.scala index ff4d8ee34..3469a5100 100644 --- a/querydsl-scala/src/main/scala/com/mysema/query/scala/GroupBy.scala +++ b/querydsl-scala/src/main/scala/com/mysema/query/scala/GroupBy.scala @@ -9,6 +9,12 @@ import TypeDefs._ object GroupBy extends GroupBy +/** + * Group by result transforming functionality + * + * @author tiwe + * + */ trait GroupBy { def groupBy[K](key: Ex[K]) = new GroupByBuilder[K](key) @@ -60,7 +66,7 @@ class GSet[T](e: Ex[T]) extends AbstractGroupExpression[T, Set[T]](classOf[Set[T } } -class GMap[K,V](tu2ex: Tu2Ex[K,V,_,_]) extends AbstractGroupExpression[(K,V), Map[K,V]](classOf[Map[K,V]], tu2ex) { +class GMap[K,V](tu2ex: Tu2Ex[K,V]) extends AbstractGroupExpression[(K,V), Map[K,V]](classOf[Map[K,V]], tu2ex) { def createGroupCollector() = { new GroupCollector[(K,V), Map[K,V]]() { diff --git a/querydsl-scala/src/main/scala/com/mysema/query/scala/Helpers.scala b/querydsl-scala/src/main/scala/com/mysema/query/scala/Helpers.scala index a63c52c35..4cc9bae1f 100644 --- a/querydsl-scala/src/main/scala/com/mysema/query/scala/Helpers.scala +++ b/querydsl-scala/src/main/scala/com/mysema/query/scala/Helpers.scala @@ -17,6 +17,11 @@ trait Helpers extends Projections with GroupBy { implicit def toRichProjectable(p: Projectable) = new RichProjectable(p) } +/** + * @author tiwe + * + * @param + */ class RichSimpleProjectable[T](private val p: SimpleProjectable[T]) { def select: List[T] = p.list.toList @@ -29,6 +34,10 @@ class RichSimpleProjectable[T](private val p: SimpleProjectable[T]) { } +/** + * @author tiwe + * + */ class RichProjectable(private val p: Projectable) { def select[T](e: Ex[T]): List[T] = p.list(e).toList diff --git a/querydsl-scala/src/main/scala/com/mysema/query/scala/Projections.scala b/querydsl-scala/src/main/scala/com/mysema/query/scala/Projections.scala index a02b57b6a..0e2a7953b 100644 --- a/querydsl-scala/src/main/scala/com/mysema/query/scala/Projections.scala +++ b/querydsl-scala/src/main/scala/com/mysema/query/scala/Projections.scala @@ -7,54 +7,53 @@ import TypeDefs._ object Projections extends Projections +/** + * @author tiwe + * + */ trait Projections { - - // TODO : simplify this - implicit def tuple2Expr[T1,T2,E1 <: Ex[T1],E2 <: Ex[T2]](t: (Ex[T1] with E1,Ex[T2] with E2)) = { - new Tuple2Expression[T1,T2,E1,E2](t._1, t._2) + implicit def tuple2Expr[T1,T2](t: (_ <: Ex[T1], _ <: Ex[T2])) = new Tu2Ex[T1,T2](t._1, t._2) + + implicit def tuple3Expr[T1,T2,T3](t: (_ <: Ex[T1], _ <: Ex[T2], _ <: Ex[T3])) = { + new Tu3Ex[T1,T2,T3](t._1, t._2, t._3) } - implicit def tuple3Expr[T1,T2,T3,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3]](t: (Ex[T1] with E1,Ex[T2] with E2,Ex[T3] with E3)) = { - new Tuple3Expression[T1,T2,T3,E1,E2,E3](t._1, t._2, t._3) - } - - implicit def tuple4Expr[T1,T2,T3,T4,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3],E4 <: Ex[T4]](t: (Ex[T1] with E1,Ex[T2] with E2,Ex[T3] with E3,Ex[T4] with E4)) = { - new Tuple4Expression[T1,T2,T3,T4,E1,E2,E3,E4](t._1, t._2, t._3, t._4) + implicit def tuple4Expr[T1,T2,T3,T4](t: (_ <: Ex[T1], _ <: Ex[T2], _ <: Ex[T3], _ <: Ex[T4])) = { + new Tu4Ex[T1,T2,T3,T4](t._1, t._2, t._3, t._4) } - implicit def tuple5Expr[T1,T2,T3,T4,T5,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3],E4 <: Ex[T4],E5 <: Ex[T5]](t: (E1 with Ex[T1],E2 with Ex[T2],E3 with Ex[T3],E4 with Ex[T4],E5 with Ex[T5])) = { - new Tuple5Expression[T1,T2,T3,T4,T5,E1,E2,E3,E4,E5](t._1, t._2, t._3, t._4, t._5) + implicit def tuple5Expr[T1,T2,T3,T4,T5](t: (_ <: Ex[T1], _ <: Ex[T2], _ <: Ex[T3], _ <: Ex[T4], _<: Ex[T5])) = { + new Tu5Ex[T1,T2,T3,T4,T5](t._1, t._2, t._3, t._4, t._5) } } -class Tuple2Expression[T1,T2,E1 <: Ex[T1], E2 <: Ex[T2]](val _1: E1, val _2: E2) -extends FactoryExpressionBase[(T1,T2)](classOf[Tuple2[T1,T2]], _1, _2) { - +class Tuple2Expression[T1,T2](args: Ex[_]*) +extends FactoryExpressionBase[(T1,T2)](classOf[Tuple2[T1,T2]], args:_*) { def newInstance(args: AnyRef*): (T1,T2) = { (args(0).asInstanceOf[T1], args(1).asInstanceOf[T2]) } } -class Tuple3Expression[T1,T2,T3,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3]](val _1: E1, val _2: E2, val _3: E3) -extends FactoryExpressionBase[Tuple3[T1,T2,T3]](classOf[Tuple3[T1,T2,T3]], _1, _2, _3) { +class Tuple3Expression[T1,T2,T3](args: Ex[_]*) +extends FactoryExpressionBase[Tuple3[T1,T2,T3]](classOf[Tuple3[T1,T2,T3]], args:_*) { def newInstance(args: AnyRef*): (T1,T2,T3) = { (args(0).asInstanceOf[T1], args(1).asInstanceOf[T2], args(2).asInstanceOf[T3]) } } -class Tuple4Expression[T1,T2,T3,T4,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3],E4 <: Ex[T4]](val _1: E1, val _2: E2, val _3: E3, val _4: E4) -extends FactoryExpressionBase[Tuple4[T1,T2,T3,T4]](classOf[Tuple4[T1,T2,T3,T4]], _1, _2, _3, _4) { +class Tuple4Expression[T1,T2,T3,T4](args: Ex[_]*) +extends FactoryExpressionBase[Tuple4[T1,T2,T3,T4]](classOf[Tuple4[T1,T2,T3,T4]], args:_*) { def newInstance(args: AnyRef*): (T1,T2,T3,T4) = { (args(0).asInstanceOf[T1], args(1).asInstanceOf[T2], args(2).asInstanceOf[T3], args(3).asInstanceOf[T4]) } } -class Tuple5Expression[T1,T2,T3,T4,T5,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3],E4 <: Ex[T4],E5 <: Ex[T5]](val _1: E1, val _2: E2, val _3: E3, val _4: E4, val _5: E5) -extends FactoryExpressionBase[Tuple5[T1,T2,T3,T4,T5]](classOf[Tuple5[T1,T2,T3,T4,T5]], _1, _2, _3, _4, _5) { +class Tuple5Expression[T1,T2,T3,T4,T5](args: Ex[_]*) +extends FactoryExpressionBase[Tuple5[T1,T2,T3,T4,T5]](classOf[Tuple5[T1,T2,T3,T4,T5]], args:_*) { def newInstance(args: AnyRef*): (T1,T2,T3,T4,T5) = { (args(0).asInstanceOf[T1], args(1).asInstanceOf[T2], args(2).asInstanceOf[T3], args(3).asInstanceOf[T4], args(4).asInstanceOf[T5]) @@ -67,4 +66,6 @@ abstract class FactoryExpressionBase[T](cl: Class[T], args: Ex[_]*) extends Expr def getArgs(): JavaList[Ex[_]] = Arrays.asList(args:_*) + def apply(i: Int): Ex[_] = args(i) + } diff --git a/querydsl-scala/src/main/scala/com/mysema/query/scala/Templates.scala b/querydsl-scala/src/main/scala/com/mysema/query/scala/Templates.scala index 7e3880f74..dde45708a 100644 --- a/querydsl-scala/src/main/scala/com/mysema/query/scala/Templates.scala +++ b/querydsl-scala/src/main/scala/com/mysema/query/scala/Templates.scala @@ -7,49 +7,65 @@ import TypeDefs._ import com.mysema.codegen.model.TypeCategory -// TODO : factory object for template creation +/** + * Factory for templates + * + * @author tiwe + * + */ +object Templates { -class SimpleTemplate[T](t: Class[_ <: T], template: Template, args: java.util.List[Ex[_]]) - extends TemplateExpressionImpl[T](t, template, args) with SimpleExpression[T] { + def simple[T](t: Class[_ <: T], tpl: Template, args: Ex[_]*): SimpleExpression[T] = new SimpleTemplate[T](t, tpl, args: _*) + + def comparable[T <: Comparable[_]](t: Class[_ <: T], tpl: Template, args: Ex[_]*): ComparableExpression[T] = new ComparableTemplate[T](t, tpl, args: _*) + + def date[T <: Comparable[_]](t: Class[_ <: T], tpl: Template, args: Ex[_]*): DateExpression[T] = new DateTemplate[T](t, tpl, args: _*) + + def dateTime[T <: Comparable[_]](t: Class[_ <: T], tpl: Template, args: Ex[_]*): DateTimeExpression[T] = new DateTimeTemplate[T](t, tpl, args: _*) + + def time[T <: Comparable[_]](t: Class[_ <: T], tpl: Template, args: Ex[_]*): TimeExpression[T] = new TimeTemplate[T](t, tpl, args: _*) + + def number[T <: Number with Comparable[T]](t: Class[_ <: T], tpl: Template, args: Ex[_]*): NumberExpression[T] = new NumberTemplate[T](t, tpl, args: _*) + + def boolean(tpl: Template, args: Ex[_]*): BooleanExpression = new BooleanTemplate(tpl, args: _*) + + def string(tpl: Template, args: Ex[_]*): StringExpression = new StringTemplate(tpl, args: _*) + + def enum[T <: Enum[T]](t: Class[T], tpl: Template, args: Ex[_]*): EnumExpression[T] = new EnumTemplate[T](t, tpl, args: _*) } -class ComparableTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template, args: java.util.List[Ex[_]]) - extends TemplateExpressionImpl[T](t, template, args) with ComparableExpression[T] { +class SimpleTemplate[T](t: Class[_ <: T], template: Template, args: Ex[_]*) + extends TemplateExpressionImpl[T](t, template, args:_*) with SimpleExpression[T] -} -class NumberTemplate[T <: Number with Comparable[T]](t: Class[_ <: T], template: Template, args: java.util.List[Ex[_]]) - extends TemplateExpressionImpl[T](t, template, args) with NumberExpression[T] { +class ComparableTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template, args: Ex[_]*) + extends TemplateExpressionImpl[T](t, template, args:_*) with ComparableExpression[T] -} -class BooleanTemplate(template: Template, args: java.util.List[Expression[_]]) - extends TemplateExpressionImpl[java.lang.Boolean](classOf[java.lang.Boolean], template, args) with BooleanExpression { +class NumberTemplate[T <: Number with Comparable[T]](t: Class[_ <: T], template: Template, args: Ex[_]*) + extends TemplateExpressionImpl[T](t, template, args:_*) with NumberExpression[T] -} -class StringTemplate(template: Template, args: java.util.List[Ex[_]]) - extends TemplateExpressionImpl[String](classOf[String], template, args) with StringExpression { +class BooleanTemplate(template: Template, args: Ex[_]*) + extends TemplateExpressionImpl[java.lang.Boolean](classOf[java.lang.Boolean], template, args:_*) with BooleanExpression -} + +class StringTemplate(template: Template, args: Ex[_]*) + extends TemplateExpressionImpl[String](classOf[String], template, args:_*) with StringExpression + + +class DateTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template, args: Ex[_]*) + extends TemplateExpressionImpl[T](t, template, args:_*) with DateExpression[T] -class DateTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template, args: java.util.List[Ex[_]]) - extends TemplateExpressionImpl[T](t, template, args) with DateExpression[T] { -} +class DateTimeTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template, args: Ex[_]*) + extends TemplateExpressionImpl[T](t, template, args:_*) with DateTimeExpression[T] -class DateTimeTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template, args: java.util.List[Ex[_]]) - extends TemplateExpressionImpl[T](t, template, args) with DateTimeExpression[T] { -} +class TimeTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template, args: Ex[_]*) + extends TemplateExpressionImpl[T](t, template, args:_*) with TimeExpression[T] -class TimeTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template) - extends TemplateExpressionImpl[T](t, template) with TimeExpression[T] { -} - -class EnumTemplate[T <: Enum[T]](t: Class[_ <: T], template: Template) - extends TemplateExpressionImpl[T](t, template) with EnumExpression[T] { - -} +class EnumTemplate[T <: Enum[T]](t: Class[_ <: T], template: Template, args: Ex[_]*) + extends TemplateExpressionImpl[T](t, template, args:_*) with EnumExpression[T] diff --git a/querydsl-scala/src/main/scala/com/mysema/query/scala/TypeDefs.scala b/querydsl-scala/src/main/scala/com/mysema/query/scala/TypeDefs.scala index f9769ec10..f1923a27a 100644 --- a/querydsl-scala/src/main/scala/com/mysema/query/scala/TypeDefs.scala +++ b/querydsl-scala/src/main/scala/com/mysema/query/scala/TypeDefs.scala @@ -6,13 +6,13 @@ object TypeDefs { type Ex[T] = Expression[T] - type Tu2Ex[T1,T2,E1 <: Ex[T1],E2 <: Ex[T2]] = Tuple2Expression[T1,T2,E1,E2] + type Tu2Ex[T1,T2] = Tuple2Expression[T1,T2] - type Tu3Ex[T1,T2,T3,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3]] = Tuple3Expression[T1,T2,T3,E1,E2,E3] + type Tu3Ex[T1,T2,T3] = Tuple3Expression[T1,T2,T3] - type Tu4Ex[T1,T2,T3,T4,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3],E4 <: Ex[T4]] = Tuple4Expression[T1,T2,T3,T4,E1,E2,E3,E4] + type Tu4Ex[T1,T2,T3,T4] = Tuple4Expression[T1,T2,T3,T4] - type Tu5Ex[T1,T2,T3,T4,T5,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3],E4 <: Ex[T4], E5 <: Ex[T5]] = Tuple5Expression[T1,T2,T3,T4,T5,E1,E2,E3,E4,E5] + type Tu5Ex[T1,T2,T3,T4,T5] = Tuple5Expression[T1,T2,T3,T4,T5] type JavaList[T] = java.util.List[T] diff --git a/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/Paths.scala b/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/Paths.scala index 50d13bf8b..d41938174 100644 --- a/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/Paths.scala +++ b/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/Paths.scala @@ -16,16 +16,18 @@ import com.mysema.query.scala.TypeDefs._ class RelationalPathImpl[T](md: PathMetadata[_], schema: String, table: String)(implicit val mf: Manifest[T]) extends BeanPath[T](mf.erasure.asInstanceOf[Class[T]], md) with RelationalPath[T] { + type JList[X] = java.util.List[X] + private var primaryKey: PrimaryKey[T] = _ @BeanProperty - val columns: java.util.List[Path[_]] = new ArrayList[Path[_]] + val columns: JList[Path[_]] = new ArrayList[Path[_]] @BeanProperty - val foreignKeys: java.util.List[ForeignKey[_]] = new ArrayList[ForeignKey[_]] + val foreignKeys: JList[ForeignKey[_]] = new ArrayList[ForeignKey[_]] @BeanProperty - val inverseForeignKeys: java.util.List[ForeignKey[_]] = new ArrayList[ForeignKey[_]] + val inverseForeignKeys: JList[ForeignKey[_]] = new ArrayList[ForeignKey[_]] def this(variable: String, schema: String, table: String)(implicit mf: Manifest[T]) = this(forVariable(variable), schema, table)(mf) diff --git a/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/Queries.scala b/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/Queries.scala index bcc1492da..be2359053 100644 --- a/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/Queries.scala +++ b/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/Queries.scala @@ -11,79 +11,86 @@ import com.mysema.query.scala.TypeDefs._ import com.mysema.query.scala.RichProjectable import com.mysema.query.scala.Projections._ -object RichSimpleQuery { +class RichSimpleQuery[PT, P <: RelationalPath[PT], T, E <: Ex[T]](path: P, expr: E, qry: SQLQuery) +extends RichProjectable(qry) { - type RP[T] = RelationalPath[T] - - // TODO : use closures instead of ExprToTarget - - implicit def pathToTuple2[T,E <: RP[T],T2,E2 <: RP[T2]] = { - new ExprToTarget[T,E,T2,E2,(T,T2),Tu2Ex[T,T2,E,E2]]() { - def toTarget(e: E, rp: E2) = new Tu2Ex[T,T2,E,E2](e,rp) - }} - - implicit def tuple2ToTuple3[T1,E1 <: Ex[T1],T2,E2 <: Ex[T2],T3,E3 <: RP[T3]] = { - new ExprToTarget[(T1,T2),Tu2Ex[T1,T2,E1,E2],T3,E3,(T1,T2,T3),Tu3Ex[T1,T2,T3,E1,E2,E3]]() { - def toTarget(e: Tu2Ex[T1,T2,E1,E2], rp: E3) = new Tu3Ex[T1,T2,T3,E1,E2,E3](e._1, e._2, rp) - }} - -} - -// TODO : define both callback (RelationalPath[_]) and projection expression (Ex[_]) - -class RichSimpleQuery[T, E <: Ex[T]](expr: E, qry: SQLQuery) extends RichProjectable(qry) { + type FEx[X] = P => Ex[X] def query = this + // TODO : simplify these + def join[T2, R2 <: RelationalPath[T2], T3, E3 <: Ex[T3]](f : E => ForeignKey[T2], rp: R2) - (implicit e2t: ExprToTarget[T,E,T2,R2,T3,E3]): RichSimpleQuery[T3,E3] = join(f(expr), rp) + (implicit e2t: ExprToTarget[T,E,T2,R2,T3,E3]): RichSimpleQuery[PT,P,T3,E3] = join(f(expr), rp) def join[T2, R2 <: RelationalPath[T2], T3, E3 <: Ex[T3]](fk: ForeignKey[T2], rp: R2) - (implicit e2t: ExprToTarget[T,E,T2,R2,T3,E3]): RichSimpleQuery[T3,E3] = { - new RichSimpleQuery[T3,E3](e2t.toTarget(expr, rp), qry.innerJoin(fk, rp)) + (implicit e2t: ExprToTarget[T,E,T2,R2,T3,E3]): RichSimpleQuery[PT,P,T3,E3] = { + new RichSimpleQuery[PT,P,T3,E3](path, e2t.toTarget(expr, rp), qry.innerJoin(fk, rp)) } def limit(l: Long) = { qry.limit(l); this } def offset(l: Long) = { qry.offset(l); this } - def orderBy(f: E => OrderSpecifier[_]) = { qry.orderBy(f(expr)); this } + def orderBy(f: P => OrderSpecifier[_]) = { qry.orderBy(f(path)); this } def orderBy(o: OrderSpecifier[_]*) = { qry.orderBy(o:_*); this } - def where(f: E => Predicate) = { qry.where(f(expr)); this } + def where(f: P => Predicate) = { qry.where(f(path)); this } def where(predicates: Predicate*) = { qry.where(predicates:_*); this } + + // projection + + def all: List[T] = select def count = qry.count() - def all: List[T] = select - def select: List[T] = select(expr) - def select[T](f: E => Ex[T]): List[T] = select(f(expr)) + def select[T](f: FEx[T]): List[T] = select(f(path)) - def select[T,U](f1: E => Ex[T], f2: E => Ex[U]): List[(T,U)] = select(f1(expr), f2(expr)) + def select[T,U](f1: FEx[T], f2: FEx[U]): List[(T,U)] = select(f1(path), f2(path)) - def select[T,U,V](f1: E => Ex[T], f2: E => Ex[U], f3:E => Ex[V]): List[(T,U,V)] = { - select(f1(expr), f2(expr), f3(expr)) + def select[T,U,V](f1: FEx[T], f2: FEx[U], f3: FEx[V]): List[(T,U,V)] = { + select(f1(path), f2(path), f3(path)) } - def select[T,U,V,W](f1: E => Ex[T], f2: E => Ex[U], f3: E => Ex[V], f4: E => Ex[W]): List[(T,U,V,W)] = { - select(f1(expr), f2(expr), f3(expr), f4(expr)) + def select[T,U,V,W](f1: FEx[T], f2: FEx[U], f3: FEx[V], f4: FEx[W]) + : List[(T,U,V,W)] = { + select(f1(path), f2(path), f3(path), f4(path)) } - def select[T,U,V,W,X](f1: E => Ex[T], f2: E => Ex[U], f3: E => Ex[V], f4: E => Ex[W], f5: E => Ex[X]): List[(T,U,V,W,X)] = { - select(f1(expr), f2(expr), f3(expr), f4(expr), f5(expr)) + def select[T,U,V,W,X](f1: FEx[T], f2: FEx[U], f3: FEx[V], f4: FEx[W], f5: FEx[X]) + : List[(T,U,V,W,X)] = { + select(f1(path), f2(path), f3(path), f4(path), f5(path)) } def single: Option[T] = single(expr) - def single[T](f: E => Ex[T]): Option[T] = single(f(expr)) + def single[T](f: FEx[T]): Option[T] = single(f(path)) def unique: Option[T] = unique(expr) - def unique[T](f: E => Ex[T]): Option[T] = unique(f(expr)) + def unique[T](f: FEx[T]): Option[T] = unique(f(path)) + +} + +object ExprToTarget { + + type RP[T] = RelationalPath[T] + + // TODO : use closures instead of ExprToTarget + + implicit def pathToTuple2[T,E <: RP[T],T2,E2 <: RP[T2]] = { + new ExprToTarget[T,E,T2,E2,(T,T2),Tu2Ex[T,T2]]() { + def toTarget(e: E, rp: E2) = new Tu2Ex[T,T2](e,rp) + }} + + implicit def tuple2ToTuple3[T1,E1 <: Ex[T1],T2,E2 <: Ex[T2],T3,E3 <: RP[T3]] = { + new ExprToTarget[(T1,T2),Tu2Ex[T1,T2],T3,E3,(T1,T2,T3),Tu3Ex[T1,T2,T3]]() { + def toTarget(e: Tu2Ex[T1,T2], rp: E3) = new Tu3Ex[T1,T2,T3](e(0), e(1), rp) + }} } diff --git a/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/SQL.scala b/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/SQL.scala index e4df2068c..b1e5125a1 100644 --- a/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/SQL.scala +++ b/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/SQL.scala @@ -13,7 +13,7 @@ trait SQLHelpers { def templates: SQLTemplates implicit def toRichSimpleQuery[T, R <: RelationalPath[T]](p: RelationalPath[T] with R) = { - new RichSimpleQuery[T, R](p, new SQLQueryImpl(connection, templates).from(p) ) + new RichSimpleQuery[T, R, T, R](p, p, new SQLQueryImpl(connection, templates).from(p) ) } } diff --git a/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/Serializers.scala b/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/Serializers.scala index 745fe1d4b..6f307bc8e 100644 --- a/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/Serializers.scala +++ b/querydsl-scala/src/main/scala/com/mysema/query/scala/sql/Serializers.scala @@ -72,46 +72,32 @@ class ScalaMetaDataSerializer @Inject() (typeMappings: TypeMappings, val namingS } def serializePrimaryKeys(model: EntityType, writer: CodeWriter, primaryKeys: Collection[PrimaryKeyData]) { - primaryKeys foreach { primaryKey => - val fieldName = namingStrategy.getPropertyNameForPrimaryKey(primaryKey.getName(), model) - val value = new StringBuilder("createPrimaryKey(") - value.append(primaryKey.getColumns().map({ column => - escape(namingStrategy.getPropertyName(column, model)) - }).mkString(", ")) - value.append(")") - writer.publicFinal(new ClassType(classOf[PrimaryKey[_]], model), fieldName, value.toString) + primaryKeys.foreach { pk => + val fieldName = namingStrategy.getPropertyNameForPrimaryKey(pk.getName(), model) + val value = pk.getColumns.map(c => escape(namingStrategy.getPropertyName(c, model))) + .mkString("createPrimaryKey(", ", ", ")") + writer.publicFinal(new ClassType(classOf[PrimaryKey[_]], model), fieldName, value) } } def serializeForeignKeys(model: EntityType, writer: CodeWriter, foreignKeys: Collection[_ <: KeyData], inverse: Boolean) { - foreignKeys foreach { foreignKey => - var fieldName: String = null - if (inverse) { - fieldName = namingStrategy.getPropertyNameForInverseForeignKey(foreignKey.getName, model) + foreignKeys.foreach { fk => + val fieldName = if (inverse) { + namingStrategy.getPropertyNameForInverseForeignKey(fk.getName, model) } else { - fieldName = namingStrategy.getPropertyNameForForeignKey(foreignKey.getName, model) + namingStrategy.getPropertyNameForForeignKey(fk.getName, model) } val value = new StringBuilder(if (inverse) "createInvForeignKey(" else "createForeignKey(") - if (foreignKey.getForeignColumns.size == 1) { - value.append(namingStrategy.getPropertyName(foreignKey.getForeignColumns.get(0), model)) - value.append(", \"" + foreignKey.getParentColumns().get(0) + "\"") + if (fk.getForeignColumns.size == 1) { + value.append(namingStrategy.getPropertyName(fk.getForeignColumns.get(0), model)) + value.append(", \"" + fk.getParentColumns().get(0) + "\"") } else { - val local = new StringBuilder() - val foreign = new StringBuilder() - var i = 0 - while (i < foreignKey.getForeignColumns().size()) { - if (i > 0) { - local.append(", ") - foreign.append(", ") - } - local.append(escape(namingStrategy.getPropertyName(foreignKey.getForeignColumns().get(0), model))) - foreign.append("\"" + foreignKey.getParentColumns.get(0) + "\"") - i += 1 - } + val local = fk.getForeignColumns.map(c => escape(namingStrategy.getPropertyName(c, model))).mkString(", ") + val foreign = fk.getParentColumns.map(c => "\"" + c + "\"").mkString(", ") value.append("Arrays.asList(" + local + "), Arrays.asList(" + foreign + ")") } value.append(")") - val t = new ClassType(classOf[ForeignKey[_]], foreignKey.getType) + val t = new ClassType(classOf[ForeignKey[_]], fk.getType) writer.publicFinal(t, fieldName, value.toString()) } } diff --git a/querydsl-scala/src/test/scala/com/mysema/query/scala/sql/QueriesTest.scala b/querydsl-scala/src/test/scala/com/mysema/query/scala/sql/QueriesTest.scala index 430d838f9..022e44c36 100644 --- a/querydsl-scala/src/test/scala/com/mysema/query/scala/sql/QueriesTest.scala +++ b/querydsl-scala/src/test/scala/com/mysema/query/scala/sql/QueriesTest.scala @@ -9,8 +9,6 @@ import test._ class QueriesTest extends SQLHelpers { - import RichSimpleQuery._ - val templates = new H2Templates() def connection: Connection = null @@ -46,7 +44,7 @@ class QueriesTest extends SQLHelpers { val sup2 = Employee as "sup2" assertEquals( "from EMPLOYEE employee\ninner join EMPLOYEE sup\non employee.SUPERIOR_ID = sup.ID\ninner join EMPLOYEE sup2\non sup.SUPERIOR_ID = sup2.ID", - Employee.join(_.superiorFk, sup).join(_._2.superiorFk, sup2).toString) + Employee.join(_.superiorFk, sup).join(sup.superiorFk, sup2).toString) } @Test @@ -55,7 +53,7 @@ class QueriesTest extends SQLHelpers { val sup2 = Employee as "sup2" assertEquals( "from EMPLOYEE employee\ninner join EMPLOYEE sup\non employee.SUPERIOR_ID = sup.ID\nwhere employee.ID = ?", - Employee.join(_.superiorFk, sup).where( _._1.id eq 1).toString) + Employee.join(_.superiorFk, sup).where( _.id eq 1).toString) } @Test @@ -64,7 +62,7 @@ class QueriesTest extends SQLHelpers { val sup2 = Employee as "sup2" assertEquals( "from EMPLOYEE employee\ninner join EMPLOYEE sup\non employee.SUPERIOR_ID = sup.ID\nwhere employee.ID = sup.ID", - Employee.join(_.superiorFk, sup).where(e => e._1.id eq e._2.id).toString) + Employee.join(_.superiorFk, sup).where(_.id eq sup.id).toString) } } \ No newline at end of file