SelectCommand_Where.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace FastReport.FastQueryBuilder
  5. {
  6. class SelectCommand_Where : ParserBase
  7. {
  8. public override bool CanParse(SqlParser parser)
  9. {
  10. return parser.Token.Type == SqlTokenType.Keyword && parser.Token.LowerText == "where";
  11. }
  12. public override void Parse(SqlParser parser)
  13. {
  14. SqlToken token = parser.NextToken();
  15. while (token.Type != SqlTokenType.EOF)
  16. {
  17. if (token.Type == SqlTokenType.Keyword)
  18. break;
  19. SqlParser.FieldStruct field = ReadField(parser, ref token);
  20. if (field == null)
  21. return;
  22. QueryEnums.WhereTypes op;
  23. if (token.Type != SqlTokenType.Operation)
  24. parser.ThrowFormat(token, "operation");
  25. string opText = token.Text;
  26. switch (token.LowerText)
  27. {
  28. //, "<>", ">=", ">", "<=", "<", "LIKE", "NOT LIKE"
  29. case "=": op = QueryEnums.WhereTypes.Equal; break;
  30. case "<>": op = QueryEnums.WhereTypes.NotEqual; break;
  31. case ">=": op = QueryEnums.WhereTypes.GreaterOrEqual; break;
  32. case ">": op = QueryEnums.WhereTypes.Greater; break;
  33. case "<=": op = QueryEnums.WhereTypes.LessOrEqual; break;
  34. case "<": op = QueryEnums.WhereTypes.Less; break;
  35. case "like": op = QueryEnums.WhereTypes.Like; break;
  36. case "not like": op = QueryEnums.WhereTypes.NotLike; break;
  37. default: parser.ThrowFormat(token, "where types"); return;
  38. }
  39. token = parser.NextToken();
  40. SqlParser.FieldStruct second = ReadField(parser, ref token);
  41. if(second != null)
  42. {
  43. SqlParser.LinkStruct link = new SqlParser.LinkStruct();
  44. link.JoinType = QueryEnums.JoinTypes.Where;
  45. link.WhereType = op;
  46. link.One = field;
  47. link.Two = second;
  48. parser.Links.Add(link);
  49. }
  50. else
  51. {
  52. StringBuilder sb = new StringBuilder();
  53. sb.Append(opText).Append(" ");
  54. int level = 0;
  55. SqlToken last_token;
  56. while (token.Type!= SqlTokenType.EOF)
  57. {
  58. sb.Append(token.Text);
  59. last_token = token;
  60. if (token.Type == SqlTokenType.Punctuation)
  61. {
  62. if (token.Text == "(") level++;
  63. else if (token.Text == ")") level--;
  64. }
  65. token = parser.NextToken();
  66. int whiteSpaces = token.Position - last_token.Position - last_token.Text.Length;
  67. sb.Append(' ', whiteSpaces);
  68. if (level == 0 && token.Type == SqlTokenType.Operation && token.LowerText == "and")
  69. {
  70. int lastPos = parser.Position;
  71. token = parser.NextToken();
  72. if (ReadField(parser, ref token) != null)
  73. {
  74. parser.Position = lastPos;
  75. token = parser.Token;
  76. break;
  77. }
  78. }
  79. else if(level == 0 && token.Type == SqlTokenType.Keyword)
  80. {
  81. break;
  82. }
  83. }
  84. field.Filter = sb.ToString();
  85. parser.Where.Add(field);
  86. // add sb to field
  87. }
  88. if (token.Type != SqlTokenType.Operation || token.LowerText != "and")
  89. return;
  90. token = parser.NextToken();
  91. }
  92. }
  93. public SqlParser.FieldStruct ReadField(SqlParser parser, ref SqlToken token)
  94. {
  95. int pos = parser.Position;
  96. string table = null;
  97. string variable = null;
  98. if (token.Type != SqlTokenType.Name)
  99. {
  100. parser.Position = pos;
  101. token = parser.Token;
  102. return null;
  103. //parser.ThrowFormat(token, "name");
  104. }
  105. table = token.Text;
  106. token = parser.NextToken();
  107. if (token.Type != SqlTokenType.Punctuation || token.Text != ".")
  108. {
  109. parser.Position = pos;
  110. token = parser.Token;
  111. return null;
  112. //parser.ThrowFormat(token, ".");
  113. }
  114. token = parser.NextToken();
  115. if (token.Type != SqlTokenType.Name)
  116. {
  117. parser.Position = pos;
  118. token = parser.Token;
  119. return null;
  120. //parser.ThrowFormat(token, "name");
  121. }
  122. variable = token.Text;
  123. token = parser.NextToken();
  124. SqlParser.FieldStruct result = new SqlParser.FieldStruct();
  125. result.Table = table;
  126. result.Name = variable;
  127. return result;
  128. }
  129. }
  130. }