SelectCommand_OrderBy.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace FastReport.FastQueryBuilder
  5. {
  6. class SelectCommand_OrderBy : ParserBase
  7. {
  8. public override bool CanParse(SqlParser parser)
  9. {
  10. return parser.Token.Type == SqlTokenType.Keyword && parser.Token.Text == "order by";
  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 (token.Type == SqlTokenType.Keyword && token.LowerText == "asc")
  21. {
  22. field.SortType = SortTypes.Asc;
  23. token = parser.NextToken();
  24. }
  25. else if(token.Type == SqlTokenType.Keyword && token.LowerText == "desc")
  26. {
  27. field.SortType = SortTypes.Desc;
  28. token = parser.NextToken();
  29. }
  30. else
  31. {
  32. parser.ThrowFormat(token, "asc or desc");
  33. }
  34. parser.Orders.Add(field);
  35. if (token.Type == SqlTokenType.Punctuation && token.Text == ",")
  36. token = parser.NextToken();
  37. }
  38. }
  39. public SqlParser.FieldStruct ReadField(SqlParser parser, ref SqlToken token)
  40. {
  41. string table = null;
  42. string variable = null;
  43. if (token.Type != SqlTokenType.Name)
  44. parser.ThrowFormat(token, "name");
  45. table = token.Text;
  46. token = parser.NextToken();
  47. if (token.Type != SqlTokenType.Punctuation || token.Text != ".")
  48. parser.ThrowFormat(token, ".");
  49. token = parser.NextToken();
  50. if (token.Type != SqlTokenType.Name)
  51. parser.ThrowFormat(token, "name");
  52. variable = token.Text;
  53. token = parser.NextToken();
  54. SqlParser.FieldStruct result = new SqlParser.FieldStruct();
  55. result.Table = table;
  56. result.Name = variable;
  57. return result;
  58. }
  59. }
  60. }