SelectCommand_From.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace FastReport.FastQueryBuilder
  5. {
  6. class SelectCommand_From : ParserBase
  7. {
  8. public override bool CanParse(SqlParser parser)
  9. {
  10. return parser.Token.Type == SqlTokenType.Keyword && parser.Token.Text == "from";
  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. return;
  19. ReadGroup(parser, ref token);
  20. if (token.Type == SqlTokenType.Punctuation && token.Text == ",")
  21. token = parser.NextToken();
  22. }
  23. }
  24. /// <summary>
  25. /// read current token, returns next
  26. /// </summary>
  27. /// <param name="parser"></param>
  28. /// <param name="token"></param>
  29. /// <returns></returns>
  30. public void ReadGroup(SqlParser parser, ref SqlToken token)
  31. {
  32. while (token.Type == SqlTokenType.Punctuation && token.Text == ",")
  33. token = parser.NextToken();
  34. if (token.Type == SqlTokenType.Punctuation && token.Text == "(")
  35. {
  36. token = parser.NextToken();
  37. //read group
  38. ReadGroup(parser, ref token);
  39. if (token.Type == SqlTokenType.Punctuation && token.Text == ")")
  40. token = parser.NextToken();
  41. }
  42. else
  43. {
  44. ReadTable(parser, ref token);
  45. }
  46. if(token.Type == SqlTokenType.Keyword)
  47. {
  48. string table = null;
  49. QueryEnums.JoinTypes joinType = QueryEnums.JoinTypes.Where;
  50. switch (token.LowerText)
  51. {
  52. case "inner join":
  53. token = parser.NextToken();
  54. table = ReadTable(parser, ref token);
  55. joinType = QueryEnums.JoinTypes.InnerJoin;
  56. break;
  57. case "left outer join":
  58. token = parser.NextToken();
  59. table = ReadTable(parser, ref token);
  60. joinType = QueryEnums.JoinTypes.LeftOuterJoin;
  61. break;
  62. case "right outer join":
  63. token = parser.NextToken();
  64. table = ReadTable(parser, ref token);
  65. joinType = QueryEnums.JoinTypes.RightOuterJoin;
  66. break;
  67. case "full outer join":
  68. token = parser.NextToken();
  69. table = ReadTable(parser, ref token);
  70. joinType = QueryEnums.JoinTypes.FullOuterJoin;
  71. break;
  72. }
  73. if(table != null )
  74. {
  75. if(token.Type != SqlTokenType.Keyword || token.LowerText != "on" )
  76. {
  77. parser.ThrowFormat(token, "on");
  78. }
  79. SqlParser.FieldStruct one = ReadField(parser, ref token);
  80. QueryEnums.WhereTypes op;
  81. token = parser.NextToken();
  82. switch (token.LowerText)
  83. {
  84. //, "<>", ">=", ">", "<=", "<", "LIKE", "NOT LIKE"
  85. case "=": op = QueryEnums.WhereTypes.Equal; break;
  86. case "<>": op = QueryEnums.WhereTypes.NotEqual; break;
  87. case ">=": op = QueryEnums.WhereTypes.GreaterOrEqual; break;
  88. case ">": op = QueryEnums.WhereTypes.Greater; break;
  89. case "<=": op = QueryEnums.WhereTypes.LessOrEqual; break;
  90. case "<": op = QueryEnums.WhereTypes.Less; break;
  91. case "like": op = QueryEnums.WhereTypes.Like; break;
  92. case "not like": op = QueryEnums.WhereTypes.NotLike; break;
  93. default: parser.ThrowFormat(token, "where types"); return;
  94. }
  95. SqlParser.FieldStruct two = ReadField(parser, ref token);
  96. //read token after field , or ) or next command
  97. token = parser.NextToken();
  98. SqlParser.LinkStruct link = new SqlParser.LinkStruct();
  99. link.One = one;
  100. link.Two = two;
  101. link.WhereType = op;
  102. link.JoinType = joinType;
  103. link.Table = table;
  104. parser.Links.Add(link);
  105. }
  106. }
  107. }
  108. /// <summary>
  109. /// read current token, returns next
  110. /// </summary>
  111. /// <param name="parser"></param>
  112. /// <param name="token"></param>
  113. /// <returns></returns>
  114. public string ReadTable(SqlParser parser, ref SqlToken token)
  115. {
  116. string table = null;
  117. string alias = null;
  118. if (token.Type != SqlTokenType.Name)
  119. parser.ThrowFormat(token, "name");
  120. table = token.Text;
  121. token = parser.NextToken();
  122. if (token.Type == SqlTokenType.Name)
  123. {
  124. alias = token.Text;
  125. token = parser.NextToken();
  126. }
  127. SqlParser.TableStruct tableStruct = new SqlParser.TableStruct();
  128. tableStruct.Name = table;
  129. tableStruct.Alias = alias;
  130. parser.Tables.Add(tableStruct);
  131. return table;
  132. }
  133. /// <summary>
  134. /// ignore current token, read from next, returns current i.e not next
  135. /// </summary>
  136. /// <param name="parser"></param>
  137. /// <param name="token"></param>
  138. /// <returns></returns>
  139. public SqlParser.FieldStruct ReadField(SqlParser parser, ref SqlToken token)
  140. {
  141. string table = null;
  142. string variable = null;
  143. token = parser.NextToken();
  144. if (token.Type != SqlTokenType.Name)
  145. parser.ThrowFormat(token, "name");
  146. table = token.Text;
  147. token = parser.NextToken();
  148. if (token.Type != SqlTokenType.Punctuation || token.Text != ".")
  149. parser.ThrowFormat(token, ".");
  150. token = parser.NextToken();
  151. if (token.Type != SqlTokenType.Name)
  152. parser.ThrowFormat(token, "name");
  153. variable = token.Text;
  154. SqlParser.FieldStruct result = new SqlParser.FieldStruct();
  155. result.Table = table;
  156. result.Name = variable;
  157. return result;
  158. }
  159. }
  160. }