| 60 | |
| 61 | template <typename Formatter> |
| 62 | void SQLEncoder<Formatter>::DumpSingleJoinQuery(size_t idx, bool stripArgs) const { |
| 63 | WrSerializer& ser = formatter_.Serializer(); |
| 64 | if (idx >= query_.GetJoinQueries().size()) [[unlikely]] { |
| 65 | throw Error(errParams, "Error during parsing query join entries: idx({}) >= query_.GetJoinQueries().size()({})", idx, |
| 66 | query_.GetJoinQueries().size()); |
| 67 | } |
| 68 | |
| 69 | const auto& jq = query_.GetJoinQueries()[idx]; |
| 70 | ser << kJoinNames[jq.joinType]; |
| 71 | if (jq.Entries().Empty() && !jq.HasLimit() && jq.GetSortingEntries().empty()) { |
| 72 | ser << jq.NsName() << ' '; |
| 73 | } else { |
| 74 | { |
| 75 | const auto parenthesisGuard = formatter_.OpenParenthesis(); |
| 76 | SQLEncoder(jq, formatter_).DumpSQL(stripArgs); |
| 77 | } |
| 78 | formatter_.Next(); |
| 79 | } |
| 80 | ser << "ON "; |
| 81 | { |
| 82 | const auto onGuard = formatter_.ConditionallyOpenParenthesis(jq.joinEntries_.size() != 1); |
| 83 | bool needEncloseOR = false; |
| 84 | for (size_t i = 1; i < jq.joinEntries_.size(); ++i) { |
| 85 | if (jq.joinEntries_[i].Operation() != OpOr) { |
| 86 | needEncloseOR = true; |
| 87 | break; |
| 88 | } |
| 89 | } |
| 90 | auto conditionsFormatter = formatter_.StartConditions(needEncloseOR); |
| 91 | for (size_t i = 0; i < jq.joinEntries_.size(); ++i) { |
| 92 | const auto& e = jq.joinEntries_[i]; |
| 93 | const bool isNextOr = i + 1 < jq.joinEntries_.size() && jq.joinEntries_[i + 1].Operation() == OpOr; |
| 94 | conditionsFormatter.AddCondition(e.Operation(), isNextOr); |
| 95 | if (e.ReverseNamespacesOrder()) { |
| 96 | ser << jq.NsName() << '.' << e.RightFieldName() << ' ' << joins::InvertJoinCondition(e.Condition()) << ' ' |
| 97 | << query_.NsName() << '.' << e.LeftFieldName(); |
| 98 | } else { |
| 99 | ser << query_.NsName() << '.' << e.LeftFieldName() << ' ' << e.Condition() << ' ' << jq.NsName() << '.' |
| 100 | << e.RightFieldName(); |
| 101 | } |
| 102 | } |
| 103 | } |
| 104 | } |
| 105 | |
| 106 | template <typename Formatter> |
| 107 | void SQLEncoder<Formatter>::dumpJoined(bool stripArgs) const { |
no test coverage detected