Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Linq;
  4. namespace TestConsoleApp
  5. {
  6. public class QueryParser
  7. {
  8. public List<string> Parse()
  9. {
  10. var totalQuery = File.ReadAllText(@"D:\testquery.txt");
  11. return _Parse(totalQuery);
  12. }
  13. List<string> _Parse(string actualQuery)
  14. {
  15. string columnString = GetColumnString(actualQuery);
  16. List<string> resultColumnlist = new List<string>();
  17. var commaSeperatedArray = columnString.Split(',');
  18. for (int i = 0; i < commaSeperatedArray.Length; i++)
  19. {
  20. var column = commaSeperatedArray[i];
  21. if (IsPredefinedFunction(column))
  22. {
  23. if (!IsPerfectPredefinedFunction(column))
  24. {
  25. column = MakeItPerfect(ref i, commaSeperatedArray, commaSeperatedArray[i]);
  26. }
  27. resultColumnlist.Add(column);
  28. }
  29. else
  30. {
  31. resultColumnlist.Add(column);
  32. }
  33. }
  34. return resultColumnlist;
  35. }
  36. string GetColumnString(string actualQuery)
  37. {
  38. actualQuery = actualQuery.Replace(System.Environment.NewLine, " ");
  39. var fromidex = actualQuery.ToLower().LastIndexOf("from ");
  40. var splitted = actualQuery.Substring(0, fromidex);
  41. splitted = splitted.TrimStart().Remove(0, "select".Length);
  42. return splitted;
  43. }
  44. bool IsPredefinedFunction(string name)
  45. {
  46. var _name = name.ToLower();
  47. bool result = false;
  48. foreach (var function in PredefinedFunctions())
  49. {
  50. if (_name.Contains(function.ToLower()))
  51. {
  52. result = true;
  53. break;
  54. }
  55. }
  56. return result;
  57. }
  58. string[] PredefinedFunctions()
  59. {
  60. return new string[] {
  61. "coalesce","concat","select","min","max","count"
  62. };
  63. }
  64. bool IsPerfectPredefinedFunction(string name)
  65. {
  66. var opencount = name.Count(c => c == '(');
  67. var closecount = name.Count(c => c == ')');
  68. return opencount == closecount;
  69. }
  70. string MakeItPerfect(ref int index, string[] colArray, string columnName)
  71. {
  72. index = index + 1;
  73. var column = columnName + "," + colArray[index];
  74. if (!IsPerfectPredefinedFunction(column))
  75. {
  76. column = MakeItPerfect(ref index, colArray, column);
  77. }
  78. return column;
  79. }
  80. }
  81. }