PageRenderTime 43ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/mcs/class/referencesource/System.Data.Linq/SqlClient/Query/SimpleExpression.cs

http://github.com/mono/mono
C# | 120 lines | 111 code | 5 blank | 4 comment | 4 complexity | 3456a180507028df722b9b35ee34b5be MD5 | raw file
Possible License(s): GPL-2.0, CC-BY-SA-3.0, LGPL-2.0, MPL-2.0-no-copyleft-exception, LGPL-2.1, Unlicense, Apache-2.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq.Expressions;
  4. using System.Reflection;
  5. using System.Data.Linq;
  6. using System.Data.Linq.Mapping;
  7. using System.Data.Linq.Provider;
  8. using System.Linq;
  9. using System.Data.Linq.SqlClient;
  10. using System.Diagnostics.CodeAnalysis;
  11. namespace System.Data.Linq.SqlClient {
  12. /// <summary>
  13. /// Determines whether an expression is simple or not.
  14. /// Simple is a scalar expression that contains only functions, operators and column references
  15. /// </summary>
  16. internal static class SimpleExpression {
  17. internal static bool IsSimple(SqlExpression expr) {
  18. Visitor v = new Visitor();
  19. v.Visit(expr);
  20. return v.IsSimple;
  21. }
  22. class Visitor : SqlVisitor {
  23. bool isSimple = true;
  24. internal bool IsSimple {
  25. get { return this.isSimple; }
  26. }
  27. [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification = "These issues are related to our use of if-then and case statements for node types, which adds to the complexity count however when reviewed they are easy to navigate and understand.")]
  28. internal override SqlNode Visit(SqlNode node) {
  29. if (node == null) {
  30. return null;
  31. }
  32. if (!this.isSimple) {
  33. return node;
  34. }
  35. switch (node.NodeType) {
  36. case SqlNodeType.Not:
  37. case SqlNodeType.Not2V:
  38. case SqlNodeType.Negate:
  39. case SqlNodeType.BitNot:
  40. case SqlNodeType.IsNull:
  41. case SqlNodeType.IsNotNull:
  42. case SqlNodeType.ValueOf:
  43. case SqlNodeType.OuterJoinedValue:
  44. case SqlNodeType.ClrLength:
  45. case SqlNodeType.Add:
  46. case SqlNodeType.Sub:
  47. case SqlNodeType.Mul:
  48. case SqlNodeType.Div:
  49. case SqlNodeType.Mod:
  50. case SqlNodeType.BitAnd:
  51. case SqlNodeType.BitOr:
  52. case SqlNodeType.BitXor:
  53. case SqlNodeType.And:
  54. case SqlNodeType.Or:
  55. case SqlNodeType.GE:
  56. case SqlNodeType.GT:
  57. case SqlNodeType.LE:
  58. case SqlNodeType.LT:
  59. case SqlNodeType.EQ:
  60. case SqlNodeType.NE:
  61. case SqlNodeType.EQ2V:
  62. case SqlNodeType.NE2V:
  63. case SqlNodeType.Between:
  64. case SqlNodeType.Concat:
  65. case SqlNodeType.Convert:
  66. case SqlNodeType.Treat:
  67. case SqlNodeType.Member:
  68. case SqlNodeType.TypeCase:
  69. case SqlNodeType.SearchedCase:
  70. case SqlNodeType.SimpleCase:
  71. case SqlNodeType.Like:
  72. case SqlNodeType.FunctionCall:
  73. case SqlNodeType.ExprSet:
  74. case SqlNodeType.OptionalValue:
  75. case SqlNodeType.Parameter:
  76. case SqlNodeType.ColumnRef:
  77. case SqlNodeType.Value:
  78. case SqlNodeType.Variable:
  79. return base.Visit(node);
  80. case SqlNodeType.Column:
  81. case SqlNodeType.ClientCase:
  82. case SqlNodeType.DiscriminatedType:
  83. case SqlNodeType.Link:
  84. case SqlNodeType.Row:
  85. case SqlNodeType.UserQuery:
  86. case SqlNodeType.StoredProcedureCall:
  87. case SqlNodeType.UserRow:
  88. case SqlNodeType.UserColumn:
  89. case SqlNodeType.Multiset:
  90. case SqlNodeType.ScalarSubSelect:
  91. case SqlNodeType.Element:
  92. case SqlNodeType.Exists:
  93. case SqlNodeType.Join:
  94. case SqlNodeType.Select:
  95. case SqlNodeType.New:
  96. case SqlNodeType.ClientQuery:
  97. case SqlNodeType.ClientArray:
  98. case SqlNodeType.Insert:
  99. case SqlNodeType.Update:
  100. case SqlNodeType.Delete:
  101. case SqlNodeType.MemberAssign:
  102. case SqlNodeType.Assign:
  103. case SqlNodeType.Block:
  104. case SqlNodeType.Union:
  105. case SqlNodeType.DoNotVisit:
  106. case SqlNodeType.MethodCall:
  107. case SqlNodeType.Nop:
  108. default:
  109. this.isSimple = false;
  110. return node;
  111. }
  112. }
  113. }
  114. }
  115. }