Like.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. //
  2. // Like.cs
  3. //
  4. // Author:
  5. // Juraj Skripsky ([email protected])
  6. //
  7. // (C) 2004 HotFeet GmbH (http://www.hotfeet.ch)
  8. //
  9. using System;
  10. using System.Collections;
  11. using System.Data;
  12. namespace Mono.Data.SqlExpressions {
  13. public class Like : UnaryExpression {
  14. string pattern;
  15. bool openStart, openEnd;
  16. public Like (IExpression e, string pattern) : base (e)
  17. {
  18. string original = pattern;
  19. int len = pattern.Length;
  20. openStart = (pattern[0] == '*' || pattern[0] == '%');
  21. openEnd = (pattern[len - 1] == '*' || pattern[len - 1] == '%');
  22. pattern = pattern.Trim ('*', '%');
  23. pattern = pattern.Replace ("[*]", "[[0]]");
  24. pattern = pattern.Replace ("[%]", "[[1]]");
  25. if (pattern.IndexOf('*') != -1 || pattern.IndexOf('%') != -1)
  26. throw new EvaluateException (String.Format ("Pattern '{0}' is invalid.", original));
  27. pattern = pattern.Replace ("[[0]]", "*");
  28. pattern = pattern.Replace ("[[1]]", "%");
  29. pattern = pattern.Replace ("[[]", "[");
  30. pattern = pattern.Replace ("[]]", "]");
  31. this.pattern = pattern;
  32. }
  33. override public object Eval (DataRow row)
  34. {
  35. string str = (string)expr.Eval (row);
  36. string pattern = this.pattern;
  37. if (!row.Table.CaseSensitive) {
  38. str = str.ToLower();
  39. pattern = pattern.ToLower();
  40. }
  41. int idx = str.IndexOf (pattern);
  42. if (idx == -1)
  43. return false;
  44. return (idx == 0 || openStart) && (idx + pattern.Length == str.Length || openEnd);
  45. }
  46. }
  47. }