/trunk/OpenQuarters.WebQuarters/OpenQuarters.WebQuarters.Core/Filter.cs

# · C# · 324 lines · 303 code · 16 blank · 5 comment · 45 complexity · ed8a7540bee9bf2e8fd0fc81a539bf67 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using OpenQuarters.WebQuarters.Utils;
  6. using System.ComponentModel;
  7. namespace OpenQuarters.WebQuarters.Core
  8. {
  9. [Serializable]
  10. public class Filter
  11. {
  12. private string id = null;
  13. public string Id
  14. {
  15. get
  16. {
  17. if (id == null)
  18. {
  19. id = Utils.GeneralUtils.GetGuid();
  20. }
  21. return id;
  22. }
  23. set { id = value; }
  24. }
  25. public string Field { get; set; }
  26. public string Operator { get; set; }
  27. public string Value { get; set; }
  28. /// <summary>
  29. /// This field has been depreciated, but has been maintained for backwards compatibility (as of v1.0.4)
  30. /// </summary>
  31. public Type Type { get; set; }
  32. public FilterOperator OperatorName
  33. {
  34. get
  35. {
  36. switch (this.Operator)
  37. {
  38. case "=":
  39. return FilterOperator.Equals;
  40. case "!=":
  41. return FilterOperator.Does_not_equal;
  42. case ">":
  43. return FilterOperator.More_than;
  44. case ">=":
  45. return FilterOperator.More_than_or_equal_to;
  46. case "<":
  47. return FilterOperator.Less_than;
  48. case "<=":
  49. return FilterOperator.Less_than_or_equal_to;
  50. case "%":
  51. return FilterOperator.Contains;
  52. case "!%":
  53. return FilterOperator.Does_not_contain;
  54. case "IN":
  55. return FilterOperator.In;
  56. default:
  57. return FilterOperator.Equals;
  58. }
  59. }
  60. }
  61. public string OperatorNameAsString
  62. {
  63. get
  64. {
  65. return OperatorName.ToString();
  66. }
  67. }
  68. public Filter()
  69. {
  70. this.Operator = "=";
  71. this.Value = "";
  72. //this.Type = typeof(string);
  73. }
  74. public Filter(string field, string value, string filterOperator)
  75. {
  76. this.Operator = filterOperator;
  77. this.Value = value;
  78. this.Field = field;
  79. //this.Type = type;
  80. }
  81. public bool Passes(object o)
  82. {
  83. bool b = false;
  84. var prop = o.GetType().GetProperty(this.Field);
  85. if (prop == null)
  86. {
  87. return b;
  88. }
  89. var objValue = prop.GetValue(o, null);
  90. var valueType = prop.PropertyType;
  91. var valueTypeName = valueType.FullName;
  92. if (valueTypeName.Contains("System.DateTime") && this.Value.StartsWith("Now"))
  93. {
  94. this.Value = DateTime.Now.ToString("O");
  95. }
  96. if (valueTypeName.Contains("System.DateTime"))
  97. {
  98. valueTypeName = "System.DateTime";
  99. }
  100. if (valueType.IsGenericType && valueType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)) && objValue != null)
  101. {
  102. objValue = new NullableConverter(valueType).ConvertTo(objValue, valueType.GetGenericArguments()[0]);
  103. }
  104. try
  105. {
  106. switch (this.Operator)
  107. {
  108. case "=":
  109. switch (valueTypeName)
  110. {
  111. case "System.String":
  112. case "System.Int16":
  113. case "System.Int32":
  114. case "System.Int64":
  115. b = objValue.ToString() == this.Value;
  116. break;
  117. case "System.DateTime":
  118. if (objValue == null)
  119. {
  120. b = false;
  121. }
  122. else
  123. {
  124. b = ((DateTime)objValue).ToUniversalTime().ToString("U") == DateTime.Parse(this.Value).ToUniversalTime().ToString("U");
  125. }
  126. break;
  127. case "System.Boolean":
  128. b = ((bool)objValue) == Boolean.Parse(this.Value);
  129. break;
  130. }
  131. break;
  132. case "!=":
  133. switch (valueTypeName)
  134. {
  135. case "System.String":
  136. case "System.Int16":
  137. case "System.Int32":
  138. case "System.Int64":
  139. b = objValue.ToString() != this.Value;
  140. break;
  141. case "System.DateTime":
  142. if (objValue == null)
  143. {
  144. b = false;
  145. }
  146. else
  147. {
  148. b = ((DateTime)objValue).ToUniversalTime().ToString("U") != DateTime.Parse(this.Value).ToUniversalTime().ToString("U");
  149. }
  150. break;
  151. case "System.Boolean":
  152. b = ((bool)objValue) != Boolean.Parse(this.Value);
  153. break;
  154. }
  155. break;
  156. case ">":
  157. switch (valueTypeName)
  158. {
  159. case "System.Int16":
  160. case "System.Int32":
  161. case "System.Int64":
  162. b = objValue.ToString().ToInt64() > this.Value.ToInt64();
  163. break;
  164. case "System.DateTime":
  165. if (objValue == null)
  166. {
  167. b = false;
  168. }
  169. else
  170. {
  171. b = ((DateTime)objValue).ToUniversalTime() > DateTime.Parse(this.Value).ToUniversalTime();
  172. }
  173. break;
  174. }
  175. break;
  176. case "<":
  177. switch (valueTypeName)
  178. {
  179. case "System.Int16":
  180. case "System.Int32":
  181. case "System.Int64":
  182. b = objValue.ToString().ToInt64() < this.Value.ToInt64();
  183. break;
  184. case "System.DateTime":
  185. if (objValue == null)
  186. {
  187. b = true;
  188. }
  189. else
  190. {
  191. b = ((DateTime)objValue).ToUniversalTime() < DateTime.Parse(this.Value).ToUniversalTime();
  192. }
  193. break;
  194. }
  195. break;
  196. case ">=":
  197. switch (valueTypeName)
  198. {
  199. case "System.Int16":
  200. case "System.Int32":
  201. case "System.Int64":
  202. b = objValue.ToString().ToInt64() >= this.Value.ToInt64();
  203. break;
  204. case "System.DateTime":
  205. if (objValue == null)
  206. {
  207. b = false;
  208. }
  209. else
  210. {
  211. b = ((DateTime)objValue).ToUniversalTime() >= DateTime.Parse(this.Value).ToUniversalTime();
  212. }
  213. break;
  214. }
  215. break;
  216. case "<=":
  217. switch (valueTypeName)
  218. {
  219. case "System.Int16":
  220. case "System.Int32":
  221. case "System.Int64":
  222. b = objValue.ToString().ToInt64() <= this.Value.ToInt64();
  223. break;
  224. case "System.DateTime":
  225. if (objValue == null)
  226. {
  227. b = true;
  228. }
  229. else
  230. {
  231. b = ((DateTime)objValue).ToUniversalTime() <= DateTime.Parse(this.Value).ToUniversalTime();
  232. }
  233. break;
  234. }
  235. break;
  236. case "%":
  237. switch (valueTypeName)
  238. {
  239. case "System.String":
  240. case "System.Int16":
  241. case "System.Int32":
  242. case "System.Int64":
  243. b = objValue.ToString().Contains(this.Value);
  244. break;
  245. }
  246. break;
  247. case "!%":
  248. switch (valueTypeName)
  249. {
  250. case "System.String":
  251. case "System.Int16":
  252. case "System.Int32":
  253. case "System.Int64":
  254. b = !objValue.ToString().Contains(this.Value);
  255. break;
  256. }
  257. break;
  258. }
  259. }
  260. catch (FormatException) { }
  261. catch (ArgumentException) { }
  262. return b;
  263. }
  264. public object GetValueAsObject(Type objectType)
  265. {
  266. object valueObj = null;
  267. var prop = objectType.GetProperty(this.Field);
  268. var valueType = prop.PropertyType;
  269. var valueTypeName = valueType.FullName;
  270. if (valueTypeName.Contains("System.DateTime"))
  271. valueTypeName = "System.DateTime";
  272. try
  273. {
  274. switch (valueTypeName)
  275. {
  276. case "System.String":
  277. valueObj = this.Value;
  278. break;
  279. case "System.Int16":
  280. valueObj = Convert.ToInt16(this.Value);
  281. break;
  282. case "System.Int32":
  283. valueObj = Convert.ToInt32(this.Value);
  284. break;
  285. case "System.Int64":
  286. valueObj = Convert.ToInt64(this.Value);
  287. break;
  288. case "System.DateTime":
  289. if (this.Value.ToUpper().StartsWith("GETDATE()") || this.Value.ToUpper().StartsWith("NOW") || this.Value.ToUpper().StartsWith("[NOW]"))
  290. if (valueType.FullName.Contains("System.Nullable"))
  291. {
  292. valueTypeName = "System.Nullable<System.DateTime>";
  293. System.Nullable<DateTime> now;
  294. valueObj = new Nullable<DateTime>(DateTime.Now);
  295. }
  296. else
  297. valueObj = DateTime.Now;
  298. break;
  299. case "System.Boolean":
  300. valueObj = Boolean.Parse(this.Value);
  301. break;
  302. }
  303. }
  304. catch { }
  305. return valueObj;
  306. }
  307. }
  308. }