BadWordSearch.ecl 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. //
  2. // Example code - use without restriction.
  3. //
  4. IMPORT std;
  5. SetBadWords := ['JUNK', 'GARBAGE', 'CRUD'];
  6. BadWordDS := DATASET(SetBadWords,{STRING10 word});
  7. SearchDS := DATASET([{1,'FRED','FLINTSTONE'},
  8. {2,'GEORGE','KRUEGER'},
  9. {3,'CRUDOLA','BAR'},
  10. {4,'JUNKER','KNIGHT'},
  11. {5,'GARBAGEGUY','MANGIA'},
  12. {6,'FREDDY','KRUEGER'},
  13. {7,'TIM','TINY'},
  14. {8,'JOHN','JONES'},
  15. {9,'MIKE','JETSON'}],
  16. {UNSIGNED6 ID,STRING10 firstname,STRING10 lastname});
  17. outrec := RECORD
  18. SearchDS.ID;
  19. SearchDS.firstname;
  20. BOOLEAN FoundWord;
  21. END;
  22. {BOOLEAN Found} FindWord(BadWordDS L, STRING10 inword) := TRANSFORM
  23. SELF.Found := Std.Str.Find(inword,TRIM(L.word),1)>0;
  24. END;
  25. outrec CheckWords(SearchDS L) := TRANSFORM
  26. SELF.FoundWord := EXISTS(PROJECT(BadWordDS,FindWord(LEFT,L.firstname))(Found=TRUE));
  27. SELF := L;
  28. END;
  29. result := PROJECT(SearchDS,CheckWords(LEFT));
  30. OUTPUT(result(FoundWord=TRUE));
  31. OUTPUT(result(FoundWord=FALSE));
  32. MAC_FindBadWords(BadWordSet,InFile,IDfld,SeekFld,ResAttr,MatchType=1) := MACRO
  33. #UNIQUENAME(BadWordDS)
  34. %BadWordDS% := DATASET(BadWordSet,{STRING word{MAXLENGTH(50)}});
  35. #UNIQUENAME(outrec)
  36. %outrec% := RECORD
  37. InFile.IDfld;
  38. InFile.SeekFld;
  39. BOOLEAN FoundWord := FALSE;
  40. UNSIGNED2 FoundPos := 0;
  41. END;
  42. #UNIQUENAME(ChkTbl)
  43. %ChkTbl% := TABLE(InFile,%outrec%);
  44. #UNIQUENAME(FindWord)
  45. {BOOLEAN Found,UNSIGNED2 FoundPos} %FindWord%(%BadWordDS% L,INTEGER C,STRING inword) := TRANSFORM
  46. #IF(MatchType=1) //"contains" search
  47. SELF.Found := Std.Str.Find(inword,TRIM(L.word),1) > 0;
  48. #END
  49. #IF(MatchType=2) //"exact match" search
  50. SELF.Found := inword = L.word;
  51. #END
  52. #IF(MatchType=3) //"starts with" search
  53. SELF.Found := Std.Str.Find(inword,TRIM(L.word),1) = 1;
  54. #END
  55. SELF.FoundPos := IF(SELF.FOUND=TRUE,C,0);
  56. END;
  57. #UNIQUENAME(CheckWords)
  58. %outrec% %CheckWords%(%ChkTbl% L) := TRANSFORM
  59. WordDS := PROJECT(%BadWordDS%,%FindWord%(LEFT,COUNTER,L.SeekFld));
  60. SELF.FoundWord := EXISTS(WordDS(Found=TRUE));
  61. SELF.FoundPos := WordDS(Found=TRUE)[1].FoundPos;
  62. SELF := L;
  63. END;
  64. ResAttr := PROJECT(%ChkTbl%,%CheckWords%(LEFT));
  65. ENDMACRO;
  66. MAC_FindBadWords(SetBadWords,SearchDS,ID,firstname,Results)
  67. OUTPUT(Results(FoundWord=TRUE));
  68. OUTPUT(Results(FoundWord=FALSE));
  69. SetCartoonFirstNames := ['GEORGE','FRED', 'FREDDY'];
  70. SetCartoonLastNames := ['JETSON','FLINTSTONE','KRUEGER'];
  71. MAC_FindBadWords(SetCartoonFirstNames,SearchDS,ID,firstname,Res1,2)
  72. MAC_FindBadWords(SetCartoonLastNames,SearchDS,ID,lastname,Res2,2)
  73. Cartoons := JOIN(Res1(FoundWord=TRUE),
  74. Res2(FoundWord=TRUE),
  75. LEFT.ID=RIGHT.ID AND LEFT.FoundPos=RIGHT.FoundPos);
  76. MAC_FindBadWords(SetBadWords,SearchDS,ID,firstname,Res3,3)
  77. MAC_FindBadWords(SetBadWords,SearchDS,ID,lastname,Res4)
  78. SetBadGuys := SET(Cartoons,ID) +
  79. SET(Res3(FoundWord=TRUE),ID) +
  80. SET(Res4(FoundWord=TRUE),ID);
  81. GoodGuys := SearchDS(ID NOT IN SetBadGuys);
  82. BadGuys := SearchDS(ID IN SetBadGuys);
  83. OUTPUT(BadGuys,NAMED('BadGuys'));
  84. OUTPUT(GoodGuys,NAMED('GoodGuys'));