From c0b9426d5d695591f3de61a3262e772392b9f400 Mon Sep 17 00:00:00 2001 From: Ger Inberg Date: Fri, 11 Apr 2025 07:57:06 +0200 Subject: [PATCH 1/2] duckdb --- R/Cohorts.R | 38 +++++++++++++++++++++++------------- inst/cohorts.rds | Bin 0 -> 46105 bytes tests/testthat/test-basic.R | 23 +++++++++++++++++++++- 3 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 inst/cohorts.rds diff --git a/R/Cohorts.R b/R/Cohorts.R index f1ed411..89ef3e4 100644 --- a/R/Cohorts.R +++ b/R/Cohorts.R @@ -38,31 +38,41 @@ createCohorts <- function(connectionDetails, stop("connectionDetails is not valid.") } - if (connectionDetails$dbms != "sqlite") { - stop("createCohorts only supports sqlite") + if (connectionDetails$dbms != "sqlite" && connectionDetails$dbms != "duckdb") { + stop("createCohorts only supports sqlite and duckdb") } if (cdmDatabaseSchema != "main" || cohortDatabaseSchema != "main") { - stop("sqlite only supports the main schema") + stop("only main schema is supported") } if (cohortTable != "cohort") { warning("The cohortTable argument to createCohorts was deprecated in Eunomia v2.1.0") } - connection <- DBI::dbConnect(RSQLite::SQLite(), connectionDetails$server()) - on.exit(DBI::dbDisconnect(connection)) + if (connectionDetails$dbms == "sqlite") { + connection <- DBI::dbConnect(RSQLite::SQLite(), connectionDetails$server()) + on.exit(DBI::dbDisconnect(connection)) - # Create example cohort table - pathToSql <- system.file("sql", "CreateCohortTable.sql",package = "Eunomia", mustWork = TRUE) - sql <- readChar(pathToSql, file.info(pathToSql)$size) - sql <- gsub("--[a-zA-Z0-9 ]*", "", sql) # remove comments in sql - sql <- strsplit(gsub("\n", " ", sql), ";")[[1]] # remove newlines, split on semicolon - sql <- trimws(sql) # trim white space - sql <- sql[-which(sql == "")] # remove empty lines + # Create example cohort table + pathToSql <- system.file("sql", "CreateCohortTable.sql",package = "Eunomia", mustWork = TRUE) + sql <- readChar(pathToSql, file.info(pathToSql)$size) + sql <- gsub("--[a-zA-Z0-9 ]*", "", sql) # remove comments in sql + sql <- strsplit(gsub("\n", " ", sql), ";")[[1]] # remove newlines, split on semicolon + sql <- trimws(sql) # trim white space + sql <- sql[-which(sql == "")] # remove empty lines - for (i in seq_along(sql)) { - DBI::dbExecute(connection, sql[i]) + for (i in seq_along(sql)) { + DBI::dbExecute(connection, sql[i]) + } + } + else { + connection <- DatabaseConnector::connect(connectionDetails) + on.exit(DatabaseConnector::dbDisconnect(connection)) + + # Create example cohort table + cohortData <- readRDS(system.file("cohorts.rds", package = "Eunomia", mustWork = T)) + DatabaseConnector::dbWriteTable(conn = connection, name = cohortTable, value = cohortData, overwrite = TRUE) } # Fetch cohort counts: diff --git a/inst/cohorts.rds b/inst/cohorts.rds new file mode 100644 index 0000000000000000000000000000000000000000..a8d4234dd3af458dc1fd641297bd022e834ab752 GIT binary patch literal 46105 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%0Dk*jTuZ-N(4Zye2t9fc9j(~CGYgrt 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

(~; z7^Uc3%y>FCEt!YfkXy_Xp)90fdjw3z4ytPlodKb|cmm)AJvs{$rT;~NlYNZwOou1h zc~lBid%1b@9ENPs)FWxe>r-#)_d_PdU5^z_*@SE!o)8n zKCyMdZ%tq$RQqS^kF#~gM1|Iso33V}x%tqf>t^ zsI?au5;n|VEE{|2R?J&Wi;(B~eCmPLn>MRwehV`Ubg^n9XX$$W1@rM+A?oHW3^M1P zx|3zEDZ&^yhDbKPfd39URY6Pgdw+z+X(g{I_R)U7$?3YWEyilBY%g*6sy-sQ*e6+& zCXiq2uCov$oF+u6rFY!%)7EV{Ko|ZGs+)(!+#CO1jB8`;5z`3@?HFv!2fO6P_2F$A zs8MM3#njhu)@-!cKV0u;;2iFHmmYV{?Nw9P&(7)eYa$x_W)XSn{j0T?E{SwqXgU8&q_cpQrHq1co=0 zDPBuRMQX0*a2nF2o;E-MI0^W=_ZpwNVQx*r*d`!>m$KLJ)G(+p?$y^NXTv_&EjCuB zLUQ%F7#oH5yENo&Q;L}Y8jX^4dYa%s$G-m6~~8ICrh=jdEEkVQLzLGlaJz zd)CJ=#=^b0Gfgt&LS+vW2$8t+*8cge$A*pu@Yy`K##>U81Dppo5j2==Ly!b>CX`dQ zwAy3r#MOD9Zn}oz)IffRorOMr+ll-2yKjG$V8AB%G+I~mbj}$zd5${HuxrXfn6^g* z8_inGuKtqtd6OV@W7oOYOIL^NUX7W=OBTs9Ft0_8a!DDGFhNj3%|D+%w?S7oyT-Vm z$Jn%(Yh6);5+bqUk1eZMZyw>Ox8hk0H=|F1f8ak0)5FtwP)qKw$!o&RXK3^8_ED zNB=ZSe$~-%%Pxoi|FCuEQAw>~|L{-8j-Dp1tjtoWoSGbR78QE$LS}e5zvq3{`mOc8|HEEu!@c*u@9Vxk z-#uRnxL;p8UIRQPKRc;*6Fi^)42MCZKdSd%@l6)Y`a^xuP+`X*R#>DAxRwmVAU!0Q z@O<+4R-O9wbUk`s7j{Mb?^_4IB%dWeF@VD2L~reKd)fU+#C#ESXEnFDGc`}cX_R2eh%P8PE}!W85Oj2TkE4mKveoxm94( zS&DHz`Kcwv!rLBT5w3*uNI~=hRX7r>^tK~pY4_i?7VxhSVTY4&Rg2~#3L=S8L%)3n zp!XhQUJP*nuNBZ!5fN3DUR<(0JxJlt8(z&B%r;CfO>_DukbpiaAe#t8D7v}<;t#mc z!**?T3ri9vooSR1qDAG3%oxDKhBV~XcGiL}xhM_!aZn($wXZFIhHIO^^&y?&k>Ylp zy#EEWRUdx7(M;@Ih|c4cJ;j~=R12L`>Ze$6?eA61n2U|f7X`CtkV2PvuFiTLc61KB z7@!(L#?ANWji)i6zm&(*F3=SWX*&~VDTW*pJcZYuLi`yyLe7PA{oEFDW2SwfFn@dE z=T6lI`Se-2Pd`n)xRBTDgcgFb078@Dk6=1*`+n*F!%RT-`%Dncm22_z;kH?k6CLw3 ziYEnl8_)09(88wg~2?lZV?Jg6 zrd15jp&eHuN#{l9iLaXyCK<$($iz^C*BJ8dIcOTwA|l6~%5{1jG(No%xQ0`kSyb1n zdRp*upZ#ny+^DUmeanb^S4qRxs78*ml%*upkEudc>~ zsjVOm2cZp7O+C%vQLg!Cz)diq9yiww0(5-ln5QEgqoQ5-UDxTbhluv2KG3>90Df4~ zxcB18k0XH-g|`aN!H`MF1_H-`Z=22bn>YJ|_Ulpf-4tGAidjS)qOpgycw4d<02=hP zZ(YEtiGRz|rjoeV+thILw?RKQ#b)symy!RZi2}s1T}*R&S}@5+hu^nntD3CWPq{7~ z(#>G?t$k;_(c&>~0kg@@3rlLnfkEKgYV%sCFZf!cUdYrcqUi_2XHB3M`YO1VqD|)7 zu02*0tv}+miUD9Q>b>t!61*tEDk3rZ8cUnZ?lQHr_$*d6#F$7z+I_>8{9>E(aZJ6% zUf-emAlQDa>UZsLfr~)~&@@|a$rs!Z+h49JDab(KmId8*YYvd=zexBraC9!vhg$fZ zBXLn_dJOhRx51!{N&Hsyxo=yH2fos-Xy`44Z$8tHJDCQgUC8OuU+Uva0i6TPiOE^} z-?NEL>X_pX?*YY2B+Kj4(2*v)`R_3?QN?}O{K0Hv-s*J<xN;whr5v&})Q2mQ^9Z*jd5VQAd>*bkg} zCW3Y3(2s2Owb9dv!|?TI5DKYd?e5NMV&o=+e}R&(P-F zB*wS9RHt80MR~uV$pm(ig((ytnxpWL`|F!!X)3&y(>DGoy3?7S!bcxq^ehgI2yoqS z(@*3W>?n!-hr}kO{mI$s?E3{sI`<(7=r!wnYpv2+V?jxlo|Q=4UmL`Q@MpV_OW)808F{2XZy zCBzcR@DZwsb;u`pb7n-D>D)P+cBsjEAgVbufssV;j4G3GO+x1)f2Z7k%t_<|=E>Zp z!#G47+)qJbnha0HlR9#{CDQQ2v_l&kI#Dn|Ub=WpLVGK65da=%_!6H=h z0V({GS8%oyg8CC!I8HP6C@r^4QCLVDQ>16QV?9T@1RVr&-jExSY{c`Vpi z3{{ItN9-w6$Wq$tcVZx zi`u=Y&~a{w(Qh`oVi%b#a~&|DxipUl&-*P^J)ikv0*aJg*IcjhS3EISYWV%PoTN@> zA_o-~hq!0D<(Z2Z^qNIHza1)JjWpSAa<8uoT58VGiUh-l5K()!a^-sMVt(Vt)x8PJ z&EomliTUZMd@>-YQ=aUU-4Ipx!E=RKCk z$IWut+Fr_l?cf&q`~m87PL?o9Se;8%S}L`$cv=#8|Mcy8uspt3%}Gn-;& zN<1rpkQw}hd;G;Y&eoh9tiI5#88B0CKPuB%gO;_>B0k%C)Ltet-66~J6Z6e5Ui83P zV#+j-(kkA)CV>m-h`*1&7iM{Jcw(ba@WbPunJLLDJ8$?0{7)|4k*}@9g6&0w^-P0O=VQ?N6x% z-)W%D!hA@#gKJ71#i@t@**|%2)Ip&=}yxrJ|uK7i6%2$-QV`MW03PHi9FdO9v z%YoOo33~4eQ)K9ahgc{b;c_mb*0!)mo;8*sVt=21TdfG8835q9_O~ObU;i3lkO*(P7y+;;x zm@=^peKzB@LbyFE>VTzk@I;TKLxP5VWIZ-smq2JOk{3OEB)MxMe2@#*jEdGlPq%Kk z{bt=S6o7#HYdf&&^j@pA1nGn_m~^P$wI`RAGtQXoAO8~q)%Q}Q#Zz3o>|z8s5r`<$_7q`V9yPU%5dNIk z)NqsthAcGpn2j>Cnv|n7NwK>o69RgBwvqrL{#XoD*OI#s-2YQ^jCPIhIf48mG7y6d z7#8%gjhQr~;<_G0!vjSLLyc#uOq;DjY4qEt!Octyhb<>>E{&m0Qph=hYzRr@vkqaH zF=)_Id2>7g7l*qw!o~!WqLGwa^lTMD9UiE!wd5nX(>{%z?8be-SOtTA1s`qXLs@XJ!Su8M>$r}Ub7uXQ9m%()5@ z-eIWVpNF(|SyJI0@!TVM&0c7U1V%yuxL`2p%-o*Mh2aI9#W`4@-C9x2)x2|Uy4@_q+4?x|YZJ=~O7cVV6){um=AR+qinzC;yD!DlYcWr`jhpDhoJzbIuThE? z$iGf+y+ixOGd}civbr(pqcQ0P zPp_Zxqp2;;Xa3lj?P6HuYgDUk;R7tvUko7w7h!4GR5E-P56esJ1${~+UMfuFA7Y~q z;42kN2@gY6Sk@!N$(sA$-M>*{VtU#4_%h7er2wl677s)tavzepa=nk$g`AhdUvl{2 zL*}*2Tr-q51&BK1ORxhuM!pia*$PXO7eT$)mxi$PpWtfkVyk258YghuKjOe4dw=0H zbN=@ngk7%0y_FF`b(ZbaCIju;bHxPZ-4uJlIe~>eMRz^`P1oPg6J*r8EZr8H z6nYA#xv_>@L32i^M9|jn0`ho;>8pmZtvYbXhjmlW+NZtnLz~gK-srZ`)&jf2@Y_i4 zBhmMR(>$Ta@v#)-gIwSjUFK`yv2_RlY@dz`5cV)TM8tGLu3Su(=!(L_2dU_fj!WxF zh~NRB$uVeESLh}&iTr5;*H{K?8Re?#Ll`-fvCfAVRo=6q=YtCTT)cn$gZmuS&!($j zaDckb&yB-dbI_-4D}EjQ>#n}!rXhcIj~^uWp#2il8p9iEck9tXcHa7JV{B=f4rh+y zUM?fPtQJhpHdoua@TrIWv+0Bj^0WBOQ{-%keBjCT9g@l zh#R4nGsf(aYRoca;MuIiik_;^U=Xn$i49i$UV8*)tJ<5GKoh@@+`PVUf|WZa-}w>iw>o32yzS zDIUJ+HU7T+WMPAFVNIPWl0}$U%ubn>?NV!~Sw(}>8%CSk{6OKqi5JI$R39QfcQ!bJ z^;}CMk6N(e7HVaLcG;!84g#JL!IbgF6Y7UWHOf)loe{_mXCdhk(pTXj1oRU44{{5; zXKmuE5Y6p4!NCJFVw*PJyi}ZhUs&89JAER(-4fbjZ}p@r(c>d!A7%y!+>nV zT#?Ke#*AXZxjWSUUayz8IzoO}1qj~c&w~e$q$mr1L9Tm0Sd9pKfL?7{cmo;&PHm$x z52LHapI;LOX&Rjinq%X_AZF`%s|)A7JJMC%`t&|xB&}f@zLoRvq1d~d1LwJfNDu5h zvxBa(b)OJA7VBv!$%OX`+l3+CQHtmULhbpETZ!$D=4TNFWu?Pw^_cmpGn=k*lh;OX z$idDj7%3CXS>7qA_o`OkdBlD+@R-_s1NbS<(5pfGH|}CKqH)yn1HrOoSm;{g=?8>#|BlHF!qi<5!^hSx0Y+tueW;=-37 z!;_qhHk{Jth!zS)Nm-32(qBvsK<7W}7NwtSt0Crv`t(3ypn<*MUpbV;Vr*31a18e^ zT56sN+1Ou#_y={Klg4b(WnpN1=V|2$m23^ek5~6-NDn#!Sp?}eT^LX!WGaZZT;Sw zNbqbIHn#zirQqqW8hnm0`awZ8i!pHp;V~p0#Tda*wfTuiz@s=-x$w~{Rr~wLXnJ_f@*JxQ@3mik#!PAiBNW%m(Fe%+u z$e=nHp{#r{gMoL?ja3h;;22;_7a5#OUaSJ16@6TcibDheEFy`q!ZMjb5cE5+4$^3U zo||`lR>_!(#={UB2~`7@P4;SpjCT4V)`K1BAQ_7xpm3+aL73^e58a(4oTqU^&wIlJ z&O#6?nbspe(*f9uxZMHCVjA8QUM~$#iTxf-Kg?S9)}#Jr$#2z#@{b4#=T{!5pU^G1 zi^dG*naEr8V&-~X?(fxZ>jNIVtINUf5(OsmHF+mD7haD9UK0Xk)~|3F4*(VUwPNIS zt`;F!=paO5*;P&t711Br{W{;Qwt@w8G)1~u;vc*8{h=VW_ULcUH@$wE73~%HK<(5) zmAZ9?p@J2#58lxEsV-#{3bM~{j5hd|&t3S^&aem-GUwG|i@s<uItf>x~ zI4P(4?_1FhL&;%%QGdq3L zoO(#GLfD$iwj_v~l~~T7Mi}(0Y_snmdN``XYy4AqjXU@Zj#$(rPp1y!C` zr57S*=noA^XN;$NkfeU9c(oVO2$?LM#-LIV%s<*bVUXi*0I&vmHF_8-)sVGkiml>J z20D$eXF(!T#O9>V^&5JcopOSU@O@ELXZ~(G)s{q*DYWs!#%i-=6KAu&waJa-DI)@d z=~eTyj;2Z3#>w*wU3ybJg%y5*z9%2}aIIirxF|Be;grbYcS9bx=-UV(n^{_+SB(Y! zDo(Cc-OI`1AU`9uA@yHkA?+c4=ofR^k<2WH0cuLF%ur%H7kI56w_Cxy(i5Dgd%_BcJZ^wUeSl) zZ;8F`BejGY9D+4*Xz- z7M3{E8}mhOdBis9YC}%NR0y0i3iXGdOyu^h5Q7^!mrNu_&>35|vxG*1YdMcOl62x* zXYY@3k_c(7`k&aliQIn_q{A)D8za8N8jhJX9nv1JEdtanw*m-YuK+7*IQIPPgb%50 zW-gJlk?4i(Kw5U9cYvM7fMzMU;{MQ0v}+QX84J6C!=!=hU7DCs6Q;efhiRBF>*4IJ zb^DRHtgK1DcH>+Q)lz{6R)*JY?y;zn8yz5zjre;7c2++xt#s+jFvEi=d48PrHK7{H zi+rp1-Ib-gG8S)_JLPerZ759MIOfCYNSG)s)Yp#meUpDXNfKG-lsGaogBZKTx6fm@ zFQfF<{kN7|c`^I;+Dj(+3@wID;i+YaQB01Jz+F$I((YLX#iU;Mu8PwY` z+`jkagt=$Ux7_@ZxX>r$P-NbUb|cE5GcnyUviLBAcn-43=x2DsOm!bDRuvo-Upt%1(+dsz8WB$TLO#Axdlb2y`qLx0+97EPIOPvqPj<1^%U2|r{e30 zUR50R%^Q)Pm`N`KaP3{+BdESxTNc#rJ#~hZBnmuPi6RuqbFTUPI*!QD`<}Soqo@!5 z0gU_+p2`3b{H1fi*3iESF|D#|qen5+^X+Ha(gA0C6z+=4*n8BsjN$7Lxwe{N?omU~ zZKi1|?oz z-KMq$6-TN=?rXw_6MHg%pe(01QUJm7V8#t#E;wvPQG_(nG0-J?4e z(sOPoSpjp{zKLtaJ~LnCFSioR7VG1SIzt}leaqwOv{k`ug-3$dAI>x@@%nu>-6!v= zNW{(132n9Zv9-gT;H`)1TLsgOjX!6Mx76E4cJ1kp6W7ZkEO}D)R1cWbgf5>(HC#V@ zG6BT0C&IJZ%g>?AMZLzGvLPOrtqb{*N8&|oiM2TR5X;%^Chp5kH7%l%KQ#LnG@aoS z=pCZED)xhF9tiLFYHKPTuiUmHF;X4~7hN{;l@4)o8z zO?{)bk#9g>5Wchdh}KMD)Wa$jVXgEaVVD1O5Mo5y#kZNfl4rt%z>~nNseYWYz*skAOVHd|T|>3AAhr1A>LJ2FjctUtqY z^(OTDjadlUo=+FwjA3IM{HeziEip*GBbLobx78z!Zchsq zkBeVRXwtzTBcNxu&W@9zu^XKG{WP!=mLWQ|u1z5>w?wf^)zS%jk{Z_i-BZDZR(G;z zqZR^CcPtnmz_S#DhxWu*XbSkx^sx70hdja8ZZP6A>J0>x?4A1pV~cJ;{gT~sDqt4& zD3#e;HeA~I@J!nZCkL%?7##W#uGSVV&g=6zu^(QAGNH*VI;#UI zOqLO1jcZ`h*+fmryD{N|qmp-)eTSG?T9H?tcH9%IZlSgc&(^Ty*^k2#H&xeDg8OQqwl?`gsbzbbi#sTtCzor4@5vJ0weqokQ18S(HTs7?z9udVA=OEou znr~s7v&nt!zpUtE!K?@J;RRg9CdkIaDx9q_06r#N53L6EaRng3JJsozaT^V{`;otU zZdWn*nk%KdiHCma6xzRJB4jL1q0w7!g1fiPuJ9srC<{s-QIA;Ri-F$1>KWAyxCrEj z^wZs{9ER!4m7ba-P@P@|S_6gN1LkE|&M2>y8VDTNYO57XpV3i|!13&|FWR`KL#)8} zov&j{U1zoDj9FH>l!sRqq>{=0ubQU4jHCA7QW>}AXIs2d1;+)mLTEqSxZb{r>Aw%t zq-O9_rwmi%`-J^3)i(!nD%)OyLD2deEpb<86j8rQY>&JDQy|~`>{R+qE3+6SN3_k- zm7$qf4Nzb~N&Y#wzKUG`snJ?1eepB211_!|#AriIPut(KFBABoKK>`NM}mxXcSBD0 zy{xvd0ju}@`kkFifLRqIW;X3tWXlta02V*Z^f9mh7h_jVyp=bY@*9}f7vJy5LX`Di z8wtM#{#W&YXxF(t;1yswCW-qVIQLmTVfzqQnj}k8>_6qN?|4mh@r1^C|5&~%a zk>QsQ%a;;?$2OI#+)Wrqt(01jr!ceaiw7Xn3`w3)Ei#*lruj(;1LeJL5>HSrC5W2l z(ydl60L+pYTKPW?d&Q?nlCjBIt@glGgrxI&Hw#8!ujX$dtKhQzEu)Gi5}QQ@GI>q9 z2Xq#FYW138l)FOT|D~`)V_Tf3k(p5iqycKy0N4QH>2s9TUT%L8QAK?s?P^b4lCIz8 zsD2)hDtX5W!^tI*d8NNUvIY+67fnK4A?G{(W|dbfzOZ=bk`k*6_sK`E94WtY6J>%R zI@b37kHHR=oB=~DCWQAzpZZOwTwSGMwL0*C5&WyRXD%0pED}>*MEm|2Dd8JLm|q5A z5FqNFT)7anm+;xi@S&y)JcG48#l*}_{OYBgz~IHa7?bH@20?n^Zql~j+W;(J10xe5qwau7l3TLmCL!55Z^Wgi0?P@FdJId znXYn(9XN@0W!Np{EO@aMR@%y8Z+(+v{-vHQ_gdx0uiI1rYyjFnS(hZ)5f?^i&zmYx z>7lYbjo#ACv2?a8wRAwySmNxf2v2atYJ~EZ4s%BN4_VVwdC%K!ivA&eTw3KcL&7FU z7*|ctgUVvS(~C!7>M%{|0r5E`8*1%9Vnb(_rOf7?%%vBhW;B_!c~4wXjrG^TzB&kfd2aGGme&eTQbwc%b1&LsIO9tZT}y}R)Cic(C7!aK5GaX zFf(0-DTDY#o%T?;wJ^-B;@za~@RS6I(t&zZqjIM;QJh{bRe7q*729uljUvYat}2u% zsoUF09`QkI!@1aU-&e8f?8p&T!;+mihrI++U}dj7@xWYIDu^*E?>t}lNPLB->R5Y5 zm|Cvu<#UD=_PtR<_c{A~f6wX}S6E)eKq{tEK?6-_Ev+5HX#osFze&Q%rW?v5%M+2g~C(t{&F=pP$~bx znz|<=K&`eFx<>0}Is+esg;vo_VH2&oEib9N2SZ`5n z$iLiTx^Ygic9IWkF{e5-{%*TM(ZpZ>zfg9a*QDvk^e@2Eth{RN3AKe&4^)Ih(}r4V zGE5hCVwG1GQ9a7Dpd==Z<_~p5Mv}PYguunu>_n=!C;q)^RY;a_-{xGV%L|_6%A(f# z6F4kv+aSgT5x%0J>GBR9L~Zu8uUUF2Jw?s}c3|9yaiyU3D&8qJkzZ9(szJfGMzHi( zjRzk;3VI%$FkN4+{jM;RAG{eMFs{M;N3*}XYRaE#^)6R~h@bKLrV9qsu4(T`zg8i& z*{1;)IzILSx>3)Sip9^_Z$Wajlb4api6kWJ`lNlP%uP`|F!cvRb4eBc@DzB&(!Ax5 z2a%VN)o`ax`Xsp?WwThRZ?8s03?9r#yrcR)CUPSt%Ox{1Q^g0)T|t(6-SV}BM^z_9|8@1V%krxFUMT9vgXBE}pgI z)F6Tz?@Uc(nf@7Q{_~!vsZGHh()rg>_mCBE!1UeM=yKhHd<2_Ob>(G)>Kd)*|0dcm zh5F`Io3N3}S9w)6xx6*%KjpCU8Z3Ko4L5W&i*P#XLV-TwHMLh6;Nne{c7m9#92~ND zBRDSAORd}0>)NL{&SNQj)TYLw-gU<7=1K0g1>EbVo6?)s1)9ZVk&USyQ=>Y{P2pOB zE-P(yc(CAkTYEt$)FZK6!70XX)1yl762)1*T&Tg$s*<=2p&RGZ0t zdEq_*iyxP)JF%@7bXau#Zj>R9-tv@;ffd;fo+_LM8+49|A3wr<^w z8S_JKvm|ww2fjGH6mN|E+=}3m9U+%$-U`pNH>=Q@>eV4RF}aS3fmi|_r5<`{YS;(| zwKCyNuH|}R?pS5So<+Q+eyR8$sm(f89h75>ffOI zwY7UZj}*R{IW^(b?m$;qZEWM!@=Dn4B@mq92(U(e z?oB%;J`MQXT-KUJ4Y^!fK&qPV8MMvDpG8lIYT1rqnX4xMVeL*Kn5JKqcggf>XDu*f z3^Iuv9E1R6rr{p=+VuL+Q1-#gKDLwN8b~|dVd})Y=Iw%i;0i0B@&b!NxiN`h*;C{z zxN9PV2;2REnoPoBcj~ipe4r?A;WD*jWmMBQfqiRP7d3#60$nk^+5utzJ=yUh=-v`W zc%Ju@`fc!WQ>Waz9VuYI_$8$>q)=$Yn|kmq>wmTOHT$U;(Js&STHT_Uog13_75*)- zWS3Q^IIHBeeVhes673tgmNDAph1XCfLUM^xmAHg2N4<6(d%|70<6DX8Nokx&WlZqq zx2f6;iyGZxOHYL2nonh7xl1`ee_FL%a<`+%GNTt4h||{dMpbwR(C)9C9rApx7nJWH z#tAb^pg)BHqJz9Ks(x8z?&daSO4#>mi|nH(W?XAZ+fnQz7+dK- z@OUD_$jW^E$Nl&G81v(f5G6@7Ka=X#W8oO1v_>A5b7M>h z&B+m)?W+|7f7LI!xs(EnH=&dJq&K^zxBNfD=Bxd$5cjRaNI}E4ue|&V8i18+gG1-C z1Sj>}7AJf6eTLO^K9SCFAmxhA`N|@re#KP{)9=ZL-9M!Jc0Oo@tOSUeP{-NjA zFe!Y0ot@Na_my%@FZ8J3;yO;~&dwjd<;bH^Pi^@E7?s4+de=lp%w8+7|D979O1=_k z-PysPrv?rwzLPg&POjb`h7MP;0#qv9wJ{DzHw2S9G~j>P{_3J9TxDt|WB9DSgW3mp zRakg+?JG)%_k~3VvsuR(SG7m6frx*oP8wroyo#{5li6-cmvu8#7(zKRr+WSxKv|Xf zf>Q?G*D+sm<^=x063kB(mjhIz&Q%<(UXSM&t{3|z39`&892H*1sKrB?&7 z8-HYi^kc}$d9NchF}*=-=W$zSV6!8mSExx1U(tA@RKUe=9$MCa7sF{$9DhZpOgg@v zsquYec^D3E#7qKSoe6FGjL0;7PrN32ThEl;bo|nAvDKIQs2r*Rb+Y=?%quxhQ{p5p zU~g>3{O7oJ^t?d_fPa;vpoKNwzHEb(RIIWvih4p@tQ`4?|2eF&Dk>xH1m?pa@+)LV z({U!9W{k>4SnIy>He$!Db`GF_ZNz@sAPzTl*r{AoU6hB

a04>J*zrPjgQyWcb<@ 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 NSL=>HE}Z`Be*kJQ*p&bP literal 0 HcmV?d00001 diff --git a/tests/testthat/test-basic.R b/tests/testthat/test-basic.R index 3896981..222539c 100644 --- a/tests/testthat/test-basic.R +++ b/tests/testthat/test-basic.R @@ -50,7 +50,7 @@ test_that("Query", { DatabaseConnector::disconnect(connection) }) -test_that("Cohort construction", { +test_that("Cohort construction - sqlite", { connectionDetails <- getEunomiaConnectionDetails() x <- createCohorts(connectionDetails) connection <- DatabaseConnector::connect(connectionDetails) @@ -71,6 +71,27 @@ test_that("Cohort construction", { expect_false(DatabaseConnector::dbIsValid(connection)) }) +test_that("Cohort construction - duckdb", { + connectionDetails <- getEunomiaConnectionDetails(dbms = "duckdb") + x <- createCohorts(connectionDetails) + connection <- DatabaseConnector::connect(connectionDetails) + + sql <- "SELECT COUNT(*) + FROM main.cohort + WHERE cohort_definition_id = 1;" + cohortCount <- DatabaseConnector::renderTranslateQuerySql(connection, sql) + expect_gt(cohortCount, 0) + + cohort <- DatabaseConnector::dbGetQuery(connection, "SELECT * FROM main.cohort;") + expect_false(any(is.na(cohort$cohort_definition_id))) + expect_false(any(is.na(cohort$subject_id))) + expect_false(any(is.na(cohort$cohort_start_date))) + expect_false(any(is.na(cohort$cohort_end_date))) + + DatabaseConnector::disconnect(connection) + expect_false(DatabaseConnector::dbIsValid(connection)) +}) + test_that("deprecated arguments in createCohorts", { connectionDetails <- getEunomiaConnectionDetails() expect_error(createCohorts(connectionDetails, cdmDatabaseSchema = "blah")) From aadb016531c033c7213c4b0517362778f5ba6b1c Mon Sep 17 00:00:00 2001 From: Ger Inberg Date: Fri, 11 Apr 2025 08:06:02 +0200 Subject: [PATCH 2/2] github actions update --- .github/workflows/R_CMD_check_Hades.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/R_CMD_check_Hades.yaml b/.github/workflows/R_CMD_check_Hades.yaml index e3ee30e..6be2765 100644 --- a/.github/workflows/R_CMD_check_Hades.yaml +++ b/.github/workflows/R_CMD_check_Hades.yaml @@ -102,7 +102,7 @@ jobs: - name: Upload source package if: success() && runner.os == 'macOS' && github.event_name != 'pull_request' && github.ref == 'refs/heads/main' - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: package_tarball path: check/*.tar.gz @@ -172,7 +172,7 @@ jobs: - name: Download package tarball if: ${{ env.new_version != '' }} - uses: actions/download-artifact@v2 + uses: actions/download-artifact@4.1.7 with: name: package_tarball