diff --git a/plugins/cpp_metrics/service/cxxmetrics.thrift b/plugins/cpp_metrics/service/cxxmetrics.thrift index 65f3f383e..ca5826aaa 100644 --- a/plugins/cpp_metrics/service/cxxmetrics.thrift +++ b/plugins/cpp_metrics/service/cxxmetrics.thrift @@ -109,7 +109,7 @@ service CppMetricsService map> getPagedCppAstNodeMetricsForPath( 1:string path 2:i32 pageSize, - 3:i32 pageNumber) + 3:common.AstNodeId previousId) /** * This function returns all available C++ metrics @@ -129,7 +129,7 @@ service CppMetricsService map getPagedCppAstNodeMetricsDetailedForPath( 1:string path, 2:i32 pageSize, - 3:i32 pageNumber) + 3:common.AstNodeId previousId) /** * This function returns all available C++ metrics @@ -149,7 +149,7 @@ service CppMetricsService map> getPagedCppFileMetricsForPath( 1:string path, 2:i32 pageSize, - 3:i32 pageNumber) + 3:common.FileId previousId) /** * This function returns the names of the AST node-level C++ metrics. diff --git a/plugins/cpp_metrics/service/include/service/cppmetricsservice.h b/plugins/cpp_metrics/service/include/service/cppmetricsservice.h index be7b901dc..f51be4a49 100644 --- a/plugins/cpp_metrics/service/include/service/cppmetricsservice.h +++ b/plugins/cpp_metrics/service/include/service/cppmetricsservice.h @@ -57,7 +57,7 @@ class CppMetricsServiceHandler : virtual public CppMetricsServiceIf std::map>& _return, const std::string& path_, const std::int32_t pageSize_, - const std::int32_t pageNumber_) override; + const core::AstNodeId& previousId_) override; void getCppAstNodeMetricsDetailedForPath( std::map& _return, @@ -67,7 +67,7 @@ class CppMetricsServiceHandler : virtual public CppMetricsServiceIf std::map& _return, const std::string& path_, const std::int32_t pageSize_, - const std::int32_t pageNumber_) override; + const core::AstNodeId& previousId_) override; void getCppFileMetricsForPath( std::map>& _return, @@ -77,7 +77,7 @@ class CppMetricsServiceHandler : virtual public CppMetricsServiceIf std::map>& _return, const std::string& path_, const std::int32_t pageSize_, - const std::int32_t pageNumber_) override; + const core::FileId& previousId_) override; void getCppAstNodeMetricsTypeNames( std::vector& _return) override; @@ -91,33 +91,17 @@ class CppMetricsServiceHandler : virtual public CppMetricsServiceIf const boost::program_options::variables_map& _config; - std::string getPagingQuery( + std::string getLimitQuery(const std::int32_t pageSize_); + + std::vector pageAstNodeMetrics( + const std::string& path_, const std::int32_t pageSize_, - const std::int32_t pageNumber_); + const model::CppAstNodeId previousId_); - template - std::vector pageMetrics( + std::vector pageFileMetrics( const std::string& path_, const std::int32_t pageSize_, - const std::int32_t pageNumber_) - { - return _transaction([&, this](){ - odb::result paged_nodes = _db->query( - odb::query::File::path.like(path_ + '%') + getPagingQuery(pageSize_, pageNumber_)); - - std::vector paged_ids(paged_nodes.size()); - std::transform(paged_nodes.begin(), paged_nodes.end(), paged_ids.begin(), - [](const TView& e){ - if constexpr (std::is_same::value) { - return e.astNodeId; - } else if constexpr (std::is_same::value) { - return e.fileId; - } - }); - - return paged_ids; - }); - } + const model::FileId previousId_); void queryCppAstNodeMetricsForPath( std::map>& _return, diff --git a/plugins/cpp_metrics/service/src/cppmetricsservice.cpp b/plugins/cpp_metrics/service/src/cppmetricsservice.cpp index a9f5a46dd..45bc8be68 100644 --- a/plugins/cpp_metrics/service/src/cppmetricsservice.cpp +++ b/plugins/cpp_metrics/service/src/cppmetricsservice.cpp @@ -187,10 +187,10 @@ void CppMetricsServiceHandler::getPagedCppAstNodeMetricsForPath( std::map>& _return, const std::string& path_, const std::int32_t pageSize_, - const std::int32_t pageNumber_) + const core::AstNodeId& previousId_) { - std::vector paged_nodes = pageMetrics( - path_, pageSize_, pageNumber_); + std::vector paged_nodes = pageAstNodeMetrics( + path_, pageSize_, previousId_.empty() ? 0 : std::stoull(previousId_)); queryCppAstNodeMetricsForPath(_return, CppNodeMetricsQuery::CppAstNodeMetrics::astNodeId.in_range(paged_nodes.begin(), paged_nodes.end())); @@ -241,10 +241,10 @@ void CppMetricsServiceHandler::getPagedCppAstNodeMetricsDetailedForPath( std::map& _return, const std::string& path_, const std::int32_t pageSize_, - const std::int32_t pageNumber_) + const core::AstNodeId& previousId_) { - std::vector paged_nodes = pageMetrics( - path_, pageSize_, pageNumber_); + std::vector paged_nodes = pageAstNodeMetrics( + path_, pageSize_, previousId_.empty() ? 0 : std::stoull(previousId_)); queryCppAstNodeMetricsDetailedForPath(_return, CppNodeMetricsQuery::CppAstNodeMetrics::astNodeId.in_range(paged_nodes.begin(), paged_nodes.end())); @@ -290,16 +290,16 @@ void CppMetricsServiceHandler::getPagedCppFileMetricsForPath( std::map>& _return, const std::string& path_, const std::int32_t pageSize_, - const std::int32_t pageNumber_) + const core::FileId& previousId_) { - std::vector paged_files = pageMetrics(path_, pageSize_, pageNumber_); + std::vector paged_files = pageFileMetrics( + path_, pageSize_, previousId_.empty() ? 0 : std::stoull(previousId_)); queryCppFileMetricsForPath(_return, CppModuleMetricsQuery::CppFileMetrics::file.in_range(paged_files.begin(), paged_files.end())); } -std::string CppMetricsServiceHandler::getPagingQuery( - const std::int32_t pageSize_, - const std::int32_t pageNumber_) +std::string CppMetricsServiceHandler::getLimitQuery( + const std::int32_t pageSize_) { if (pageSize_ <= 0) { @@ -308,15 +308,65 @@ std::string CppMetricsServiceHandler::getPagingQuery( throw ex; } - if (pageNumber_ <= 0) - { - core::InvalidInput ex; - ex.__set_msg("Invalid page number: " + std::to_string(pageNumber_)); - throw ex; - } + return " LIMIT " + std::to_string(pageSize_); +} + +std::vector CppMetricsServiceHandler::pageAstNodeMetrics( + const std::string& path_, + const std::int32_t pageSize_, + const model::CppAstNodeId previousId_) +{ + typedef odb::query MetricQuery; + typedef odb::result MetricResult; + + return _transaction([&, this](){ + MetricQuery condition = MetricQuery::File::path.like(path_ + '%'); + if (previousId_ != 0) { + condition = condition && (MetricQuery::CppAstNodeMetrics::astNodeId > previousId_); + } + + MetricResult paged_nodes = _db->query( + condition + + ("ORDER BY" + odb::query::astNodeId) + + getLimitQuery(pageSize_)); - const std::int32_t offset = (pageNumber_ - 1) * pageSize_; - return " LIMIT " + std::to_string(pageSize_) + " OFFSET " + std::to_string(offset); + std::vector paged_ids(paged_nodes.size()); + std::transform(paged_nodes.begin(), paged_nodes.end(), paged_ids.begin(), + [](const model::CppAstNodeMetricsDistinctView& e){ + return e.astNodeId; + }); + + return paged_ids; + }); +} + +std::vector CppMetricsServiceHandler::pageFileMetrics( + const std::string& path_, + const std::int32_t pageSize_, + const model::FileId previousId_) +{ + typedef odb::query MetricQuery; + typedef odb::result MetricResult; + + return _transaction([&, this](){ + MetricQuery condition = MetricQuery::File::path.like(path_ + '%'); + if (previousId_ != 0) { + condition = condition && (MetricQuery::CppFileMetrics::file > previousId_); + } + + MetricResult paged_nodes = _db->query( + condition + + ("ORDER BY" + odb::query::file) + + getLimitQuery(pageSize_)); + + std::vector paged_ids(paged_nodes.size()); + std::transform(paged_nodes.begin(), paged_nodes.end(), paged_ids.begin(), + [](const model::CppModuleMetricsDistinctView& e){ + return e.fileId; + }); + + return paged_ids; + }); } } // cppmetrics