diff --git a/dbms/src/Formats/CapnProtoRowInputStream.cpp b/dbms/src/Formats/CapnProtoRowInputStream.cpp index eea475ff985..84249342cb0 100644 --- a/dbms/src/Formats/CapnProtoRowInputStream.cpp +++ b/dbms/src/Formats/CapnProtoRowInputStream.cpp @@ -107,17 +107,10 @@ capnp::StructSchema::Field getFieldOrThrow(capnp::StructSchema node, const std:: else throw Exception("Field " + field + " doesn't exist in schema " + node.getShortDisplayName().cStr(), ErrorCodes::THERE_IS_NO_COLUMN); } -bool checkEqualFrom(const std::vector &a,const std::vector &b, const size_t index) { - for(int i = index; i >= 0; i++) { - if(a[i] != b[i]) { - return false; - } - } - return true; -} + void CapnProtoRowInputStream::createActions(const NestedFieldList & sortedFields, capnp::StructSchema reader) { - //Store parents and their tokens in order to backtrack + // Store parents and their tokens in order to backtrack std::vector parents; std::vector tokens; @@ -125,20 +118,26 @@ void CapnProtoRowInputStream::createActions(const NestedFieldList & sortedFields size_t level = 0; for (const auto & field : sortedFields) { - //Backtrackt to common parent - while(level > (field.tokens.size()-1) || !checkEqualFrom(tokens,field.tokens,level-1)) { + // Backtrack to common parent + while(level > (field.tokens.size() - 1) || !checkEqualFrom(tokens, field.tokens, level - 1)) + { level--; actions.push_back({Action::POP}); tokens.pop_back(); parents.pop_back(); - if(level > 0) { + + if (level > 0) + { cur_reader = parents[level-1].getType().asStruct(); - } else { + } + else + { cur_reader = reader; break; } } - //Go forward + + // Go forward for (; level < field.tokens.size() - 1; ++level) { @@ -204,16 +203,7 @@ CapnProtoRowInputStream::CapnProtoRowInputStream(ReadBuffer & istr_, const Block list.push_back(split(header, i)); // Order list first by value of strings then by length of sting vector. - std::sort(list.begin(), list.end(), [](const NestedField & a, const NestedField & b) - { - size_t min = std::min(a.tokens.size(),b.tokens.size()); - for(size_t i = 0; i < min; i++) { - if(a.tokens[i] != b.tokens[i]){ - return a.tokens[i] > b.tokens[i]; - } - } - return a.tokens.size() < b.tokens.size(); - }); + std::sort(list.begin(), list.end(), [](const NestedField & a, const NestedField & b) { return a.tokens < b.tokens; }); createActions(list, root); }