factory.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include "factory.h"
  2. #include "array.h"
  3. #include "date.h"
  4. #include "enum.h"
  5. #include "nullable.h"
  6. #include "numeric.h"
  7. #include "string.h"
  8. #include "tuple.h"
  9. #include <library/cpp/clickhouse/client/types/type_parser.h>
  10. namespace NClickHouse {
  11. namespace {
  12. TColumnRef CreateTerminalColumn(const TTypeAst& ast) {
  13. if (ast.Name == "UInt8")
  14. return TColumnUInt8::Create();
  15. if (ast.Name == "UInt16")
  16. return TColumnUInt16::Create();
  17. if (ast.Name == "UInt32")
  18. return TColumnUInt32::Create();
  19. if (ast.Name == "UInt64")
  20. return TColumnUInt64::Create();
  21. if (ast.Name == "Int8")
  22. return TColumnInt8::Create();
  23. if (ast.Name == "Int16")
  24. return TColumnInt16::Create();
  25. if (ast.Name == "Int32")
  26. return TColumnInt32::Create();
  27. if (ast.Name == "Int64")
  28. return TColumnInt64::Create();
  29. if (ast.Name == "Float32")
  30. return TColumnFloat32::Create();
  31. if (ast.Name == "Float64")
  32. return TColumnFloat64::Create();
  33. if (ast.Name == "String")
  34. return TColumnString::Create();
  35. if (ast.Name == "FixedString")
  36. return TColumnFixedString::Create(ast.Elements.front().Value);
  37. if (ast.Name == "DateTime")
  38. return TColumnDateTime::Create();
  39. if (ast.Name == "Date")
  40. return TColumnDate::Create();
  41. return nullptr;
  42. }
  43. TColumnRef CreateColumnFromAst(const TTypeAst& ast) {
  44. switch (ast.Meta) {
  45. case TTypeAst::Array: {
  46. return TColumnArray::Create(
  47. CreateColumnFromAst(ast.Elements.front()));
  48. }
  49. case TTypeAst::Nullable: {
  50. return TColumnNullable::Create(
  51. CreateColumnFromAst(ast.Elements.front()));
  52. }
  53. case TTypeAst::Terminal: {
  54. return CreateTerminalColumn(ast);
  55. }
  56. case TTypeAst::Tuple: {
  57. TVector<TColumnRef> columns;
  58. for (const auto& elem : ast.Elements) {
  59. if (auto col = CreateColumnFromAst(elem)) {
  60. columns.push_back(col);
  61. } else {
  62. return nullptr;
  63. }
  64. }
  65. return TColumnTuple::Create(columns);
  66. }
  67. case TTypeAst::Enum: {
  68. TVector<TEnumItem> enum_items;
  69. for (const auto& elem : ast.Elements) {
  70. TString name(elem.Name);
  71. i16 value = elem.Value;
  72. enum_items.push_back({name, value});
  73. }
  74. if (ast.Name == "Enum8") {
  75. return TColumnEnum8::Create(enum_items);
  76. } else {
  77. return TColumnEnum16::Create(enum_items);
  78. }
  79. }
  80. case TTypeAst::Null:
  81. case TTypeAst::Number:
  82. break;
  83. }
  84. return nullptr;
  85. }
  86. }
  87. TColumnRef CreateColumnByType(const TString& type_name) {
  88. TTypeAst ast;
  89. if (TTypeParser(type_name).Parse(&ast)) {
  90. return CreateColumnFromAst(ast);
  91. }
  92. return nullptr;
  93. }
  94. }