BMXSQL3 ; IHS/OIT/HMW - BMX REMOTE PROCEDURE CALLS ; ;;2.1;BMX;;Jul 26, 2009 ; ; PLEVEL(BMXFF,BMXLVL,BMXRET) ;EP ;Analyze WHERE statement according to paren level ;Return a string to guide building of iterator(s) ; ;Basically, count the number of OR clauses on the ;same paren level ;IN: BMXFF() ;OUT: BMXLVL(), BMXRET ; ;BMXRET = 1&/!2&/!...&/!n clauses ;BMXLVL(E,"BEGIN")=Index where element E begins ;BMXLVL(E,"END") =Index where element E ends ;BMXLVL(E,"ELEMENTS")=Number of subelements in element E ; N BMXNOR,BMXNAND,J,C,BMXTMP N E,L,BMXCNT ;Test for no ORs or no ANDs S BMXNOR=1,BMXNAND=1 S J=0 F S J=$O(BMXFF(J)) Q:'+J D ;Q:'BMXNOR Q:'BMXNAND . I BMXFF(J)="OR" S BMXNOR=0 . I BMXFF(J)="AND" S BMXNAND=0 . Q ;If no ORs or no ANDs then take all parens out of BMXFF I ((BMXNOR)!(BMXNAND)) D . S:$D(BMXFF("INDEX")) BMXTMP("INDEX")=BMXFF("INDEX") . S J=0,C=0 F S J=$O(BMXFF(J)) Q:'+J D:"(^)"'[BMXFF(J) . . S C=C+1 . . S BMXTMP(C)=BMXFF(J) . . S:$D(BMXFF(J,0)) BMXTMP(C,0)=BMXFF(J,0) . . S:$D(BMXFF(J,"INTERNAL")) BMXTMP(J,"INTERNAL")=BMXFF(J,"INTERNAL") . . S:$D(BMXFF(J,"TYPE")) BMXTMP(C,"TYPE")=BMXFF(J,"TYPE") . . S:$D(BMXFF(J,"IEN")) BMXTMP(C,"IEN")=BMXFF(J,"IEN") . . S:$D(BMXFF(J,"JOIN")) BMXTMP(C,"JOIN")=BMXFF(J,"JOIN") . . S:$D(BMXFF(J,"JOIN","IEN")) BMXTMP(C,"JOIN","IEN")=BMXFF(J,"JOIN","IEN") . . ;I $D(BMXFF(J,"JOIN")) D . . ;. N K S K=0 F S K=$O(BMXFF(J,"JOIN",K)) Q:'+K D . . ;. . N L S L=0 F S L=$O(BMXFF(J,"JOIN",K,L)) Q:'+L D . . ;. . . S BMXTMP(C,"JOIN",K,L)=BMXFF(J,"JOIN",K,L) . . I $D(BMXFF(J,"SET")) D . . . N BMXSS . . . S BMXSS="" F S BMXSS=$O(BMXFF(J,"SET",BMXSS)) Q:BMXSS="" D . . . . S BMXTMP(C,"SET",BMXSS)=BMXFF(J,"SET",BMXSS) . K BMXFF . I $D(BMXTMP("INDEX")) S BMXFF("INDEX")=BMXTMP("INDEX") . S J=0 F S J=$O(BMXTMP(J)) Q:'+J D . . S BMXFF(J)=BMXTMP(J) . . S:$D(BMXTMP(J,0)) BMXFF(J,0)=BMXTMP(J,0) . . S:$D(BMXTMP(J,"TYPE")) BMXFF(J,"TYPE")=BMXTMP(J,"TYPE") . . I $D(BMXTMP(J,"JOIN")) S BMXFF(J,"JOIN")=BMXTMP(J,"JOIN") S:$D(BMXTMP(J,"JOIN","IEN")) BMXFF(J,"JOIN","IEN")=BMXTMP(J,"JOIN","IEN") S BMXFJ("JOIN",+$P($P(BMXFF(J,0),U,2),"P",2))=J . . ;I $D(BMXTMP(J,"JOIN")) D . . ;. N K S K=0 F S K=$O(BMXTMP(J,"JOIN",K)) Q:'+K D . . ;. . N L S L=0 F S L=$O(BMXTMP(J,"JOIN",K,L)) Q:'+L D . . ;. . . S BMXFF(J,"JOIN",K,L)=BMXTMP(J,"JOIN",K,L) . . I $D(BMXTMP(J,"SET")) D . . . N BMXSS . . . S BMXSS="" F S BMXSS=$O(BMXTMP(J,"SET",BMXSS)) Q:BMXSS="" D . . . . S BMXFF(J,"SET",BMXSS)=BMXTMP(J,"SET",BMXSS) . . I $D(BMXTMP(J,"INTERNAL")) S BMXFF(J,"INTERNAL")=BMXTMP(J,"INTERNAL") . . I $D(BMXTMP(J,"IEN")) S BMXFF(J,"IEN")=BMXTMP(J,"IEN") . S BMXFF=C . Q ; ;Remove excess leading and trailing parens ;Find close paren corresponding to BMXFF(1) ;If its the last paren, then remove the first and last parens ;Else, quit N BMXEND S BMXEND=0 F Q:'((BMXFF(1)="(")&(BMXFF(BMXFF)=")")) Q:BMXEND D . S L=1,J=1 . F S J=$O(BMXFF(J)) Q:'+J D:"(^)"[BMXFF(J) Q:BMXEND . . I BMXFF(J)="(" S L=L+1 Q . . I BMXFF(J)=")" S L=L-1 . . I L=0,J0 D Q . . . S BMXPFF(BMXPFF,1)=BMXREF . . . S $P(BMXPFF(BMXPFF,1),U,2)=BMXRNAM . . . S BMXPFP(BMXPFP,BMXPFF,1)=BMXREF . . . S $P(BMXPFP(BMXPFP,BMXPFF,1),U,2)=BMXRNAM . . Q . Q Q ; ; BLDIT(BMXFF,F,BMXRNAM,BMXRET,BMXPFP) ;EP - Build iterator ; K BMXRET N BMXNOD,BMXOP,BMXV,BMXGL,Q S BMXNOD=BMXFF(F) S BMXOP=$P(BMXNOD,U,3) S BMXV=$P(BMXNOD,U,4) S BMXGL=$P(BMXNOD,U,7,8) S Q=$C(34) I $D(BMXPFP(F)) D BLDIT2 Q ;Pointer ;TODO Set BMXV to the pointer or set or FM date that corresponds ; to the user-entered value I $D(BMXFF(F,"IEN")),BMXFF(F,"IEN")="TEMPLATE" D Q . N BMXTNUM . S BMXTNUM=$O(^DIBT("B",$P(BMXFF(F),U,4),0)) . S BMXRET="S D0=0 F S D0=$O(^DIBT("_BMXTNUM_",1,D0)) Q:'+D0 Q:BMXM>BMXXMAX " . Q I BMXOP="=" D Q . I $D(BMXFF(F,"IEN")) S BMXRET="S D0="_BMXV_" Q:'+D0 Q:BMXM>BMXXMAX " Q . S BMXRET="S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_","_Q_BMXV_Q_",D0)) Q:D0="""" Q:BMXM>BMXXMAX " . Q ; I BMXOP=">=" D Q . I $D(BMXFF(F,"IEN")) S BMXV=BMXV-1,BMXRET="S D0="_BMXV_" F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:BMXM>BMXXMAX " Q . N BMXTMP . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)" . S @BMXTMP . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " ; I BMXOP=">" D Q . I $D(BMXFF(F,"IEN")) S BMXRET="S D0="_BMXV_" F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:BMXM>BMXXMAX " Q . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " ; I BMXOP="<>" D Q . I $D(BMXFF(F,"IEN")) S BMXRET="S D0=0 F S D0=$O("_BMXGL_"D0)) Q:'+D0 I D0'="_BMXV_" Q:BMXM>BMXXMAX " Q . S BMXRET="S BMXV=0 F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX I BMXV'="_Q_BMXV_Q_" S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " ; I BMXOP="<=" D Q . I $D(BMXFF(F,"IEN")) S BMXRET="S D0=0 F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:D0>"_BMXV_" Q:BMXM>BMXXMAX " Q . N BMXTMP . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV))" . S @BMXTMP . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " ; I BMXOP="<" D Q . I $D(BMXFF(F,"IEN")) S BMXRET="S D0=0 F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:D0'<"_BMXV_" Q:BMXM>BMXXMAX " Q . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " ; I BMXOP="BETWEEN" D Q ;changed '< to > (inclusive BETWEEN) . I $D(BMXFF(F,"IEN")) D Q . . S BMXRET="S D0="_(+$P(BMXV,"~")-1)_" F S D0=$O("_BMXGL_"D0)) Q:'+D0 Q:D0>"_$P(BMXV,"~",2)_" Q:BMXM>BMXXMAX " . I +$P(BMXV,"~")=$P(BMXV,"~") D ;BMXV is a number . . S BMXRET="S BMXV="_$P(BMXV,"~")_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV>"_$P(BMXV,"~",2)_" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " . E D ;BMXV is a string . . S BMXRET="S BMXV="_Q_$P(BMXV,"~")_Q_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV]"_Q_$P(BMXV,"~",2)_Q_" Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " ; I BMXOP="LIKE" D Q . N BMXTMP,BMXV1 . S BMXV1=BMXV . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)" . S @BMXTMP . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXV'?1"_Q_BMXV1_Q_".E Q:BMXM>BMXXMAX S D0="""" F S D0=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D0)) Q:D0="""" Q:BMXM>BMXXMAX " Q ; BLDIT2 ;Pointer N BMXPS,J S BMXPS=$O(BMXPFP(F,999),-1) S BMXNOD=BMXPFP(F,BMXPS) S BMXGL=$P(BMXNOD,U,7,8) I BMXOP="=" D . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) . S BMXRET="S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_","_Q_BMXV_Q_",D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " ; I BMXOP=">" D . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " ; I BMXOP=">=" D . N BMXTMP . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)" . S @BMXTMP . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " ; I BMXOP="<=" D . N BMXTMP . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV))" . S @BMXTMP . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " ; I BMXOP="<>" D . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) . S BMXRET="S BMXV=0 F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXM>BMXXMAX I BMXV'="_Q_BMXV_Q_" S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " ; I BMXOP="<" D . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) Q:BMXV="""" Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " ; I BMXOP="BETWEEN" D . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) . I +$P(BMXV,"~")=$P(BMXV,"~") D ;BMXV is a number . . S BMXRET="S BMXV="_$P(BMXV,"~")_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV>"_$P(BMXV,"~",2)_" Q:BMXM>BMXXMAX S D"_BMXPS_"=0 F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " . E D ;BMXV is a string . . S BMXRET="S BMXV="_Q_$P(BMXV,"~")_Q_",BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1) F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q . . S BMXRET=BMXRET_",BMXV)) Q:BMXV="""" Q:BMXV]"_Q_$P(BMXV,"~",2)_Q_" Q:BMXM>BMXXMAX S D"_BMXPS_"=0 F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " ; I BMXOP="LIKE" D . N BMXTMP,BMXV1 . S BMXRNAM=$P(BMXPFP(F,BMXPS,1),U,2) . S BMXV1=BMXV . S BMXTMP="BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV),-1)" . S @BMXTMP . S BMXRET="S BMXV="_Q_BMXV_Q_" F S BMXV=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV)) Q:BMXV="""" Q:BMXV'?1"_Q_BMXV1_Q_".E Q:BMXM>BMXXMAX S D"_BMXPS_"="""" F S D"_BMXPS_"=$O("_BMXGL_Q_BMXRNAM_Q_",BMXV,D"_BMXPS_")) Q:'+D"_BMXPS_" Q:BMXM>BMXXMAX " ; F J=BMXPS-1:-1:0 D . S BMXNOD=BMXPFP(F,J) . S BMXGL=$P(BMXNOD,U,7,8) . S BMXRNAM=$P(BMXPFP(F,J,1),U,2) . S BMXRET=BMXRET_"S D"_J_"=0 F S D"_J_"=$O("_BMXGL_Q_BMXRNAM_Q_",D"_(J+1)_",D"_J_")) Q:'+D"_J_" Q:BMXM>BMXXMAX " Q ;TODO: Computed fields ;TODO: Sets of codes ;TODO: User-specified index Q