28 #include "graphar/fwd.h"
29 #include "graphar/macros.h"
82 explicit DataType(Type
id,
const std::string& user_defined_type_name =
"")
85 user_defined_type_name_(user_defined_type_name) {}
87 explicit DataType(Type
id,
const std::shared_ptr<DataType>& child)
88 : id_(
id), child_(std::move(child)), user_defined_type_name_(
"") {}
93 user_defined_type_name_(other.user_defined_type_name_) {}
97 child_(std::move(other.child_)),
98 user_defined_type_name_(std::move(other.user_defined_type_name_)) {}
102 bool Equals(
const DataType& other)
const {
103 if (id_ != other.id_ ||
104 user_defined_type_name_ != other.user_defined_type_name_) {
107 if (child_ ==
nullptr && other.child_ ==
nullptr) {
110 if (child_ !=
nullptr && other.child_ !=
nullptr) {
111 return child_->Equals(other.child_);
116 bool Equals(
const std::shared_ptr<DataType>& other)
const {
120 return Equals(*other.get());
123 const std::shared_ptr<DataType>& value_type()
const {
return child_; }
125 bool operator==(
const DataType& other)
const {
return Equals(other); }
127 bool operator!=(
const DataType& other)
const {
return !Equals(other); }
129 static std::shared_ptr<arrow::DataType> DataTypeToArrowDataType(
130 const std::shared_ptr<DataType>& type);
132 static std::shared_ptr<DataType> ArrowDataTypeToDataType(
133 const std::shared_ptr<arrow::DataType>& type);
135 static std::shared_ptr<DataType> TypeNameToDataType(
const std::string& str);
138 Type
id()
const {
return id_; }
140 std::string ToTypeName()
const;
144 std::shared_ptr<DataType> child_;
145 std::string user_defined_type_name_;
151 using c_type = int64_t;
152 explicit Timestamp(c_type value) : value_(value) {}
154 c_type value()
const {
return value_; }
163 using c_type = int32_t;
164 explicit Date(c_type value) : value_(value) {}
166 c_type value()
const {
return value_; }
173 enum class AdjListType : std::uint8_t {
175 unordered_by_source = 0b00000001,
178 unordered_by_dest = 0b00000010,
180 ordered_by_source = 0b00000100,
183 ordered_by_dest = 0b00001000,
186 constexpr AdjListType operator|(AdjListType lhs, AdjListType rhs) {
187 return static_cast<AdjListType
>(
188 static_cast<std::underlying_type_t<AdjListType>
>(lhs) |
189 static_cast<std::underlying_type_t<AdjListType>
>(rhs));
192 constexpr AdjListType operator&(AdjListType lhs, AdjListType rhs) {
193 return static_cast<AdjListType
>(
194 static_cast<std::underlying_type_t<AdjListType>
>(lhs) &
195 static_cast<std::underlying_type_t<AdjListType>
>(rhs));
198 static inline const char* AdjListTypeToString(AdjListType adj_list_type) {
199 static const std::map<AdjListType, const char*> adj_list2string{
200 {AdjListType::unordered_by_source,
"unordered_by_source"},
201 {AdjListType::unordered_by_dest,
"unordered_by_dest"},
202 {AdjListType::ordered_by_source,
"ordered_by_source"},
203 {AdjListType::ordered_by_dest,
"ordered_by_dest"}};
204 return adj_list2string.at(adj_list_type);
207 static inline AdjListType OrderedAlignedToAdjListType(
208 bool ordered,
const std::string& aligned) {
210 return aligned ==
"src" ? AdjListType::ordered_by_source
211 : AdjListType::ordered_by_dest;
213 return aligned ==
"src" ? AdjListType::unordered_by_source
214 : AdjListType::unordered_by_dest;
217 static inline std::pair<bool, std::string> AdjListTypeToOrderedAligned(
218 AdjListType adj_list_type) {
219 switch (adj_list_type) {
220 case AdjListType::unordered_by_source:
221 return std::make_pair(
false,
"src");
222 case AdjListType::unordered_by_dest:
223 return std::make_pair(
false,
"dst");
224 case AdjListType::ordered_by_source:
225 return std::make_pair(
true,
"src");
226 case AdjListType::ordered_by_dest:
227 return std::make_pair(
true,
"dst");
229 return std::make_pair(
false,
"dst");
233 static inline FileType StringToFileType(
const std::string& str) {
234 static const std::map<std::string, FileType> str2file_type{
235 {
"csv", FileType::CSV},
236 {
"json", FileType::JSON},
237 {
"parquet", FileType::PARQUET},
238 {
"orc", FileType::ORC}};
240 return str2file_type.at(str.c_str());
241 }
catch (
const std::exception& e) {
242 throw std::runtime_error(
"KeyError: " + str);
246 static inline const char* FileTypeToString(FileType file_type) {
247 static const std::map<FileType, const char*> file_type2string{
248 {FileType::CSV,
"csv"},
249 {FileType::JSON,
"json"},
250 {FileType::PARQUET,
"parquet"},
251 {FileType::ORC,
"orc"}};
252 return file_type2string.at(file_type);
255 static inline Cardinality StringToCardinality(
const std::string& str) {
256 static const std::map<std::string, Cardinality> str2cardinality{
257 {
"single", Cardinality::SINGLE},
258 {
"list", Cardinality::LIST},
259 {
"set", Cardinality::SET},
262 return str2cardinality.at(str.c_str());
263 }
catch (
const std::exception& e) {
264 throw std::runtime_error(
"KeyError: " + str);
268 static inline const char* CardinalityToString(Cardinality cardinality) {
269 static const std::map<Cardinality, const char*> cardinality2string{
270 {Cardinality::SINGLE,
"single"},
271 {Cardinality::LIST,
"list"},
272 {Cardinality::SET,
"set"},
275 return cardinality2string.at(cardinality);
276 }
catch (
const std::exception& e) {
277 throw std::runtime_error(
"KeyError: " +
278 std::to_string(
static_cast<int>(cardinality)));
283 inline std::vector<std::string> SplitString(
const std::string& str,
285 std::vector<std::string> tokens;
287 std::istringstream tokenStream(str);
288 while (std::getline(tokenStream, token, delimiter)) {
289 tokens.push_back(token);
The DataType struct to provide enum type for data type and functions to parse data type.