diff --git a/all.sas b/all.sas index 5a4b3de..c878fa5 100644 --- a/all.sas +++ b/all.sas @@ -4004,10 +4004,12 @@ proc sql; %end; %if &libds=0 %then %do; + proc sql; describe table &syslast; drop table &syslast; %end; -%mend mp_coretable;/** +%mend mp_coretable; +/** @file mp_createconstraints.sas @brief Creates constraints @details Takes the output from mp_getconstraints.sas as input @@ -4782,7 +4784,7 @@ drop table &out_ds; Usage: - %mp_ds2cards(base_ds=sashelp.class + %mp_ds2cards(sashelp.class , tgt_ds=work.class , cards_file= "C:\temp\class.sas" , showlog=NO @@ -4794,7 +4796,7 @@ drop table &out_ds; - explicity setting a unix LF - constraints / indexes etc - @param [in] base_ds= Should be two level - eg work.blah. This is the table + @param [in] base_ds Should be two level - eg work.blah. This is the table that is converted to a cards file. @param [in] tgt_ds= Table that the generated cards file would create. Optional - if omitted, will be same as BASE_DS. @@ -5892,7 +5894,36 @@ data &outds; /*length GROUP_LOGIC SUBGROUP_LOGIC $3 SUBGROUP_ID 8 VARIABLE_NM $32 OPERATOR_NM $10 RAW_VALUE $4000;*/ set &inds; - length reason_cd $4032; + length reason_cd $4032 vtype $1 vnum dsid 8; + + /* quick check to ensure column exists */ + if upcase(VARIABLE_NM) not in + (%upcase(%mf_getvarlist(&targetds,dlm=%str(,),quote=SINGLE))) + then do; + REASON_CD="Variable "!!cats(variable_nm)!!" not in &targetds"; + putlog REASON_CD= VARIABLE_NM=; + call symputx('reason_cd',reason_cd,'l'); + call symputx('nobs',_n_,'l'); + output; + return; + end; + + /* need to open the dataset to get the column type */ + dsid=open("&targetds","i"); + if dsid>0 then do; + vnum=varnum(dsid,VARIABLE_NM); + if vnum<1 then do; + /* should not happen as was also tested for above */ + REASON_CD=cats("Variable (",VARIABLE_NM,") not found in &targetds"); + putlog REASON_CD= dsid=; + call symputx('reason_cd',reason_cd,'l'); + call symputx('nobs',_n_,'l'); + output; + return; + end; + /* now we can get the type */ + else vtype=vartype(dsid,vnum); + end; /* closed list checks */ if GROUP_LOGIC not in ('AND','OR') then do; @@ -5916,17 +5947,8 @@ data &outds; call symputx('nobs',_n_,'l'); output; end; - if upcase(VARIABLE_NM) not in - (%upcase(%mf_getvarlist(&targetds,dlm=%str(,),quote=SINGLE))) - then do; - REASON_CD="Variable "!!cats(variable_nm)!!" not in &targetds"; - putlog REASON_CD= VARIABLE_NM=; - call symputx('reason_cd',reason_cd,'l'); - call symputx('nobs',_n_,'l'); - output; - end; if OPERATOR_NM not in - ('=','>','<','<=','>=','BETWEEN','IN','NOT IN','NE','CONTAINS','GE','LE') + ('=','>','<','<=','>=','NE','GE','LE','BETWEEN','IN','NOT IN','CONTAINS') then do; REASON_CD='Invalid OPERATOR_NM: '!!cats(OPERATOR_NM); putlog REASON_CD= OPERATOR_NM=; @@ -5935,6 +5957,18 @@ data &outds; output; end; + /* special missing logic */ + if vtype='N' + and OPERATOR_NM in ('=','>','<','<=','>=','NE','GE','LE') + and cats(upcase(raw_value)) in ( + '.','.A','.B','.C','.D','.E','.F','.G','.H','.I','.J','.K','.L','.M','.N' + '.N','.O','.P','.Q','.R','.S','.T','.U','.V','.W','.X','.Y','.Z','._' + ) + then do; + /* valid numeric - exit data step loop */ + return; + end; + /* special logic */ if OPERATOR_NM='BETWEEN' then raw_value1=tranwrd(raw_value,' AND ',''); else if OPERATOR_NM in ('IN','NOT IN') then do; @@ -6088,6 +6122,9 @@ filename &outref temp; run; %end; %else %do; + proc sort data=&inds; + by SUBGROUP_ID; + run; data _null_; file &outref lrecl=32800; set &inds end=last; @@ -8359,7 +8396,11 @@ run; %put %str(ERR)OR: Dataset &libds is not a dataset; %end; %else %do; - data &outds(rename=(&keyvar=hashkey) keep=&keyvar)/nonote2err; + data &outds(rename=(&keyvar=hashkey) keep=&keyvar) + %if "%substr(&sysver,1,1)" ne "4" and "%substr(&sysver,1,1)" ne "5" %then %do; + /nonote2err + %end; + ; length &prevkeyvar &keyvar $32; retain &prevkeyvar "%sysfunc(md5(%str(&salt)),$hex32.)"; set &libds end=&lastvar; @@ -13040,11 +13081,21 @@ ods package close; oldval_num num format=best32. label='Old (numeric) value', newval_num num format=best32. label='New (numeric) value', oldval_char char(32765) label='Old (character) value', - newval_char char(32765) label='New (character) value', - constraint pk_mpe_audit - primary key(load_ref,libref,dsn,key_hash,tgtvar_nm) + newval_char char(32765) label='New (character) value' ); + %local lib; + %let libds=%upcase(&libds); + %if %index(&libds,.)=0 %then %let lib=WORK; + %else %let lib=%scan(&libds,1,.); + + proc datasets lib=&lib noprint; + modify %scan(&libds,-1,.); + index create + pk_mpe_audit=(load_ref libref dsn key_hash tgtvar_nm) + /nomiss unique; + quit; + %mend mddl_dc_difftable;/** @file @brief Filtertable DDL @@ -13056,21 +13107,34 @@ ods package close; %macro mddl_dc_filterdetail(libds=WORK.FILTER_DETAIL); +%local nn lib; +%if "%substr(&sysver,1,1)" ne "4" and "%substr(&sysver,1,1)" ne "5" %then %do; + %let nn=not null; +%end; +%else %let nn=; + proc sql; create table &libds( - filter_hash char(32) not null, - filter_line num not null, - group_logic char(3) not null, - subgroup_logic char(3) not null, - subgroup_id num not null, - variable_nm varchar(32) not null, - operator_nm varchar(12) not null, - raw_value varchar(4000) not null, - processed_dttm num not null format=E8601DT26.6, - constraint pk_mpe_filteranytable - primary key(filter_hash,filter_line) + filter_hash char(32) &nn, + filter_line num &nn, + group_logic char(3) &nn, + subgroup_logic char(3) &nn, + subgroup_id num &nn, + variable_nm varchar(32) &nn, + operator_nm varchar(12) &nn, + raw_value varchar(4000) &nn, + processed_dttm num &nn format=E8601DT26.6 ); + %let libds=%upcase(&libds); + %if %index(&libds,.)=0 %then %let lib=WORK; + %else %let lib=%scan(&libds,1,.); + + proc datasets lib=&lib noprint; + modify %scan(&libds,-1,.); + index create pk_mpe_filterdetail=(filter_hash filter_line)/nomiss unique; + quit; + %mend mddl_dc_filterdetail;/** @file @brief Filtersummary DDL @@ -13082,16 +13146,29 @@ ods package close; %macro mddl_dc_filtersummary(libds=WORK.FILTER_SUMMARY); +%local nn lib; +%if "%substr(&sysver,1,1)" ne "4" and "%substr(&sysver,1,1)" ne "5" %then %do; + %let nn=not null; +%end; +%else %let nn=; + proc sql; create table &libds( - filter_rk num not null, - filter_hash char(32) not null, - filter_table char(41) not null, - processed_dttm num not null format=E8601DT26.6, - constraint pk_mpe_filteranytable - primary key(filter_rk) + filter_rk num &nn, + filter_hash char(32) &nn, + filter_table char(41) &nn, + processed_dttm num &nn format=E8601DT26.6 ); + %let libds=%upcase(&libds); + %if %index(&libds,.)=0 %then %let lib=WORK; + %else %let lib=%scan(&libds,1,.); + + proc datasets lib=&lib noprint; + modify %scan(&libds,-1,.); + index create filter_rk /nomiss unique; + quit; + %mend mddl_dc_filtersummary;/** @file @brief Locktable DDL @@ -13103,19 +13180,35 @@ ods package close; %macro mddl_dc_locktable(libds=WORK.LOCKTABLE); +%local nn lib; +%if "%substr(&sysver,1,1)" ne "4" and "%substr(&sysver,1,1)" ne "5" %then %do; + %let nn=not null; +%end; +%else %let nn=; + proc sql; create table &libds( lock_lib char(8), lock_ds char(32), - lock_status_cd char(10) not null, - lock_user_nm char(100) not null , + lock_status_cd char(10) &nn, + lock_user_nm char(100) &nn , lock_ref char(200), lock_pid char(10), lock_start_dttm num format=E8601DT26.6, - lock_end_dttm num format=E8601DT26.6, - constraint pk_mp_lockanytable primary key(lock_lib,lock_ds) + lock_end_dttm num format=E8601DT26.6 ); + %let libds=%upcase(&libds); + %if %index(&libds,.)=0 %then %let lib=WORK; + %else %let lib=%scan(&libds,1,.); + + proc datasets lib=&lib noprint; + modify %scan(&libds,-1,.); + index create + pk_mp_lockanytable=(lock_lib lock_ds) + /nomiss unique; + quit; + %mend mddl_dc_locktable;/** @file @brief Maxkeytable DDL @@ -13135,9 +13228,18 @@ ods package close; max_key num label= 'Integer representing current max RK or SK value in the KEYTABLE', processed_dttm num format=E8601DT26.6 - label='Datetime this value was last updated', - constraint pk_mpe_maxkeyvalues - primary key(keytable)); + label='Datetime this value was last updated' + ); + + %local lib; + %let libds=%upcase(&libds); + %if %index(&libds,.)=0 %then %let lib=WORK; + %else %let lib=%scan(&libds,1,.); + + proc datasets lib=&lib noprint; + modify %scan(&libds,-1,.); + index create keytable /nomiss unique; + quit; %mend mddl_dc_maxkeytable;/** @file diff --git a/base/mp_coretable.sas b/base/mp_coretable.sas index 76e786e..57e9c78 100644 --- a/base/mp_coretable.sas +++ b/base/mp_coretable.sas @@ -65,7 +65,8 @@ proc sql; %end; %if &libds=0 %then %do; + proc sql; describe table &syslast; drop table &syslast; %end; -%mend mp_coretable; \ No newline at end of file +%mend mp_coretable; diff --git a/base/mp_ds2cards.sas b/base/mp_ds2cards.sas index de2c455..1260202 100644 --- a/base/mp_ds2cards.sas +++ b/base/mp_ds2cards.sas @@ -11,7 +11,7 @@ Usage: - %mp_ds2cards(base_ds=sashelp.class + %mp_ds2cards(sashelp.class , tgt_ds=work.class , cards_file= "C:\temp\class.sas" , showlog=NO @@ -23,7 +23,7 @@ - explicity setting a unix LF - constraints / indexes etc - @param [in] base_ds= Should be two level - eg work.blah. This is the table + @param [in] base_ds Should be two level - eg work.blah. This is the table that is converted to a cards file. @param [in] tgt_ds= Table that the generated cards file would create. Optional - if omitted, will be same as BASE_DS. diff --git a/base/mp_filtercheck.sas b/base/mp_filtercheck.sas index 94e1120..69c5cd2 100644 --- a/base/mp_filtercheck.sas +++ b/base/mp_filtercheck.sas @@ -92,7 +92,36 @@ data &outds; /*length GROUP_LOGIC SUBGROUP_LOGIC $3 SUBGROUP_ID 8 VARIABLE_NM $32 OPERATOR_NM $10 RAW_VALUE $4000;*/ set &inds; - length reason_cd $4032; + length reason_cd $4032 vtype $1 vnum dsid 8; + + /* quick check to ensure column exists */ + if upcase(VARIABLE_NM) not in + (%upcase(%mf_getvarlist(&targetds,dlm=%str(,),quote=SINGLE))) + then do; + REASON_CD="Variable "!!cats(variable_nm)!!" not in &targetds"; + putlog REASON_CD= VARIABLE_NM=; + call symputx('reason_cd',reason_cd,'l'); + call symputx('nobs',_n_,'l'); + output; + return; + end; + + /* need to open the dataset to get the column type */ + dsid=open("&targetds","i"); + if dsid>0 then do; + vnum=varnum(dsid,VARIABLE_NM); + if vnum<1 then do; + /* should not happen as was also tested for above */ + REASON_CD=cats("Variable (",VARIABLE_NM,") not found in &targetds"); + putlog REASON_CD= dsid=; + call symputx('reason_cd',reason_cd,'l'); + call symputx('nobs',_n_,'l'); + output; + return; + end; + /* now we can get the type */ + else vtype=vartype(dsid,vnum); + end; /* closed list checks */ if GROUP_LOGIC not in ('AND','OR') then do; @@ -116,17 +145,8 @@ data &outds; call symputx('nobs',_n_,'l'); output; end; - if upcase(VARIABLE_NM) not in - (%upcase(%mf_getvarlist(&targetds,dlm=%str(,),quote=SINGLE))) - then do; - REASON_CD="Variable "!!cats(variable_nm)!!" not in &targetds"; - putlog REASON_CD= VARIABLE_NM=; - call symputx('reason_cd',reason_cd,'l'); - call symputx('nobs',_n_,'l'); - output; - end; if OPERATOR_NM not in - ('=','>','<','<=','>=','BETWEEN','IN','NOT IN','NE','CONTAINS','GE','LE') + ('=','>','<','<=','>=','NE','GE','LE','BETWEEN','IN','NOT IN','CONTAINS') then do; REASON_CD='Invalid OPERATOR_NM: '!!cats(OPERATOR_NM); putlog REASON_CD= OPERATOR_NM=; @@ -135,6 +155,18 @@ data &outds; output; end; + /* special missing logic */ + if vtype='N' + and OPERATOR_NM in ('=','>','<','<=','>=','NE','GE','LE') + and cats(upcase(raw_value)) in ( + '.','.A','.B','.C','.D','.E','.F','.G','.H','.I','.J','.K','.L','.M','.N' + '.N','.O','.P','.Q','.R','.S','.T','.U','.V','.W','.X','.Y','.Z','._' + ) + then do; + /* valid numeric - exit data step loop */ + return; + end; + /* special logic */ if OPERATOR_NM='BETWEEN' then raw_value1=tranwrd(raw_value,' AND ',''); else if OPERATOR_NM in ('IN','NOT IN') then do; diff --git a/base/mp_filtergenerate.sas b/base/mp_filtergenerate.sas index 3280460..7acac88 100644 --- a/base/mp_filtergenerate.sas +++ b/base/mp_filtergenerate.sas @@ -84,6 +84,9 @@ filename &outref temp; run; %end; %else %do; + proc sort data=&inds; + by SUBGROUP_ID; + run; data _null_; file &outref lrecl=32800; set &inds end=last; diff --git a/base/mp_hashdataset.sas b/base/mp_hashdataset.sas index c0ad40d..0cf88e8 100644 --- a/base/mp_hashdataset.sas +++ b/base/mp_hashdataset.sas @@ -69,7 +69,11 @@ %put %str(ERR)OR: Dataset &libds is not a dataset; %end; %else %do; - data &outds(rename=(&keyvar=hashkey) keep=&keyvar)/nonote2err; + data &outds(rename=(&keyvar=hashkey) keep=&keyvar) + %if "%substr(&sysver,1,1)" ne "4" and "%substr(&sysver,1,1)" ne "5" %then %do; + /nonote2err + %end; + ; length &prevkeyvar &keyvar $32; retain &prevkeyvar "%sysfunc(md5(%str(&salt)),$hex32.)"; set &libds end=&lastvar; diff --git a/ddl/mddl_dc_difftable.sas b/ddl/mddl_dc_difftable.sas index 78265e0..e77fb72 100644 --- a/ddl/mddl_dc_difftable.sas +++ b/ddl/mddl_dc_difftable.sas @@ -26,9 +26,19 @@ oldval_num num format=best32. label='Old (numeric) value', newval_num num format=best32. label='New (numeric) value', oldval_char char(32765) label='Old (character) value', - newval_char char(32765) label='New (character) value', - constraint pk_mpe_audit - primary key(load_ref,libref,dsn,key_hash,tgtvar_nm) + newval_char char(32765) label='New (character) value' ); + %local lib; + %let libds=%upcase(&libds); + %if %index(&libds,.)=0 %then %let lib=WORK; + %else %let lib=%scan(&libds,1,.); + + proc datasets lib=&lib noprint; + modify %scan(&libds,-1,.); + index create + pk_mpe_audit=(load_ref libref dsn key_hash tgtvar_nm) + /nomiss unique; + quit; + %mend mddl_dc_difftable; \ No newline at end of file diff --git a/ddl/mddl_dc_filterdetail.sas b/ddl/mddl_dc_filterdetail.sas index a49ac9d..5349dd4 100644 --- a/ddl/mddl_dc_filterdetail.sas +++ b/ddl/mddl_dc_filterdetail.sas @@ -9,19 +9,32 @@ %macro mddl_dc_filterdetail(libds=WORK.FILTER_DETAIL); +%local nn lib; +%if "%substr(&sysver,1,1)" ne "4" and "%substr(&sysver,1,1)" ne "5" %then %do; + %let nn=not null; +%end; +%else %let nn=; + proc sql; create table &libds( - filter_hash char(32) not null, - filter_line num not null, - group_logic char(3) not null, - subgroup_logic char(3) not null, - subgroup_id num not null, - variable_nm varchar(32) not null, - operator_nm varchar(12) not null, - raw_value varchar(4000) not null, - processed_dttm num not null format=E8601DT26.6, - constraint pk_mpe_filteranytable - primary key(filter_hash,filter_line) + filter_hash char(32) &nn, + filter_line num &nn, + group_logic char(3) &nn, + subgroup_logic char(3) &nn, + subgroup_id num &nn, + variable_nm varchar(32) &nn, + operator_nm varchar(12) &nn, + raw_value varchar(4000) &nn, + processed_dttm num &nn format=E8601DT26.6 ); + %let libds=%upcase(&libds); + %if %index(&libds,.)=0 %then %let lib=WORK; + %else %let lib=%scan(&libds,1,.); + + proc datasets lib=&lib noprint; + modify %scan(&libds,-1,.); + index create pk_mpe_filterdetail=(filter_hash filter_line)/nomiss unique; + quit; + %mend mddl_dc_filterdetail; \ No newline at end of file diff --git a/ddl/mddl_dc_filtersummary.sas b/ddl/mddl_dc_filtersummary.sas index 55b04fb..b295f5f 100644 --- a/ddl/mddl_dc_filtersummary.sas +++ b/ddl/mddl_dc_filtersummary.sas @@ -9,14 +9,27 @@ %macro mddl_dc_filtersummary(libds=WORK.FILTER_SUMMARY); +%local nn lib; +%if "%substr(&sysver,1,1)" ne "4" and "%substr(&sysver,1,1)" ne "5" %then %do; + %let nn=not null; +%end; +%else %let nn=; + proc sql; create table &libds( - filter_rk num not null, - filter_hash char(32) not null, - filter_table char(41) not null, - processed_dttm num not null format=E8601DT26.6, - constraint pk_mpe_filteranytable - primary key(filter_rk) + filter_rk num &nn, + filter_hash char(32) &nn, + filter_table char(41) &nn, + processed_dttm num &nn format=E8601DT26.6 ); + %let libds=%upcase(&libds); + %if %index(&libds,.)=0 %then %let lib=WORK; + %else %let lib=%scan(&libds,1,.); + + proc datasets lib=&lib noprint; + modify %scan(&libds,-1,.); + index create filter_rk /nomiss unique; + quit; + %mend mddl_dc_filtersummary; \ No newline at end of file diff --git a/ddl/mddl_dc_locktable.sas b/ddl/mddl_dc_locktable.sas index bd3ecd7..da1fd0b 100644 --- a/ddl/mddl_dc_locktable.sas +++ b/ddl/mddl_dc_locktable.sas @@ -9,17 +9,33 @@ %macro mddl_dc_locktable(libds=WORK.LOCKTABLE); +%local nn lib; +%if "%substr(&sysver,1,1)" ne "4" and "%substr(&sysver,1,1)" ne "5" %then %do; + %let nn=not null; +%end; +%else %let nn=; + proc sql; create table &libds( lock_lib char(8), lock_ds char(32), - lock_status_cd char(10) not null, - lock_user_nm char(100) not null , + lock_status_cd char(10) &nn, + lock_user_nm char(100) &nn , lock_ref char(200), lock_pid char(10), lock_start_dttm num format=E8601DT26.6, - lock_end_dttm num format=E8601DT26.6, - constraint pk_mp_lockanytable primary key(lock_lib,lock_ds) + lock_end_dttm num format=E8601DT26.6 ); + %let libds=%upcase(&libds); + %if %index(&libds,.)=0 %then %let lib=WORK; + %else %let lib=%scan(&libds,1,.); + + proc datasets lib=&lib noprint; + modify %scan(&libds,-1,.); + index create + pk_mp_lockanytable=(lock_lib lock_ds) + /nomiss unique; + quit; + %mend mddl_dc_locktable; \ No newline at end of file diff --git a/ddl/mddl_dc_maxkeytable.sas b/ddl/mddl_dc_maxkeytable.sas index 163b8ff..583b691 100644 --- a/ddl/mddl_dc_maxkeytable.sas +++ b/ddl/mddl_dc_maxkeytable.sas @@ -17,8 +17,17 @@ max_key num label= 'Integer representing current max RK or SK value in the KEYTABLE', processed_dttm num format=E8601DT26.6 - label='Datetime this value was last updated', - constraint pk_mpe_maxkeyvalues - primary key(keytable)); + label='Datetime this value was last updated' + ); + + %local lib; + %let libds=%upcase(&libds); + %if %index(&libds,.)=0 %then %let lib=WORK; + %else %let lib=%scan(&libds,1,.); + + proc datasets lib=&lib noprint; + modify %scan(&libds,-1,.); + index create keytable /nomiss unique; + quit; %mend mddl_dc_maxkeytable; \ No newline at end of file diff --git a/main.dox b/main.dox index 0da9e3b..33459d7 100644 --- a/main.dox +++ b/main.dox @@ -92,4 +92,15 @@ * Auto-generated from the plain source `.lua` files in the same directory * Prefixes: _ml_ +*/ + +/*! \dir ddl + * \brief Data Definition Language files + * \details Provides templates for commonly used tables in sasjs/core. + Attributes: + + * OS independent + * No X command + * Prefixes: _mddl_ + */ \ No newline at end of file diff --git a/sasjs/sasjsconfig.json b/sasjs/sasjsconfig.json index cbc925f..b75b68d 100644 --- a/sasjs/sasjsconfig.json +++ b/sasjs/sasjsconfig.json @@ -65,7 +65,7 @@ }, { "name": "server", - "serverUrl": "", + "serverUrl": "https://sas.analytium.co.uk:5007", "serverType": "SASJS", "httpsAgentOptions": { "allowInsecureRequests": false @@ -105,4 +105,4 @@ "contextName": "SAS Job Execution compute context" } ] -} \ No newline at end of file +} diff --git a/tests/crossplatform/mp_filtercheck.test.sas b/tests/crossplatform/mp_filtercheck.test.sas index d9acc96..49d5b04 100644 --- a/tests/crossplatform/mp_filtercheck.test.sas +++ b/tests/crossplatform/mp_filtercheck.test.sas @@ -6,11 +6,39 @@ @li mp_filtercheck.sas @li mp_assertdsobs.sas @li mp_assert.sas + @li mp_assertscope.sas **/ +/* set up test data */ +data work.class ; +length name $8 sex $1 age height weight 8; +infile cards dsd; +input Name:$char. Sex :$char. Age Height Weight; +datalines4; +Alfred,M,14,69,112.5 +Alice,F,13,56.5,84 +Barbara,F,13,65.3,98 +Carol,F,14,62.8,102.5 +Henry,M,14,63.5,102.5 +James,M,12,57.3,83 +Jane,F,12,59.8,84.5 +Janet,F,15,62.5,112.5 +Jeffrey,M,13,62.5,84 +John,M,12,59,99.5 +Joyce,F,11,51.3,50.5 +Judy,F,14,64.3,90 +Louise,F,12,56.3,77 +Mary,F,15,66.5,112 +Philip,M,16,72,150 +Robert,M,12,64.8,128 +Ronald,M,15,67,133 +Thomas,M,11,57.5,85 +William,M,15,66.5,112 +;;;; +run; -/* valid filter */ +/* valid filter conditions */ data work.inds; infile datalines4 dsd; input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32. @@ -21,14 +49,19 @@ AND,AND,1,SEX,<=,"'M'" AND,OR,2,Name,NOT IN,"('Jane','Alfred')" AND,OR,2,Weight,>=,77.7 AND,OR,2,Weight,NE,77.7 +AND,AND,1,age,=,.A +AND,AND,1,height,<,.B ;;;; run; +%mp_assertscope(SNAPSHOT) %mp_filtercheck(work.inds, - targetds=sashelp.class, + targetds=work.class, outds=work.badrecords, abort=NO ) +%mp_assertscope(COMPARE) + %let syscc=0; %mp_assertdsobs(work.badrecords, desc=Valid filter query, @@ -49,7 +82,7 @@ AND,OR,2,Weight,>=,7 ;;;; run; %mp_filtercheck(work.inds, - targetds=sashelp.class, + targetds=work.class, outds=work.badrecords, abort=NO ) @@ -71,7 +104,7 @@ AND,OR,2,Name,NOT IN,"(''''Jane','Alfred')" run; %mp_filtercheck(work.inds, - targetds=sashelp.class, + targetds=work.class, outds=work.badrecords, abort=NO ) @@ -94,7 +127,7 @@ AND,OR,2,Weight,>=,7 run; %mp_filtercheck(work.inds, - targetds=sashelp.class, + targetds=work.class, outds=work.badrecords, abort=NO ) @@ -115,7 +148,7 @@ AND,AND,1,age,=,;;%abort ;;;; run; %mp_filtercheck(work.inds, - targetds=sashelp.class, + targetds=work.class, outds=work.badrecords, abort=NO ) @@ -137,7 +170,7 @@ AND,AND,1,age,=,0 run; %let syscc=0; %mp_filtercheck(work.inds, - targetds=sashelp.class, + targetds=work.class, outds=work.badrecords, abort=NO ) diff --git a/tests/crossplatform/mp_filtergenerate.test.sas b/tests/crossplatform/mp_filtergenerate.test.sas index 5464b84..54112f5 100644 --- a/tests/crossplatform/mp_filtergenerate.test.sas +++ b/tests/crossplatform/mp_filtergenerate.test.sas @@ -11,6 +11,34 @@ options source2; +/* set up test data */ +data work.class ; +length name $8 sex $1 age height weight 8; +infile cards dsd; +input Name:$char. Sex :$char. Age Height Weight; +datalines4; +Alfred,M,14,69,112.5 +Alice,F,13,56.5,84 +Barbara,F,13,65.3,98 +Carol,F,14,62.8,102.5 +Henry,M,14,63.5,102.5 +James,M,12,57.3,83 +Jane,F,12,59.8,84.5 +Janet,F,15,62.5,112.5 +Jeffrey,M,13,62.5,84 +John,M,12,59,99.5 +Joyce,F,11,51.3,50.5 +Judy,F,14,64.3,90 +Louise,F,12,56.3,77 +Mary,F,15,66.5,112 +Philip,M,16,72,150 +Robert,M,12,64.8,128 +Ronald,M,15,67,133 +Thomas,M,11,57.5,85 +William,M,15,66.5,112 +;;;; +run; + /* valid filter */ data work.inds; infile datalines4 dsd; @@ -23,10 +51,10 @@ AND,OR,2,Name,NOT IN,"('Jane','Janet')" AND,OR,2,Weight,>=,84.6 ;;;; run; -%mp_filtercheck(work.inds,targetds=sashelp.class) +%mp_filtercheck(work.inds,targetds=work.class) %mp_filtergenerate(work.inds,outref=myfilter) data work.test; - set sashelp.class; + set work.class; where %inc myfilter;; run; %mp_assertdsobs(work.test, @@ -43,10 +71,10 @@ data work.inds; datalines4; ;;;; run; -%mp_filtercheck(work.inds,targetds=sashelp.class) +%mp_filtercheck(work.inds,targetds=work.class) %mp_filtergenerate(work.inds,outref=myfilter) data work.test; - set sashelp.class; + set work.class; where %inc myfilter;; run; %mp_assertdsobs(work.test, @@ -64,10 +92,10 @@ datalines4; AND,OR,2,Name,IN,"('Jane','Janet')" ;;;; run; -%mp_filtercheck(work.inds,targetds=sashelp.class) +%mp_filtercheck(work.inds,targetds=work.class) %mp_filtergenerate(work.inds,outref=myfilter) data work.test; - set sashelp.class; + set work.class; where %inc myfilter;; run; %mp_assertdsobs(work.test, @@ -86,10 +114,10 @@ OR,OR,2,Name,IN,"('Jane','Janet')" OR,OR,3,Name,IN,"('James')" ;;;; run; -%mp_filtercheck(work.inds,targetds=sashelp.class) +%mp_filtercheck(work.inds,targetds=work.class) %mp_filtergenerate(work.inds,outref=myfilter) data work.test; - set sashelp.class; + set work.class; where %inc myfilter;; run; %mp_assertdsobs(work.test, @@ -108,10 +136,10 @@ AND,OR,2,Name,IN,"('Jane','Janet')" AND,OR,3,Name,IN,"('James')" ;;;; run; -%mp_filtercheck(work.inds,targetds=sashelp.class) +%mp_filtercheck(work.inds,targetds=work.class) %mp_filtergenerate(work.inds,outref=myfilter) data work.test; - set sashelp.class; + set work.class; where %inc myfilter;; run; %mp_assertdsobs(work.test, diff --git a/tests/crossplatform/mp_filterstore.test.1.sas b/tests/crossplatform/mp_filterstore.test.1.sas index d8a867c..49808e1 100644 --- a/tests/crossplatform/mp_filterstore.test.1.sas +++ b/tests/crossplatform/mp_filterstore.test.1.sas @@ -10,6 +10,34 @@ **/ +/* set up test data */ +data work.class ; +length name $8 sex $1 age height weight 8; +infile cards dsd; +input Name:$char. Sex :$char. Age Height Weight; +datalines4; +Alfred,M,14,69,112.5 +Alice,F,13,56.5,84 +Barbara,F,13,65.3,98 +Carol,F,14,62.8,102.5 +Henry,M,14,63.5,102.5 +James,M,12,57.3,83 +Jane,F,12,59.8,84.5 +Janet,F,15,62.5,112.5 +Jeffrey,M,13,62.5,84 +John,M,12,59,99.5 +Joyce,F,11,51.3,50.5 +Judy,F,14,64.3,90 +Louise,F,12,56.3,77 +Mary,F,15,66.5,112 +Philip,M,16,72,150 +Robert,M,12,64.8,128 +Ronald,M,15,67,133 +Thomas,M,11,57.5,85 +William,M,15,66.5,112 +;;;; +run; + libname permlib (work); %mp_coretable(LOCKTABLE,libds=permlib.locktable) @@ -31,7 +59,7 @@ AND,OR,2,Weight,NE,77.7 ;;;; run; -%mp_filterstore(libds=sashelp.class, +%mp_filterstore(libds=work.class, queryds=work.inds, filter_summary=permlib.filtsum, filter_detail=permlib.filtdet, @@ -60,7 +88,7 @@ select max(filter_rk) into: test1 from work.result; ) /* Test 2 - load same table again and ensure we get the same RK */ -%mp_filterstore(libds=sashelp.class, +%mp_filterstore(libds=work.class, queryds=work.inds, filter_summary=permlib.filtsum, filter_detail=permlib.filtdet, diff --git a/tests/crossplatform/mp_filtervalidate.test.sas b/tests/crossplatform/mp_filtervalidate.test.sas index 64d367e..596abdb 100644 --- a/tests/crossplatform/mp_filtervalidate.test.sas +++ b/tests/crossplatform/mp_filtervalidate.test.sas @@ -7,9 +7,36 @@ @li mp_filtervalidate.sas @li mp_assertdsobs.sas @li mp_assert.sas + @li mp_assertscope.sas **/ +data work.class ; +length name $8 sex $1 age height weight 8; +infile cards dsd; +input Name:$char. Sex :$char. Age Height Weight; +datalines4; +Alfred,M,14,69,112.5 +Alice,F,13,56.5,84 +Barbara,F,13,65.3,98 +Carol,F,14,62.8,102.5 +Henry,M,14,63.5,102.5 +James,M,12,57.3,83 +Jane,F,12,59.8,84.5 +Janet,F,15,62.5,112.5 +Jeffrey,M,13,62.5,84 +John,M,12,59,99.5 +Joyce,F,11,51.3,50.5 +Judy,F,14,64.3,90 +Louise,F,12,56.3,77 +Mary,F,15,66.5,112 +Philip,M,16,72,150 +Robert,M,12,64.8,128 +Ronald,M,15,67,133 +Thomas,M,11,57.5,85 +William,M,15,66.5,112 +;;;; +run; /* valid filter */ data work.inds; @@ -21,10 +48,16 @@ AND,AND,1,AGE,>,5 AND,AND,1,SEX,NE,"'M'" AND,OR,2,Name,NOT IN,"('Jane','Janet')" AND,OR,2,Weight,>=,84.6 +AND,AND,3,age,=,.a +AND,AND,4,weight,NE,._ ;;;; run; %mp_filtergenerate(work.inds,outref=myfilter) -%mp_filtervalidate(myfilter,sashelp.class,outds=work.results,abort=NO) + +%mp_assertscope(SNAPSHOT) +%mp_filtervalidate(myfilter,work.class,outds=work.results,abort=NO) +%mp_assertscope(COMPARE) + %mp_assertdsobs(work.results, desc=Valid filter, test=EMPTY, @@ -40,7 +73,7 @@ datalines4; ;;;; run; %mp_filtergenerate(work.inds,outref=myfilter) -%mp_filtervalidate(myfilter,sashelp.class,outds=work.results,abort=NO) +%mp_filtervalidate(myfilter,work.class,outds=work.results,abort=NO) %mp_assertdsobs(work.results, desc=Empty filter, test=EMPTY, @@ -59,7 +92,7 @@ AND,AND,1,SEX,NE,2 ;;;; run; %mp_filtergenerate(work.inds,outref=myfilter) -%mp_filtervalidate(myfilter,sashelp.class,outds=work.results,abort=NO) +%mp_filtervalidate(myfilter,work.class,outds=work.results,abort=NO) %let syscc=0; %let test3=0; data _null_; @@ -84,7 +117,7 @@ AND,AND,1,age,NE,"'M'" ;;;; run; %mp_filtergenerate(work.inds,outref=myfilter) -%mp_filtervalidate(myfilter,sashelp.class,outds=work.results,abort=NO) +%mp_filtervalidate(myfilter,work.class,outds=work.results,abort=NO) %let syscc=0; %let test4=0; data _null_;