1
0
mirror of https://github.com/sasjs/core.git synced 2025-12-11 06:24:35 +00:00

Merge pull request #238 from sasjs/allanbowe/mp-filtercheck-does-not-237

Updates to filtercheck macro (and tests)
This commit is contained in:
Allan Bowe
2022-05-11 15:46:02 +03:00
committed by GitHub
17 changed files with 445 additions and 109 deletions

186
all.sas
View File

@@ -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

View File

@@ -65,7 +65,8 @@ proc sql;
%end;
%if &libds=0 %then %do;
proc sql;
describe table &syslast;
drop table &syslast;
%end;
%mend mp_coretable;
%mend mp_coretable;

View File

@@ -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.

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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_
*/

View File

@@ -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"
}
]
}
}

View File

@@ -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
)

View File

@@ -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,

View File

@@ -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,

View File

@@ -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_;