Autonomy Software C++ 24.5.1
Welcome to the Autonomy Software repository of the Mars Rover Design Team (MRDT) at Missouri University of Science and Technology (Missouri S&T)! API reference contains the source code and other resources for the development of the autonomy software for our Mars rover. The Autonomy Software project aims to compete in the University Rover Challenge (URC) by demonstrating advanced autonomous capabilities and robust navigation algorithms.
Loading...
Searching...
No Matches
duckdb::FilenamePattern Class Reference
Collaboration diagram for duckdb::FilenamePattern:

Public Member Functions

 FilenamePattern (string base, idx_t pos, bool uuid, vector< FileNameSegment > segments)
 
void SetFilenamePattern (const string &pattern)
 
string CreateFilename (FileSystem &fs, const string &path, const string &extension, idx_t offset) const
 
void Serialize (Serializer &serializer) const
 
bool HasUUID () const
 
string SerializeBase () const
 
idx_t SerializePos () const
 
vector< FileNameSegmentSerializeSegments () const
 

Static Public Member Functions

static FilenamePattern Deserialize (Deserializer &deserializer)
 

Private Attributes

vector< FileNameSegmentsegments
 

Constructor & Destructor Documentation

◆ FilenamePattern() [1/2]

duckdb::FilenamePattern::FilenamePattern ( )
74479 {
74480 segments.emplace_back("data_");
74481 segments.emplace_back(FileNameSegmentType::OFFSET);
74482}

◆ FilenamePattern() [2/2]

duckdb::FilenamePattern::FilenamePattern ( string  base,
idx_t  pos,
bool  uuid,
vector< FileNameSegment segments 
)
74484 {
74485 if (!segments_p.empty()) {
74486 segments = std::move(segments_p);
74487 return;
74488 }
74489 // deserialize from legacy pattern
74490 if (pos > 0) {
74491 segments.emplace_back(base.substr(0, pos));
74492 }
74493 if (uuid) {
74494 segments.emplace_back(FileNameSegmentType::UUID_V4);
74495 } else {
74496 segments.emplace_back(FileNameSegmentType::OFFSET);
74497 }
74498 if (pos == 0 && !base.empty()) {
74499 segments.emplace_back(std::move(base));
74500 } else if (pos < base.size()) {
74501 segments.emplace_back(base.substr(pos, base.size() - pos));
74502 }
74503}

Member Function Documentation

◆ SetFilenamePattern()

void duckdb::FilenamePattern::SetFilenamePattern ( const string &  pattern)
74505 {
74506 struct StringPattern {
74507 StringPattern(string pattern_p, FileNameSegmentType type) : pattern(std::move(pattern_p)), type(type) {
74508 }
74509
74510 string pattern;
74511 FileNameSegmentType type;
74512 };
74513 vector<StringPattern> patterns;
74514 patterns.emplace_back("{i}", FileNameSegmentType::OFFSET);
74515 patterns.emplace_back("{uuid}", FileNameSegmentType::UUID_V4);
74516 patterns.emplace_back("{uuidv4}", FileNameSegmentType::UUID_V4);
74517 patterns.emplace_back("{uuidv7}", FileNameSegmentType::UUID_V7);
74518
74519 idx_t current_pos = 0;
74520 segments.clear();
74521 for (idx_t i = 0; i < pattern.size(); i++) {
74522 if (pattern[i] != '{') {
74523 continue;
74524 }
74525 // found a { - check if this is one of the supported pattern
74526 idx_t remaining_length = pattern.size() - i;
74527 for (auto &pat : patterns) {
74528 if (remaining_length < pat.pattern.size()) {
74529 // cannot match
74530 continue;
74531 }
74532 if (memcmp(pat.pattern.c_str(), pattern.c_str() + i, pat.pattern.size()) != 0) {
74533 // no match
74534 continue;
74535 }
74536 // found a match!
74537 if (i > current_pos) {
74538 // add a literal pattern
74539 segments.emplace_back(pattern.substr(current_pos, i - current_pos));
74540 }
74541 // add the pattern here
74542 segments.emplace_back(pat.type);
74543
74544 // advance the search forward
74545 i += pat.pattern.size() - 1;
74546 current_pos = i + 1;
74547 break;
74548 }
74549 }
74550 // add the final pattern (if any)
74551 if (current_pos < pattern.size()) {
74552 segments.emplace_back(pattern.substr(current_pos));
74553 }
74554 if (segments.size() == 1 && segments[0].type == FileNameSegmentType::LITERAL) {
74555 // if we have ONLY a literal we add an offset at the end
74556 segments.emplace_back(FileNameSegmentType::OFFSET);
74557 }
74558}
pat

◆ CreateFilename()

string duckdb::FilenamePattern::CreateFilename ( FileSystem fs,
const string &  path,
const string &  extension,
idx_t  offset 
) const
74561 {
74562 string result;
74563 for (auto &segment : segments) {
74564 switch (segment.type) {
74565 case FileNameSegmentType::LITERAL:
74566 result += segment.data;
74567 break;
74568 case FileNameSegmentType::UUID_V4:
74569 result += UUID::ToString(UUID::GenerateRandomUUID());
74570 break;
74571 case FileNameSegmentType::UUID_V7:
74572 result += UUID::ToString(UUIDv7::GenerateRandomUUID());
74573 break;
74574 case FileNameSegmentType::OFFSET:
74575 result += std::to_string(offset);
74576 break;
74577 default:
74578 throw InternalException("Unsupported type for Filename Pattern");
74579 }
74580 }
74581 return fs.JoinPath(path, result + "." + extension);
74582}
static void ToString(hugeint_t input, char *buf)
Convert a hugeint object to a uuid style string.

◆ HasUUID()

bool duckdb::FilenamePattern::HasUUID ( ) const
74584 {
74585 for (auto &segment : segments) {
74586 if (segment.type == FileNameSegmentType::UUID_V4 || segment.type == FileNameSegmentType::UUID_V7) {
74587 return true;
74588 }
74589 }
74590 return false;
74591}

◆ SerializeBase()

string duckdb::FilenamePattern::SerializeBase ( ) const
74631 {
74632 if (!SupportsLegacyFilenamePattern(segments)) {
74633 return string();
74634 }
74635 return GetLegacyFilenamePattern(segments).base;
74636}

◆ SerializePos()

idx_t duckdb::FilenamePattern::SerializePos ( ) const
74638 {
74639 if (!SupportsLegacyFilenamePattern(segments)) {
74640 return 0;
74641 }
74642 return GetLegacyFilenamePattern(segments).pos;
74643}

◆ SerializeSegments()

vector< FileNameSegment > duckdb::FilenamePattern::SerializeSegments ( ) const
74645 {
74646 if (SupportsLegacyFilenamePattern(segments)) {
74647 // for legacy mode we don't serialize the segments
74648 return vector<FileNameSegment>();
74649 }
74650 return segments;
74651}

The documentation for this class was generated from the following file: