diff --git a/.clang-format b/.clang-format old mode 100644 new mode 100755 diff --git a/.dockerignore b/.dockerignore old mode 100644 new mode 100755 diff --git a/.env b/.env old mode 100644 new mode 100755 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/CMakeLists.txt b/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/CPPLINT.cfg b/CPPLINT.cfg old mode 100644 new mode 100755 diff --git a/Docker/db.Dockerfile b/Docker/db.Dockerfile old mode 100644 new mode 100755 diff --git a/Docker/init.sql b/Docker/init.sql old mode 100644 new mode 100755 diff --git a/Dockerfile b/Dockerfile old mode 100644 new mode 100755 diff --git a/Makefile b/Makefile old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/client/cmd/CMakeLists.txt b/client/cmd/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/client/internal/CMakeLists.txt b/client/internal/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/client/internal/core/CMakeLists.txt b/client/internal/core/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/client/internal/core/include/Core.h b/client/internal/core/include/Core.h old mode 100644 new mode 100755 index 31d3ceec1a28f45ee60db81243b900768a9b7b2d..a981e96832b473cb1f9612d3b2c443df1d86382f --- a/client/internal/core/include/Core.h +++ b/client/internal/core/include/Core.h @@ -14,7 +14,7 @@ public: static std::vector getAllTasks(); - static Solution submitSolution(const int& task_id, const std::string& filename, const std::string& path_to_file); + static std::pair submitSolution(const int& task_id, const std::string& filename, const std::string& path_to_file); static unsigned int createTask(const std::string& name, const std::string &desc, const double& threshold); diff --git a/client/internal/core/src/Core.cpp b/client/internal/core/src/Core.cpp old mode 100644 new mode 100755 index 3f8acb6383f4b68bb3560d65e5c978e32bd1c506..46afc8ab4a4041891ccc462713214bf590a13fa5 --- a/client/internal/core/src/Core.cpp +++ b/client/internal/core/src/Core.cpp @@ -2,10 +2,13 @@ // Created by Николай Степанов on 11.05.2023. // #include "Core.h" + #include "HttpClientManager.h" +//const std::string CLIENT_IP = "195.19.32.74"; +//const std::string CLIENT_PORT = "3005"; const std::string CLIENT_IP = "0.0.0.0"; -const std::string CLIENT_PORT = "8080"; +const std::string CLIENT_PORT = "8081"; HttpClientManager client(CLIENT_IP, CLIENT_PORT); std::size_t Core::user_id = -1; @@ -22,20 +25,15 @@ unsigned Core::login(const std::string &login, const std::string &pass) { return res.first; } -void Core::logout() { - Core::user_id = -1; -} +void Core::logout() { Core::user_id = -1; } -std::vector Core::getAllTasks() { - return client.getAllTasks(); -} +std::vector Core::getAllTasks() { return client.getAllTasks(); } -Solution Core::submitSolution(const int &task_id, const std::string& filename, const std::string &path_to_file) { +std::pair Core::submitSolution(const int &task_id, const std::string &filename, + const std::string &path_to_file) { return client.submitSolution(user_id, task_id, filename, path_to_file); } -unsigned int Core::createTask(const std::string& name, const std::string &desc, - const double& threshold) { +unsigned int Core::createTask(const std::string &name, const std::string &desc, const double &threshold) { return client.createTask(name, desc, threshold); } - diff --git a/client/internal/entities/CMakeLists.txt b/client/internal/entities/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/client/internal/entities/include/Metric.h b/client/internal/entities/include/Metric.h old mode 100644 new mode 100755 diff --git a/client/internal/entities/include/Solution.h b/client/internal/entities/include/Solution.h old mode 100644 new mode 100755 index 4cf7061a36531ecf61daf2c070eed8a569958042..9de053725b1bb673ca41096d59a018b9ea629c06 --- a/client/internal/entities/include/Solution.h +++ b/client/internal/entities/include/Solution.h @@ -8,4 +8,8 @@ struct Solution { size_t id; std::string source; std::string result; + struct Codes { + std::string original; + std::string current; + }; }; \ No newline at end of file diff --git a/client/internal/entities/include/Task.h b/client/internal/entities/include/Task.h old mode 100644 new mode 100755 diff --git a/client/internal/entities/include/User.h b/client/internal/entities/include/User.h old mode 100644 new mode 100755 diff --git a/client/internal/entities/src/Task.cpp b/client/internal/entities/src/Task.cpp old mode 100644 new mode 100755 index e58c1160b2a1f0fe1f621045689d327604b68325..c329f06fde1fcfdfe3b2df7ea8f524e3d6d44e11 --- a/client/internal/entities/src/Task.cpp +++ b/client/internal/entities/src/Task.cpp @@ -1,4 +1,4 @@ #include "Task.h" Task::Task(std::size_t id, std::string_view desc, std::string_view name, double threshold) : - id(id), description(desc), name(name), threshold(threshold) {}; + id(id), description(desc), name(name), threshold(threshold) {} diff --git a/client/internal/gui/CMakeLists.txt b/client/internal/gui/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/client/internal/gui/include/AddTaskDialog.h b/client/internal/gui/include/AddTaskDialog.h old mode 100644 new mode 100755 diff --git a/client/internal/gui/include/AuthDialog.h b/client/internal/gui/include/AuthDialog.h old mode 100644 new mode 100755 diff --git a/client/internal/gui/include/EntryWindow.h b/client/internal/gui/include/EntryWindow.h old mode 100644 new mode 100755 diff --git a/client/internal/gui/include/SignUpDialog.h b/client/internal/gui/include/SignUpDialog.h old mode 100644 new mode 100755 diff --git a/client/internal/gui/include/SolutionsWindow.h b/client/internal/gui/include/SolutionsWindow.h old mode 100644 new mode 100755 index 3107c18d87dc5c0a8a58b5f3198ac51b2f2b810c..df2f09db91bb0346b03a4d15a0f7d0bea3370b9c --- a/client/internal/gui/include/SolutionsWindow.h +++ b/client/internal/gui/include/SolutionsWindow.h @@ -39,6 +39,12 @@ private: QPushButton* sendButton = nullptr; QTextEdit* result = nullptr; QPushButton* backButton = nullptr; + QWidget* solutionWidget = nullptr; + QGridLayout* solutionLayout = nullptr; + QLabel* originalLabel = nullptr; + QTextEdit* original = nullptr; + QLabel* currentLabel = nullptr; + QTextEdit* current = nullptr; void setupUi(QMainWindow *UserWindow); }; diff --git a/client/internal/gui/include/TasksWindow.h b/client/internal/gui/include/TasksWindow.h old mode 100644 new mode 100755 diff --git a/client/internal/gui/include/UIManager.h b/client/internal/gui/include/UIManager.h old mode 100644 new mode 100755 diff --git a/client/internal/gui/main.cpp b/client/internal/gui/main.cpp old mode 100644 new mode 100755 diff --git a/client/internal/gui/src/AddTaskDialog.cpp b/client/internal/gui/src/AddTaskDialog.cpp old mode 100644 new mode 100755 diff --git a/client/internal/gui/src/AuthDialog.cpp b/client/internal/gui/src/AuthDialog.cpp old mode 100644 new mode 100755 diff --git a/client/internal/gui/src/EntryWindow.cpp b/client/internal/gui/src/EntryWindow.cpp old mode 100644 new mode 100755 diff --git a/client/internal/gui/src/SignUpDialog.cpp b/client/internal/gui/src/SignUpDialog.cpp old mode 100644 new mode 100755 diff --git a/client/internal/gui/src/SolutionsWindow.cpp b/client/internal/gui/src/SolutionsWindow.cpp old mode 100644 new mode 100755 index af3d1f47efc3bbca4bca002dceb26071d4b8d9ab..1e5cc813471215351f65dab7d80e5b04c622b738 --- a/client/internal/gui/src/SolutionsWindow.cpp +++ b/client/internal/gui/src/SolutionsWindow.cpp @@ -34,19 +34,37 @@ void SolutionsWindow::setupUi(QMainWindow *SolutionsWindow) { taskLayout->addWidget(taskDescription); - filename = new QLabel(this); + filename = new QLabel(SolutionsWindow); - chooseFileButton = new QPushButton(this); + chooseFileButton = new QPushButton(SolutionsWindow); chooseFileButton->setText(QString::fromUtf8("Выберите файл")); - sendButton = new QPushButton(this); + sendButton = new QPushButton(SolutionsWindow); sendButton->setText(QString::fromUtf8("Отправить")); - result = new QTextEdit(this); + result = new QTextEdit(SolutionsWindow); result->setReadOnly(true); result->setText(QString::fromUtf8("Отправьте для принятия решения")); - backButton = new QPushButton(this); + solutionWidget = new QWidget(SolutionsWindow); + solutionLayout = new QGridLayout(solutionWidget); + + originalLabel = new QLabel(solutionWidget); + originalLabel->setText(QString::fromUtf8("Оригинальное решение")); + original = new QTextEdit(solutionWidget); + original->setReadOnly(true); + + currentLabel = new QLabel(solutionWidget); + currentLabel->setText(QString::fromUtf8("Ваше решение")); + current = new QTextEdit(solutionWidget); + current->setReadOnly(true); + + solutionLayout->addWidget(currentLabel, 0, 0); + solutionLayout->addWidget(originalLabel, 0, 1); + solutionLayout->addWidget(current, 1, 0); + solutionLayout->addWidget(original, 1, 1); + + backButton = new QPushButton(SolutionsWindow); backButton->setText(QString::fromUtf8("Назад")); verticalLayout->addWidget(taskBox); @@ -54,6 +72,7 @@ void SolutionsWindow::setupUi(QMainWindow *SolutionsWindow) { verticalLayout->addWidget(chooseFileButton); verticalLayout->addWidget(sendButton); verticalLayout->addWidget(result); + verticalLayout->addWidget(solutionWidget); verticalLayout->addWidget(backButton); SolutionsWindow->setCentralWidget(centralwidget); @@ -75,8 +94,12 @@ void SolutionsWindow::on_sendButton_clicked() { QMessageBox::warning(this, "Ошибка отправки", "Файл должен быть указан"); return; } - Solution sol = Core::submitSolution(task.id, filename->text().toUtf8().constData(), path_to_file); + Solution sol; + Solution::Codes codes; + std::tie(sol, codes) = Core::submitSolution(task.id, filename->text().toUtf8().constData(), path_to_file); result->setText(QString::fromStdString(sol.result)); + original->setHtml(QString::fromUtf8(codes.original)); + current->setHtml(QString::fromUtf8(codes.current)); } diff --git a/client/internal/gui/src/TasksWindow.cpp b/client/internal/gui/src/TasksWindow.cpp old mode 100644 new mode 100755 diff --git a/client/internal/gui/src/UIManager.cpp b/client/internal/gui/src/UIManager.cpp old mode 100644 new mode 100755 diff --git a/client/internal/gui/tests/CMakeLists.txt b/client/internal/gui/tests/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/client/internal/gui/tests/main.cpp b/client/internal/gui/tests/main.cpp old mode 100644 new mode 100755 diff --git a/client/internal/httpClient/CMakeLists.txt b/client/internal/httpClient/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/client/internal/httpClient/include/HttpClient.h b/client/internal/httpClient/include/HttpClient.h old mode 100644 new mode 100755 diff --git a/client/internal/httpClient/include/HttpClientManager.h b/client/internal/httpClient/include/HttpClientManager.h old mode 100644 new mode 100755 index 2d15f7f36a4491a9f978d2102cde0158cf020d0a..be95a33d103cb6bdc420026b05ac2a1190eed188 --- a/client/internal/httpClient/include/HttpClientManager.h +++ b/client/internal/httpClient/include/HttpClientManager.h @@ -19,7 +19,7 @@ public: std::pair loginUser(const std::string &login, const std::string &password); std::pair registerUser(const std::string &login, const std::string &username, const std::string &password); - Solution submitSolution(const int& user_id, const int &task_id, const std::string& filename, + std::pair submitSolution(const int& user_id, const int &task_id, const std::string& filename, const std::string &path_to_solution); unsigned int getAllSolutionsForTask(const int& user_id, const int& task_id); std::vector getAllTasks(); diff --git a/client/internal/httpClient/include/Serializer.h b/client/internal/httpClient/include/Serializer.h old mode 100644 new mode 100755 index ba742f25d78499aa473e5a4dc516ed5f2cea5ab9..a63ffd3f8b763d170b889b1cc80f962f7d3e3d26 --- a/client/internal/httpClient/include/Serializer.h +++ b/client/internal/httpClient/include/Serializer.h @@ -17,6 +17,7 @@ public: User deserialUserData(std::string_view body); Solution deserialSolutionData(std::string_view body); + std::pair deserialNewSolutionData(std::string_view body); std::vector deserialAllTasks(std::string_view body); }; diff --git a/client/internal/httpClient/src/HttpClient.cpp b/client/internal/httpClient/src/HttpClient.cpp old mode 100644 new mode 100755 diff --git a/client/internal/httpClient/src/HttpClientManager.cpp b/client/internal/httpClient/src/HttpClientManager.cpp old mode 100644 new mode 100755 index a8831c0e0ffd1ab4c0acf7db21cdd29a405fdd37..4f48083aeff6f9647dad057a0c7e84461de247ea --- a/client/internal/httpClient/src/HttpClientManager.cpp +++ b/client/internal/httpClient/src/HttpClientManager.cpp @@ -1,15 +1,16 @@ #include "HttpClientManager.h" -#include -#include #include +#include +#include #include "HttpClient.h" -HttpClientManager::HttpClientManager(std::string_view host_, std::string_view port_) : - host(host_), port(port_), - client(std::make_shared(host_, port_)), - serializer(std::make_shared()) {} +HttpClientManager::HttpClientManager(std::string_view host_, std::string_view port_) + : host(host_), + port(port_), + client(std::make_shared(host_, port_)), + serializer(std::make_shared()) {} std::pair HttpClientManager::loginUser(const std::string &login, const std::string &password) { std::string body = serializer->serialLoginData(login, password); @@ -17,23 +18,22 @@ std::pair HttpClientManager::loginUser(const std::string &login, unsigned status = res.result_int(); std::string res_body; for (auto seq : res.body().data()) { - auto* cbuf = boost::asio::buffer_cast(seq); + auto *cbuf = boost::asio::buffer_cast(seq); res_body.append(cbuf, boost::asio::buffer_size(seq)); } User user{0, "", "", ""}; - if (status == 200) - user = serializer->deserialUserData(res_body); + if (status == 200) user = serializer->deserialUserData(res_body); return {status, user}; } std::pair HttpClientManager::registerUser(const std::string &login, const std::string &username, - const std::string &password) { + const std::string &password) { std::string body = serializer->serialRegisterData(login, username, password); http::response res = client->makeGetRequest("/user/register", body); unsigned status = res.result_int(); std::string res_body; for (auto seq : res.body().data()) { - auto* cbuf = boost::asio::buffer_cast(seq); + auto *cbuf = boost::asio::buffer_cast(seq); res_body.append(cbuf, boost::asio::buffer_size(seq)); } User user; @@ -43,42 +43,40 @@ std::pair HttpClientManager::registerUser(const std::string &log return {status, user}; } -Solution HttpClientManager::submitSolution(const int &user_id, const int &task_id, const std::string& filename, - const std::string &path_to_sound) { +std::pair HttpClientManager::submitSolution(const int &user_id, const int &task_id, + const std::string &filename, + const std::string &path_to_sound) { std::string body = serializer->serialSolutionData(user_id, task_id, filename, path_to_sound); http::response res = client->makeGetRequest("/solution/submit", body); std::cout << res << std::endl; // unsigned status = res.result_int(); std::string res_body; for (auto seq : res.body().data()) { - auto* cbuf = boost::asio::buffer_cast(seq); + auto *cbuf = boost::asio::buffer_cast(seq); res_body.append(cbuf, boost::asio::buffer_size(seq)); } - Solution sol = serializer->deserialSolutionData(res_body); - return sol; + Solution sol; + Solution::Codes codes; + std::tie(sol, codes) = serializer->deserialNewSolutionData(res_body); + return {sol, codes}; } -unsigned int HttpClientManager::getAllSolutionsForTask(const int &user_id, const int &task_id) { - return 0; -} +unsigned int HttpClientManager::getAllSolutionsForTask(const int &user_id, const int &task_id) { return 0; } -void HttpClientManager::setHttpClient(std::shared_ptr client_) { - client = client_; -} +void HttpClientManager::setHttpClient(std::shared_ptr client_) { client = client_; } std::vector HttpClientManager::getAllTasks() { http::response res = client->makeGetRequest("/task/all", ""); std::string res_body; for (auto seq : res.body().data()) { - auto* cbuf = boost::asio::buffer_cast(seq); + auto *cbuf = boost::asio::buffer_cast(seq); res_body.append(cbuf, boost::asio::buffer_size(seq)); } std::vector tasks = serializer->deserialAllTasks(res_body); return tasks; } -unsigned int HttpClientManager::createTask(const std::string& name, const std::string &desc, - const double& threshold) { +unsigned int HttpClientManager::createTask(const std::string &name, const std::string &desc, const double &threshold) { std::string body = serializer->serialNewTaskData(name, desc, threshold); http::response res = client->makeGetRequest("/task/create", body); unsigned int result = res.result_int(); diff --git a/client/internal/httpClient/src/Serializer.cpp b/client/internal/httpClient/src/Serializer.cpp old mode 100644 new mode 100755 index c2d803d4afb44f56685f46006f621504a6cda73a..c4a505ebc9b141ceaaef9788f17aca49f2b02e86 --- a/client/internal/httpClient/src/Serializer.cpp +++ b/client/internal/httpClient/src/Serializer.cpp @@ -82,6 +82,23 @@ Solution Serializer::deserialSolutionData(std::string_view body) { return res; } +std::pair Serializer::deserialNewSolutionData(std::string_view body) { + std::stringstream ss; + ss << body; + boost::property_tree::ptree json; + boost::property_tree::read_json(ss, json); + Solution sol = { + json.get("sol_id"), + json.get("source"), + json.get("result"), + }; + Solution::Codes codes = { + json.get("original"), + json.get("your_code"), + }; + return {sol, codes}; +} + std::string Serializer::serialNewTaskData(std::string_view name, std::string_view desc, double threshold) { boost::property_tree::ptree json; json.put("name", name); diff --git a/client/internal/httpClient/tests/CMakeLists.txt b/client/internal/httpClient/tests/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/client/internal/httpClient/tests/HttpClientManagerSuite.cpp b/client/internal/httpClient/tests/HttpClientManagerSuite.cpp old mode 100644 new mode 100755 diff --git a/client/internal/httpClient/tests/HttpClientSuite.cpp b/client/internal/httpClient/tests/HttpClientSuite.cpp old mode 100644 new mode 100755 diff --git a/client/internal/httpClient/tests/main.cpp b/client/internal/httpClient/tests/main.cpp old mode 100644 new mode 100755 diff --git a/client/internal/httpClient/virtual/IHttpClient.h b/client/internal/httpClient/virtual/IHttpClient.h old mode 100644 new mode 100755 diff --git a/docker-compose.yml b/docker-compose.yml old mode 100644 new mode 100755 diff --git a/docs/.spectral.yml b/docs/.spectral.yml old mode 100644 new mode 100755 diff --git a/docs/Makefile b/docs/Makefile old mode 100644 new mode 100755 diff --git a/log.txt b/log.txt old mode 100644 new mode 100755 diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/cmd/.env b/server/cmd/.env old mode 100644 new mode 100755 diff --git a/server/cmd/CMakeLists.txt b/server/cmd/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/conanfile.txt b/server/conanfile.txt old mode 100644 new mode 100755 diff --git a/server/config.sh b/server/config.sh old mode 100644 new mode 100755 diff --git a/server/internal/CMakeLists.txt b/server/internal/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/internal/dbManager/CMakeLists.txt b/server/internal/dbManager/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/internal/dbManager/include/dbConnection.hpp b/server/internal/dbManager/include/dbConnection.hpp old mode 100644 new mode 100755 diff --git a/server/internal/dbManager/include/dbManager.hpp b/server/internal/dbManager/include/dbManager.hpp old mode 100644 new mode 100755 diff --git a/server/internal/dbManager/src/dbConnection.cpp b/server/internal/dbManager/src/dbConnection.cpp old mode 100644 new mode 100755 diff --git a/server/internal/dbManager/src/dbManager.cpp b/server/internal/dbManager/src/dbManager.cpp old mode 100644 new mode 100755 diff --git a/server/internal/entities/CMakeLists.txt b/server/internal/entities/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/internal/entities/include/MetricStat.hpp b/server/internal/entities/include/MetricStat.hpp old mode 100644 new mode 100755 diff --git a/server/internal/entities/include/Solution.hpp b/server/internal/entities/include/Solution.hpp old mode 100644 new mode 100755 index 9a0b49ee3d41f61594ae986b28323eeacb2f92be..f4aaa99476ee6cab3184a21a53444cdeff341cd3 --- a/server/internal/entities/include/Solution.hpp +++ b/server/internal/entities/include/Solution.hpp @@ -7,6 +7,13 @@ class Solution { public: + struct Codes { + std::string original; + std::string current; + Codes(const std::string &original, const std::string ¤t); + Codes() = default; + }; + Solution(size_t id, std::string sendDate, size_t senderId, std::string source, size_t taskId, std::string result, std::string tokens, std::string astTree, size_t orig_solution, std::string language) noexcept; diff --git a/server/internal/entities/include/Task.hpp b/server/internal/entities/include/Task.hpp old mode 100644 new mode 100755 diff --git a/server/internal/entities/include/User.hpp b/server/internal/entities/include/User.hpp old mode 100644 new mode 100755 diff --git a/server/internal/entities/src/MetricStat.cpp b/server/internal/entities/src/MetricStat.cpp old mode 100644 new mode 100755 diff --git a/server/internal/entities/src/Solution.cpp b/server/internal/entities/src/Solution.cpp old mode 100644 new mode 100755 index 0dfebf14677be85b002a6f4b7eaf2b447d270abe..1558bb0701b17297fe2bb83c034dc51bc628f078 --- a/server/internal/entities/src/Solution.cpp +++ b/server/internal/entities/src/Solution.cpp @@ -4,6 +4,9 @@ #include #include +Solution::Codes::Codes(const std::string &original, const std::string ¤t) + : original(original), current(current) {} + Solution::Solution(size_t id, std::string sendDate, size_t senderId, std::string source, size_t taskId, std::string result, std::string tokens, std::string astTree, size_t orig_solution, std::string language_) noexcept diff --git a/server/internal/entities/src/Task.cpp b/server/internal/entities/src/Task.cpp old mode 100644 new mode 100755 diff --git a/server/internal/entities/src/User.cpp b/server/internal/entities/src/User.cpp old mode 100644 new mode 100755 diff --git a/server/internal/entities/tests/CMakeLists.txt b/server/internal/entities/tests/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/internal/httpServer/CMakeLists.txt b/server/internal/httpServer/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/internal/httpServer/include/HttpConnection.h b/server/internal/httpServer/include/HttpConnection.h old mode 100644 new mode 100755 diff --git a/server/internal/httpServer/include/HttpServer.h b/server/internal/httpServer/include/HttpServer.h old mode 100644 new mode 100755 diff --git a/server/internal/httpServer/include/Router.h b/server/internal/httpServer/include/Router.h old mode 100644 new mode 100755 diff --git a/server/internal/httpServer/include/Serializer.h b/server/internal/httpServer/include/Serializer.h old mode 100644 new mode 100755 index 9790ac5d06e23043f8907771307d82ef75eda168..35ab279322674d9d8a33890b379c088da5b9df40 --- a/server/internal/httpServer/include/Serializer.h +++ b/server/internal/httpServer/include/Serializer.h @@ -22,6 +22,7 @@ class Serializer { std::string serialAllTasks(const std::vector& tasks); std::string serialUserData(const User& user); std::string serialSolution(const Solution& sol); + std::string serialNewSolution(const Solution& sol, const Solution::Codes& codes); std::string serialTask(const Task& task); }; diff --git a/server/internal/httpServer/include/SolutionManager.h b/server/internal/httpServer/include/SolutionManager.h old mode 100644 new mode 100755 diff --git a/server/internal/httpServer/include/TaskManager.h b/server/internal/httpServer/include/TaskManager.h old mode 100644 new mode 100755 diff --git a/server/internal/httpServer/include/UserManager.h b/server/internal/httpServer/include/UserManager.h old mode 100644 new mode 100755 diff --git a/server/internal/httpServer/include/Utils.h b/server/internal/httpServer/include/Utils.h old mode 100644 new mode 100755 diff --git a/server/internal/httpServer/src/HttpConnection.cpp b/server/internal/httpServer/src/HttpConnection.cpp old mode 100644 new mode 100755 diff --git a/server/internal/httpServer/src/HttpServer.cpp b/server/internal/httpServer/src/HttpServer.cpp old mode 100644 new mode 100755 diff --git a/server/internal/httpServer/src/Router.cpp b/server/internal/httpServer/src/Router.cpp old mode 100644 new mode 100755 diff --git a/server/internal/httpServer/src/Serializer.cpp b/server/internal/httpServer/src/Serializer.cpp old mode 100644 new mode 100755 index ee7eb6ac17df9e201437887aee79701f2fcadce9..d9484f5605c3294e3ba614938a84e610a4a3023a --- a/server/internal/httpServer/src/Serializer.cpp +++ b/server/internal/httpServer/src/Serializer.cpp @@ -29,10 +29,7 @@ std::tuple Serializer::deserialTaskData(const std::str ss << val; boost::property_tree::ptree json; boost::property_tree::read_json(ss, json); - std::tuple res = { - json.get("user_id"), - json.get("task_id") - }; + std::tuple res = {json.get("user_id"), json.get("task_id")}; return res; } @@ -42,10 +39,7 @@ std::tuple Serializer::deserialNewTaskData(con boost::property_tree::ptree json; boost::property_tree::read_json(ss, json); std::tuple res = { - json.get("name"), - json.get("description"), - json.get("threshold") - }; + json.get("name"), json.get("description"), json.get("threshold")}; return res; } @@ -122,6 +116,18 @@ std::string Serializer::serialSolution(const Solution &sol) { return out.str(); } +std::string Serializer::serialNewSolution(const Solution &sol, const Solution::Codes &codes) { + boost::property_tree::ptree json; + json.put("sol_id", sol.getId()); + json.put("source", sol.getSource()); + json.put("result", sol.getResult()); + json.put("your_code", codes.current); + json.put("original", codes.original); + std::stringstream out; + boost::property_tree::write_json(out, json); + return out.str(); +} + std::string Serializer::serialTask(const Task &task) { boost::property_tree::ptree json; json.put("name", task.getName()); diff --git a/server/internal/httpServer/src/SolutionManager.cpp b/server/internal/httpServer/src/SolutionManager.cpp old mode 100644 new mode 100755 index 742a8f95382f41daf88be88ffec7b93ccf8cce42..3a6a1f56fb4932d1b67dc3d3f5c42143c9cdeb9a --- a/server/internal/httpServer/src/SolutionManager.cpp +++ b/server/internal/httpServer/src/SolutionManager.cpp @@ -24,13 +24,14 @@ http::message_generator SolutionManager::createSolution(http::requestcreateSolution(user_id, task_id, filename, filedata); + Solution sol; + Solution::Codes codes; + std::tie(sol, codes) = solutionService->createSolution(user_id, task_id, filename, filedata); http::response res{http::status::ok, req.version()}; res.set(http::field::server, BOOST_BEAST_VERSION_STRING); res.set(http::field::content_type, "text/plain"); res.keep_alive(req.keep_alive()); - res.body() = serializer->serialSolution(sol); - res.prepare_payload(); + res.body() = serializer->serialNewSolution(sol, codes); return res; } catch (const std::exception& e) { return getInternalServerError(req, e.what()); diff --git a/server/internal/httpServer/src/TaskManager.cpp b/server/internal/httpServer/src/TaskManager.cpp old mode 100644 new mode 100755 diff --git a/server/internal/httpServer/src/UserManager.cpp b/server/internal/httpServer/src/UserManager.cpp old mode 100644 new mode 100755 diff --git a/server/internal/httpServer/src/Utils.cpp b/server/internal/httpServer/src/Utils.cpp old mode 100644 new mode 100755 index 790aa7cff0b935896ac07cb59a4f361ba17b20be..497594117ec49bf54b54b62b1ddc388b6a0e5da6 --- a/server/internal/httpServer/src/Utils.cpp +++ b/server/internal/httpServer/src/Utils.cpp @@ -14,7 +14,7 @@ http::response getBadRequest(const http::request getInternalServerError(const http::request& request, - beast::string_view why) { + beast::string_view why) { http::response res{http::status::internal_server_error, request.version()}; res.set(http::field::server, BOOST_BEAST_VERSION_STRING); res.set(http::field::content_type, "text/plain"); @@ -22,4 +22,4 @@ http::response getInternalServerError(const http::request +#include +#include +#include +#include +#include +#include + +class FoundSame { + public: + void setData(std::vector > > _tokens1, + std::vector > > _tokens2); + [[maybe_unused]] std::pair getTexts(); + + private: + struct Elem2 { + std::string op; // 1 - Insert, 2 - Delete, 3 - Copy, 4 - Replace + std::pair > token1; + std::pair > token2; + }; + + std::vector > > str_int_tokens1; + std::vector > > str_int_tokens2; + std::vector res_alignment; + + std::pair tokens2text(); + std::pair tokens2html(); + static void outOps(std::vector ops, std::string& str); +}; + +#endif // SOURCEDOUT_DIFFLIB_H diff --git a/server/internal/metrics/include/TextMetricsLib.h b/server/internal/metrics/include/TextMetricsLib.h old mode 100644 new mode 100755 diff --git a/server/internal/metrics/include/TokenMetricLib.h b/server/internal/metrics/include/TokenMetricLib.h old mode 100644 new mode 100755 diff --git a/server/internal/metrics/src/DiffLibImpl.cpp b/server/internal/metrics/src/DiffLibImpl.cpp new file mode 100755 index 0000000000000000000000000000000000000000..e32a4935dfb78bdec28e2a83cc1d3f659749b9a9 --- /dev/null +++ b/server/internal/metrics/src/DiffLibImpl.cpp @@ -0,0 +1,254 @@ +// +// Created by march on 22.05.2023. +// +#include + +#include "DiffLib.h" + +void FoundSame::setData(std::vector > > _tokens1, + std::vector > > _tokens2) { + str_int_tokens1 = std::move(_tokens2); + str_int_tokens2 = std::move(_tokens1); +} + +std::pair FoundSame::getTexts() { + unsigned long n = str_int_tokens1.size(); + unsigned long m = str_int_tokens2.size(); + + std::vector > dist(n + 1, std::vector(m + 1, 0)); + + for (size_t i = 0; i < n + 1; i++) { + dist[i][0] = static_cast(i); + } + + for (size_t i = 0; i < m + 1; i++) { + dist[0][i] = static_cast(i); + } + + std::vector > cache(n + 1, std::vector(m + 1)); + + for (size_t i = 1; i <= n; i++) { + cache[i][0] = { + "I", {"%", str_int_tokens1[i - 1].second}, str_int_tokens1[i - 1]}; // str_int_tokens1[i-1].second мб кал + } + for (size_t i = 1; i <= m; i++) { + cache[0][i] = {"D", str_int_tokens2[i - 1], {"#", str_int_tokens2[i - 1].second}}; // аналогично + } + + std::pair > r, h; + for (size_t i = 1; i <= n; i++) { + for (size_t j = 1; j <= m; j++) { + h = str_int_tokens1[i - 1], r = str_int_tokens2[j - 1]; + std::vector > cases; + + if (r.first == h.first) + cases.push_back({dist[i - 1][j - 1], {"C", r, h}}); + else + cases.push_back({dist[i - 1][j - 1] + 1, {"R", r, h}}); + cases.push_back({dist[i][j - 1] + 1, {"D", r, {"#", r.second}}}); + cases.push_back({dist[i - 1][j] + 1, {"I", {"%", h.second}, h}}); + + dist[i][j] = cases[0].first; + cache[i][j] = cases[0].second; + + for (size_t k = 1; k < cases.size(); k++) { + if (dist[i][j] > cases[k].first) { + dist[i][j] = cases[k].first; + cache[i][j] = cases[k].second; + } + } + } + } + + std::vector alignment; + size_t i = n, j = m; + while (i != 0 || j != 0) { + std::string op = cache[i][j].op; + auto temp = cache[i][j]; + // if (temp.token1.second > temp.token2.second) { + // temp.token2.second = temp.token1.second; + // } + // else{ + // temp.token1.second = temp.token2.second; + // } + cache[i][j] = temp; + alignment.push_back(cache[i][j]); + if (op == "C" || op == "R") { + i--, j--; + } else if (op == "I") { + i--; + } else { + j--; + } + } + std::reverse(alignment.begin(), alignment.end()); + + res_alignment = alignment; + + return tokens2html(); +} + +std::pair FoundSame::tokens2text() { + std::string res1, res2; + std::vector ops; + + int line = res_alignment[0].token1.second.first; + + for (auto& i : res_alignment) { + if (i.token1.second.first > line) { + while (line != i.token1.second.first) { + res1 += '\n'; + line++; + } + } + res1 += i.token1.first, res1 += " "; + } + + line = res_alignment[0].token2.second.first; + for (auto& i : res_alignment) { + if (i.token2.second.first > line) { + res2 += '\t'; + // outOps(ops, res2); + ops.clear(); + while (line < i.token2.second.first) { + res2 += '\n'; + line++; + } + } + ops.push_back(i.op); + res2 += i.token2.first, res2 += " "; + } + + res1.pop_back(), res2.pop_back(); + + return {res1, res2}; +} + +void FoundSame::outOps(std::vector ops, std::string& str) { + if (ops.empty()) return; + std::string o = ops[0]; + int f = 0; + for (auto& op : ops) { + if (op != o) { + f = 1; + break; + } + } + if (f == 0) { + str += "[" + o + "]"; + } else { + for (auto& op : ops) { + str += op, str += " "; + } + } +} + +std::pair FoundSame::tokens2html() { + std::string teg_I = ""; + std::string teg_D = ""; + std::string teg_C = ""; + std::string teg_R = ""; + std::string close_teg = ""; + + for (auto& i : res_alignment) { + size_t pos; + while ((pos = i.token1.first.find("<")) != std::string::npos) { + i.token1.first.replace(pos, 1, "<"); + } + while ((pos = i.token1.first.find(">")) != std::string::npos) { + i.token1.first.replace(pos, 1, ">"); + } + + while ((pos = i.token2.first.find("<")) != std::string::npos) { + i.token2.first.replace(pos, 1, "<"); + } + while ((pos = i.token2.first.find(">")) != std::string::npos) { + i.token2.first.replace(pos, 1, ">"); + } + + if (i.token1.first == "%") { + i.token1.first = ""; + i.token1.second.first = -1; + } + + if (i.token2.first == "#") { + i.token2.first = ""; + i.token2.second.first = -1; + } + } + + std::string res1 = + "\n" + "\n" + "
"; + std::string res2 = res1; + std::vector ops; + + int line = res_alignment[0].token1.second.first; + + int f = 0; + + for (auto& i : res_alignment) { + if (i.token1.second.first > line) { + while (line < i.token1.second.first) { + res1 += "
"; + res1 += '\n'; + line++; + } + f = 1; + } + if (f == 1) { + res1 += ""; + for (int k = 0; k < i.token1.second.second; k++) { + res1 += " "; + } + res1 += ""; + f = 0; + } + if (i.op == "I") res1 += teg_I; + if (i.op == "D") res1 += teg_D; + if (i.op == "C") res1 += teg_C; + if (i.op == "R") res1 += teg_R; + + res1 += i.token1.first; + if (!i.token1.first.empty()) res1 += " "; + res1 += close_teg; + } + + line = res_alignment[0].token2.second.first; + for (auto& i : res_alignment) { + if (i.token2.second.first > line) { + while (line < i.token2.second.first) { + res2 += "
"; + res2 += '\n'; + line++; + } + f = 1; + } + if (f == 1) { + res2 += ""; + for (int k = 0; k < i.token2.second.second; k++) { + res2 += " "; + } + res2 += ""; + f = 0; + } + if (i.op == "I") res2 += teg_I; + if (i.op == "D") res2 += teg_D; + if (i.op == "C") res2 += teg_C; + if (i.op == "R") res2 += teg_R; + + res2 += i.token2.first; + if (!i.token2.first.empty()) res2 += " "; + res2 += close_teg; + } + + res1 += + "
\n" + ""; + res2 += + "\n" + ""; + + return {res1, res2}; +} diff --git a/server/internal/metrics/src/TextMetricImpl.cpp b/server/internal/metrics/src/TextMetricImpl.cpp old mode 100644 new mode 100755 diff --git a/server/internal/metrics/src/TokenMetricImpl.cpp b/server/internal/metrics/src/TokenMetricImpl.cpp old mode 100644 new mode 100755 diff --git a/server/internal/metrics/testProgs/cpp/code1.txt b/server/internal/metrics/testProgs/cpp/code1.txt old mode 100644 new mode 100755 index 5fa95b8f8462b43d7b70943fc4b1f5d124dec881..24c4633827a7ec57212398549bbf91a6fe29f258 --- a/server/internal/metrics/testProgs/cpp/code1.txt +++ b/server/internal/metrics/testProgs/cpp/code1.txt @@ -1,29 +1,41 @@ -// однострочный комментарий -// еще один -// вау еще один - #include -#include -#include +#include using namespace std; -/* многострочный комм - * // внутри него однострочный - * - */ +bool check(vector s, int i, int j){ + for (int k = 0; k < s.size(); k++){ + if (s[k] != i && s[k] != j && s[k] % i == 0 && j % s[k] == 0){ + return 0; + } + } + return 1; +} +int main(){ + long long n; + cin >> n; + vector s; + for (int i = 1; i <= n; i++){ + if (n % i == 0){ + s.push_back(i); + } + } + vector > ans; + for (int i = 0; i < s.size(); i++){ + for (int j = i + 1; j < s.size(); j++){ + if (s[j] % s[i] == 0 && check(s, s[i], s[j])){ + ans.push_back({s[i], s[j]}); + } + } + } + cout << "graph {" << endl; + for (int i = 0; i < s.size(); i++){ + cout << s[i] << endl; + } -int main() { - stringstream ss; - string res; - // ещё в код напихаю комментов - ss << "a bwfw ce "; - while(getline(ss, res, ' ')){ //комментарий после строки с кодом - /* - * летс гоу - * худшее место для многострочного коммента - */ - cout << res << endl; /* многострочный однострочно */ + for (int i = 0; i < ans.size(); i++){ + cout << ans[i].first << "--" << ans[i].second << endl; } -} + cout << "}"; +} \ No newline at end of file diff --git a/server/internal/metrics/testProgs/cpp/code2.txt b/server/internal/metrics/testProgs/cpp/code2.txt old mode 100644 new mode 100755 index bd5977aef79849c0850503cc11189ab9ba97f1d1..d387566a40f5000bb4e62421384ebe0b43c63afb --- a/server/internal/metrics/testProgs/cpp/code2.txt +++ b/server/internal/metrics/testProgs/cpp/code2.txt @@ -1,32 +1,49 @@ -// однострочный комментарий -// еще один - -// вау еще один - #include -#include -#include +#include using namespace std; -/* многострочный комм - * // внутри него однострочный - * - */ +bool check1(vector s, int i, int j){ + for (int k = 0; k < s.size(); k++){ + if (s[k] != i && s[k] != j && s[k] % i == 0 && j % s[k] == 0){ + return 0; + } + } + return 1; +} + +int main(){ + long long n1; + cin >> n1; + vector s2; + for (int k = 1; k <= n1; k++){ + if (n1 % k == 0){ + s2.push_back(k); + } + } + if (n % 2 == 0) { + n+=1; + n-=1; + } + + vector > ans; + for (int i = 0; i < s2.size(); i++){ + for (int j = i + 1; j < s2.size(); j++){ + if (s2[j] % s2[i] == 0 && check1(s2, s2[i], s2[j])){ + ans.push_back({s[i], s[j]}); + } + } + } + cout << "graph {"; + cout << '\n'; + for (int k = 0; k < s2.size(); k++){ + cout << s[k] << endl; + } -int main() { - stringstream ss1; - string res1; - // ещё в код напихаю комментов - ss1 << "a bwfw ce "; - cout << "mem"; - while(getline(ss, res1, ' ')){ //комментарий после строки с кодом - /* - * летс гоу - * худшее место для многострочного коммента - */ - cout << res1 << endl; /* многострочный однострочно */ - cout << "mem2" << endl; + for (int i = 0; i < ans.size(); i++){ + cout << ans[i].first << "--" << ans[i].second << endl; } + cout << "}"; + cout << '\n'; } \ No newline at end of file diff --git a/server/internal/metrics/testProgs/cpp/code3.txt b/server/internal/metrics/testProgs/cpp/code3.txt new file mode 100755 index 0000000000000000000000000000000000000000..81966bf7c252c4505f1f71989bb27c16b1c44f5c --- /dev/null +++ b/server/internal/metrics/testProgs/cpp/code3.txt @@ -0,0 +1,12 @@ +#include + +using namespace std; + +int main() { + int a = 0, n; + cin >> n; + for (int i = 0; i < n; i++){ + a++; + cout << a; + } +} \ No newline at end of file diff --git a/server/internal/metrics/testProgs/cpp/code4.txt b/server/internal/metrics/testProgs/cpp/code4.txt new file mode 100755 index 0000000000000000000000000000000000000000..844d2cdfe00935ac33f54e74b027b59984009e65 --- /dev/null +++ b/server/internal/metrics/testProgs/cpp/code4.txt @@ -0,0 +1,45 @@ +#include +#include +#include +#include +using namespace std; +const int inf = 1e9; + + +int main() { + int n, s, f; + cin >> n >> s >> f; + s--; f--; + vector d(n, inf), p(n); + vector u(n); + vector < vector > > g(n); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + int q; + scanf("%d", &q); + if (i > 0) { + + } + } + } + d[s] = 0; + for (int i = 0; i < n; ++i) { + int v = -1; + for (int j = 0; j < n; ++j) + if (!u[j] && (v == -1 || d[j] < d[v])) + v = j; + if (d[v] == inf) break; + u[v] = true; + for (auto j : g[v]) { + int to = j.first; + int len = j.second; + if (d[v] + len < d[to]) { + d[to] = d[v] + len; + p[to] = v; + } + } + + } + cout << (d[f] == inf ? -1 : d[f]) << endl; + return 0; +} \ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/out1.txt b/server/internal/metrics/testProgs/output/out1.txt new file mode 100755 index 0000000000000000000000000000000000000000..87281aa97c959e355d21968b55fc7b792a444270 --- /dev/null +++ b/server/internal/metrics/testProgs/output/out1.txt @@ -0,0 +1,41 @@ + + +
n , m = map ( int , input ( ) ) . split ( ) +
+arr = [ [ 0 for _ in range ( m ) ] for _ in range ( n ) ] +
+current_element = 1 +
+
+for diag_id in range ( n + m ) : +
+    if diag_id 2 == 0 : +
+        for x in range ( n ) : +
+            if 0 <= diag_id - x < m : +
+                arr [ x ] [ diag_id - x ] = current_element +
+                current_element += 1 +
+    else : +
+        for x in reversed ( range ( n ) ) : +
+            if 0 <= diag_id - x < m : +
+                arr [ x ] [ diag_id - x ] = current_element +
+                current_element += 1 + + + + +
+
+for line in arr : +
+    print ( * line ) + ) <EOF>
+ \ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/out2.txt b/server/internal/metrics/testProgs/output/out2.txt new file mode 100755 index 0000000000000000000000000000000000000000..c33d11c863ee032a2202077ae53a8c86cb4b027e --- /dev/null +++ b/server/internal/metrics/testProgs/output/out2.txt @@ -0,0 +1,55 @@ + + +
n , m = map ( int , input ( ) ) . split ( ) +
+arr = [ [ 0 for _ in range ( m ) ] for _ in range ( n ) ] +
+current_element1 = 1 +
+
+for i in range ( n ) : +
+    print ( i ) + +
+
+for diag_id in range ( n + m ) : +
+    if diag_id % 2 == 0 : +
+        for x in range ( n ) : +
+            if 0 <= diag_id - x < m : +
+                arr [ x ] [ diag_id - x ] = current_element +
+                current_element += 1 +
+    else : +
+        for x in reversed ( range ( n ) ) : +
+            if 0 <= diag_id - x < m : +
+                arr [ x ] [ diag_id - x ] = current_element +
+                current_element += 1 +
+            if 0 <= diag_id - x < m : +
+                arr [ x ] [ diag_id - x ] = current_element +
+                current_element += 0 + + + + +
+
+
+
+for line in arr : +
+    print ( * line ) + ) <EOF>
+ \ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/test1.html b/server/internal/metrics/testProgs/output/test1.html new file mode 100755 index 0000000000000000000000000000000000000000..878d452cfe7e23e79299b21837ce98b0e9659c2f --- /dev/null +++ b/server/internal/metrics/testProgs/output/test1.html @@ -0,0 +1,41 @@ + + +
n , m = map ( int , input ( ) ) . split ( ) +
+ arr = [ [ 0 for _ in range ( m ) ] for _ in range ( n ) ] +
+ current_element = 1 +
+
+ for diag_id in range ( n + m ) : +
+     if diag_id 2 == 0 : +
+         for x in range ( n ) : +
+             if 0 <= diag_id - x < m : +
+                 arr [ x ] [ diag_id - x ] = current_element +
+                 current_element += 1 +
+     else : +
+         for x in reversed ( range ( n ) ) : +
+             if 0 <= diag_id - x < m : +
+                 arr [ x ] [ diag_id - x ] = current_element +
+                 current_element += 1 + + + + +
+
+ for line in arr : +
+     print ( * line ) + ) <EOF>
+ \ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/test2.html b/server/internal/metrics/testProgs/output/test2.html new file mode 100755 index 0000000000000000000000000000000000000000..7022d2f94c364f706124de4cc9dc8745212ad2bd --- /dev/null +++ b/server/internal/metrics/testProgs/output/test2.html @@ -0,0 +1,55 @@ + + +
n , m = map ( int , input ( ) ) . split ( ) +
+ arr = [ [ 0 for _ in range ( m ) ] for _ in range ( n ) ] +
+ current_element1 = 1 +
+
+ for i in range ( n ) : +
+     print ( i ) + +
+
+ for diag_id in range ( n + m ) : +
+     if diag_id % 2 == 0 : +
+         for x in range ( n ) : +
+             if 0 <= diag_id - x < m : +
+                 arr [ x ] [ diag_id - x ] = current_element +
+                 current_element += 1 +
+     else : +
+         for x in reversed ( range ( n ) ) : +
+             if 0 <= diag_id - x < m : +
+                 arr [ x ] [ diag_id - x ] = current_element +
+                 current_element += 1 +
+             if 0 <= diag_id - x < m : +
+                 arr [ x ] [ diag_id - x ] = current_element +
+                 current_element += 0 + + + + +
+
+
+
+ for line in arr : +
+     print ( * line ) + ) <EOF>
+ \ No newline at end of file diff --git a/server/internal/metrics/testProgs/python/pycode1.txt b/server/internal/metrics/testProgs/python/pycode1.txt old mode 100644 new mode 100755 diff --git a/server/internal/metrics/testProgs/python/pycode2.txt b/server/internal/metrics/testProgs/python/pycode2.txt old mode 100644 new mode 100755 index 3ddbf2898c2632799f8a351464ae091cf8b8cb5e..e6058de90278c32d93bbcec39a66d98c40a5ef4b --- a/server/internal/metrics/testProgs/python/pycode2.txt +++ b/server/internal/metrics/testProgs/python/pycode2.txt @@ -16,6 +16,11 @@ for diag_id in range(n + m): if 0 <= diag_id - x < m: arr[x][diag_id - x] = current_element current_element += 1 + if 0 <= diag_id - x < m: + arr[x][diag_id - x] = current_element + current_element += 0 + + for line in arr: print(*line) \ No newline at end of file diff --git a/server/internal/metrics/testProgs/python/pycode3.txt b/server/internal/metrics/testProgs/python/pycode3.txt new file mode 100755 index 0000000000000000000000000000000000000000..0b49d05c703b22f73b2b15a7090dbfa2d8e8e6ff --- /dev/null +++ b/server/internal/metrics/testProgs/python/pycode3.txt @@ -0,0 +1,19 @@ +n2, m2 = map(int, input()).split() +arr = [[0 for _ in range(m2)] for _ in range(n2)] +current_element = 1 + +for diag_id1 in range(n2 + m2): + if diag_id1 % 2 == 0: + for x in range(n): + if 0 <= diag_id1 - x < m2: + arr[x][diag_id1 - x] = current_element + current_element += 1 + else: + for x1 in reversed(range(n2)): + if 0 <= diag_id1 - x < m2: + arr[x][diag_id1 - x1] = current_element + current_element += 2 + current_element -= 1 + +for line1 in arr: + print(*line1) \ No newline at end of file diff --git a/server/internal/metrics/testProgs/python/pycode4.txt b/server/internal/metrics/testProgs/python/pycode4.txt new file mode 100755 index 0000000000000000000000000000000000000000..a7f014525b9f8416dd7d3d7306178f37b5281dc8 --- /dev/null +++ b/server/internal/metrics/testProgs/python/pycode4.txt @@ -0,0 +1,22 @@ +table = '' + + +def reverse_table(n): + global table + if n != 0: + str = input() + reverse_table(n - 1) + table += str[::-1] + '\n' + + + +n, m = map(int, input().split()) +reverse_table(n) +table = list(table) + +for i in range(len(table) - 1, 0, -1): + if table[i] == '\\' or table[i] == '/': + table[i + m + 1] = table[i] + table[i] = table[i - m - 1] + +print(''.join(table)) \ No newline at end of file diff --git a/server/internal/metrics/tests/CMakeLists.txt b/server/internal/metrics/tests/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/internal/metrics/tests/src/main.cpp b/server/internal/metrics/tests/src/main.cpp old mode 100644 new mode 100755 diff --git a/server/internal/metrics/tests/src/test-codes/code1.txt b/server/internal/metrics/tests/src/test-codes/code1.txt old mode 100644 new mode 100755 diff --git a/server/internal/metrics/tests/src/text_metrics_tests.cpp b/server/internal/metrics/tests/src/text_metrics_tests.cpp old mode 100644 new mode 100755 diff --git a/server/internal/metrics/tests/src/token_metrics_tests.cpp b/server/internal/metrics/tests/src/token_metrics_tests.cpp old mode 100644 new mode 100755 index 8125295da8c456d82741bddedbfa5ea58304c2cf..9dde3287edc272cb1fac843a8b407c6043164944 --- a/server/internal/metrics/tests/src/token_metrics_tests.cpp +++ b/server/internal/metrics/tests/src/token_metrics_tests.cpp @@ -5,7 +5,6 @@ #include #include -#include #include #include "TokenMetricLib.h" @@ -61,7 +60,7 @@ TEST_F(WShinglingTokenMetricTest, check_eq_progs) { TEST_F(WShinglingTokenMetricTest, check_absolutely_not_eq_progs) { std::vector tokens1 = {1, 2, 3}; - std::vector tokens2 = {4, 5, 6, 9}; + std::vector tokens2 = {4, 5, 6}; wShinglingTokenMetric->setData(tokens1, tokens2); @@ -77,15 +76,25 @@ TEST_F(WShinglingTokenMetricTest, test_with_empty_prog) { EXPECT_EQ(wShinglingTokenMetric->getMetric(), 0); } -TEST_F(WShinglingTokenMetricTest, test_with_small_prog) { - std::vector tokens1 = {1, 2, 3, 4}; - std::vector tokens2 = {9}; +TEST_F(WShinglingTokenMetricTest, test_with_empty_progs) { + std::vector tokens1 = {}; + std::vector tokens2 = {}; wShinglingTokenMetric->setData(tokens1, tokens2); EXPECT_EQ(wShinglingTokenMetric->getMetric(), 0); } +TEST_F(WShinglingTokenMetricTest, test_with_small_size) { + std::vector tokens1 = {1}; + std::vector tokens2 = {2, 3}; + + wShinglingTokenMetric->setData(tokens1, tokens2); + + double res = wShinglingTokenMetric->getMetric(); + EXPECT_EQ(res, 0); +} + TEST_F(WShinglingTokenMetricTest, test_with_big_size) { std::vector tokens = {9, 45, 132, 85, 86, 89, 78, 45, 132, 128, 45, 132, 101, 1, 128, 132, 127, 132, 103, 103, 132, 128, 84, 85, 132, 115, 1, 86, diff --git a/server/internal/repository/CMakeLists.txt b/server/internal/repository/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/internal/repository/include/MetricRepository.hpp b/server/internal/repository/include/MetricRepository.hpp old mode 100644 new mode 100755 diff --git a/server/internal/repository/include/SolutionRepository.hpp b/server/internal/repository/include/SolutionRepository.hpp old mode 100644 new mode 100755 diff --git a/server/internal/repository/include/TaskRepository.hpp b/server/internal/repository/include/TaskRepository.hpp old mode 100644 new mode 100755 diff --git a/server/internal/repository/include/UserRepository.hpp b/server/internal/repository/include/UserRepository.hpp old mode 100644 new mode 100755 diff --git a/server/internal/repository/src/MetricRepository.cpp b/server/internal/repository/src/MetricRepository.cpp old mode 100644 new mode 100755 diff --git a/server/internal/repository/src/SolutionRepository.cpp b/server/internal/repository/src/SolutionRepository.cpp old mode 100644 new mode 100755 diff --git a/server/internal/repository/src/TaskRepository.cpp b/server/internal/repository/src/TaskRepository.cpp old mode 100644 new mode 100755 diff --git a/server/internal/repository/src/UserRepository.cpp b/server/internal/repository/src/UserRepository.cpp old mode 100644 new mode 100755 diff --git a/server/internal/repository/tests/CMakeLists.txt b/server/internal/repository/tests/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/internal/repository/tests/RepositoryTests.cpp b/server/internal/repository/tests/RepositoryTests.cpp old mode 100644 new mode 100755 diff --git a/server/internal/repository/virtual/IMetricRepository.hpp b/server/internal/repository/virtual/IMetricRepository.hpp old mode 100644 new mode 100755 diff --git a/server/internal/repository/virtual/ISolutionRepository.hpp b/server/internal/repository/virtual/ISolutionRepository.hpp old mode 100644 new mode 100755 diff --git a/server/internal/repository/virtual/ITaskRepository.hpp b/server/internal/repository/virtual/ITaskRepository.hpp old mode 100644 new mode 100755 diff --git a/server/internal/repository/virtual/IUserRepository.hpp b/server/internal/repository/virtual/IUserRepository.hpp old mode 100644 new mode 100755 diff --git a/server/internal/service/CMakeLists.txt b/server/internal/service/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/internal/service/include/FileMethods.h b/server/internal/service/include/FileMethods.h old mode 100644 new mode 100755 diff --git a/server/internal/service/include/ServiceExceptions.h b/server/internal/service/include/ServiceExceptions.h old mode 100644 new mode 100755 diff --git a/server/internal/service/include/ServiceUtils.h b/server/internal/service/include/ServiceUtils.h old mode 100644 new mode 100755 diff --git a/server/internal/service/include/SolutionService.h b/server/internal/service/include/SolutionService.h old mode 100644 new mode 100755 index d89a6514b30aa8558508dc5b30355572c4569c5c..2c47a9908e534bd74a2a028d7660047c02a8f839 --- a/server/internal/service/include/SolutionService.h +++ b/server/internal/service/include/SolutionService.h @@ -4,7 +4,6 @@ #include #include "IAntlrWrapper.h" -#include "IMockMetrics.h" #include "ISolutionRepository.hpp" #include "ISolutionService.h" #include "ITaskRepository.hpp" @@ -19,7 +18,7 @@ class SolutionService : public ISolutionService { std::unique_ptr textMetric; std::unique_ptr tokenMetric; void setAntlrWrapper(const std::string& fileExtension, const std::string& filedata); - std::string setResultVerdict(float textBasedRes, float tokenBasedRes, size_t plagiatSolId, float treshold); + std::pair setResultVerdict(float textBasedRes, float tokenBasedRes, float treshold); std::pair getMaxTextResMetric(std::vector& solutions, const std::string& filedata, size_t userId, float treshold); @@ -30,8 +29,8 @@ class SolutionService : public ISolutionService { explicit SolutionService(std::unique_ptr solutionRepo, std::unique_ptr taskRepo); SolutionService(); - Solution createSolution(size_t userId, size_t taskId, const std::string& filename, - const std::string& filedata) override; + std::pair createSolution(size_t userId, size_t taskId, const std::string& filename, + const std::string& filedata) override; void deleteSolutionById(size_t solId) override; std::vector getSolutionsByUserAndTaskId(size_t user_id, size_t task_id) override; std::pair getMetrics(size_t solId) override; diff --git a/server/internal/service/include/TaskService.h b/server/internal/service/include/TaskService.h old mode 100644 new mode 100755 diff --git a/server/internal/service/include/UserService.h b/server/internal/service/include/UserService.h old mode 100644 new mode 100755 diff --git a/server/internal/service/include/UserValidator.h b/server/internal/service/include/UserValidator.h old mode 100644 new mode 100755 diff --git a/server/internal/service/src/FileMethods.cpp b/server/internal/service/src/FileMethods.cpp old mode 100644 new mode 100755 diff --git a/server/internal/service/src/ServiceUtils.cpp b/server/internal/service/src/ServiceUtils.cpp old mode 100644 new mode 100755 diff --git a/server/internal/service/src/SolutionService.cpp b/server/internal/service/src/SolutionService.cpp old mode 100644 new mode 100755 index bf63eacdd78fca61a7046955dcba8acdbcf5a11a..877df41e06d4d4ef5b7416237951af12b0d49e4b --- a/server/internal/service/src/SolutionService.cpp +++ b/server/internal/service/src/SolutionService.cpp @@ -6,6 +6,7 @@ #include #include +#include "DiffLib.h" #include "FileMethods.h" #include "MyCppAntlr.h" #include "PythonAntlr.h" @@ -35,30 +36,26 @@ void SolutionService::setAntlrWrapper(const std::string& fileExtension, const st } } -std::string SolutionService::setResultVerdict(float textBasedRes, float tokenBasedRes, size_t plagiatSolId, - float treshold = 0.5f) { +std::pair SolutionService::setResultVerdict(float textBasedRes, float tokenBasedRes, + float treshold = 0.5f) { float meanRes = (tokenBasedRes + textBasedRes) / 2; if (meanRes < treshold) { - return (boost::format("\n%s\nРезультаты метрик: %.2f\n\tАнализ текста: %.2f\n\tАнализ токенов: %.2f") % - NOT_PLAGIAT_VERDICT % meanRes % textBasedRes % tokenBasedRes) - .str(); - } - try { - std::string closestCode = solutionRepo->getSolutionById(plagiatSolId).value().getSource(); - return (boost::format( - "\n%s\nРезультаты метрик: %.2f\n\tАнализ текста: %.2f\n\tАнализ токенов: %.2f\nОчень похоже на " - "решение, отправленное до вас:\n%s") % - PLAGIAT_VERDICT % meanRes % textBasedRes % tokenBasedRes % closestCode) - .str(); - } catch (...) { - throw; + return std::make_pair( + (boost::format("\n%s\nРезультаты метрик: %.2f\n\tАнализ текста: %.2f\n\tАнализ токенов: %.2f") % + NOT_PLAGIAT_VERDICT % meanRes % textBasedRes % tokenBasedRes) + .str(), + NOT_PLAGIAT_VERDICT); } + return std::make_pair( + (boost::format("\n%s\nРезультаты метрик: %.2f\n\tАнализ текста: %.2f\n\tАнализ токенов: %.2f\n") % + PLAGIAT_VERDICT % meanRes % textBasedRes % tokenBasedRes) + .str(), + PLAGIAT_VERDICT); } std::pair SolutionService::getMaxTextResMetric(std::vector& solutions, const std::string& filedata, size_t userId, float treshold) { - // std::cout << "getMaxTextResMetric start" << std::endl; std::pair maxMatch = std::make_pair(0.0, 0); for (auto sol : solutions) { if (sol.getSenderId() == userId) { @@ -81,7 +78,6 @@ std::pair SolutionService::getMaxTextResMetric(std::vector SolutionService::getMaxTokenResMetric(std::vector& tokens, size_t userId, float treshold) { std::pair maxMatch = std::make_pair(0.0, 0); - // std::cout << "getMaxTokenResMetric start" << std::endl; for (auto sol : solutions) { if (sol.getSenderId() == userId) { continue; @@ -113,12 +108,12 @@ std::pair SolutionService::getMaxTokenResMetric(std::vector SolutionService::createSolution(size_t userId, size_t taskId, + const std::string& filename, + const std::string& filedata) { try { std::pair fileExtension = FileMethods::checkFileExtension(filename); if (!fileExtension.second) { @@ -127,6 +122,7 @@ Solution SolutionService::createSolution(size_t userId, size_t taskId, const std setAntlrWrapper(fileExtension.first, filedata); std::vector tokensTypes = antlr->getTokensTypes(); + auto curTokensNamesWithFullPosition = antlr->getTokensNamesWithFullPosition(); std::string astTree = antlr->getTreeString(); std::time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); @@ -147,22 +143,33 @@ Solution SolutionService::createSolution(size_t userId, size_t taskId, const std t1.join(); t2.join(); - size_t plagiatSolId = 1; - if (textBasedRes.first > tokenBasedRes.first) { - plagiatSolId = textBasedRes.second; - } else { - plagiatSolId = tokenBasedRes.second; + std::pair result = + setResultVerdict(textBasedRes.first, tokenBasedRes.first, treshold); + + size_t plagiatSolId = 0; + Solution::Codes codes; + if (result.second == PLAGIAT_VERDICT) { + if (textBasedRes.first > tokenBasedRes.first) { + plagiatSolId = textBasedRes.second; + } else { + plagiatSolId = tokenBasedRes.second; + } + Solution originalSol = solutionRepo->getSolutionById(plagiatSolId).value(); + setAntlrWrapper(originalSol.getLanguage(), originalSol.getSource()); + auto originalTokensNamesWithFullPosition = antlr->getTokensNamesWithFullPosition(); + FoundSame foundSame; + foundSame.setData(originalTokensNamesWithFullPosition, curTokensNamesWithFullPosition); + std::pair res = foundSame.getTexts(); + codes = Solution::Codes(res.first, res.second); } - std::string result = setResultVerdict(textBasedRes.first, tokenBasedRes.first, plagiatSolId, treshold); - Solution sol = - Solution(std::ctime(&now), userId, filedata, taskId, result, Utils::convertIntArrayIntoString(tokensTypes), - astTree, plagiatSolId, fileExtension.first); + Solution(std::ctime(&now), userId, filedata, taskId, result.first, + Utils::convertIntArrayIntoString(tokensTypes), astTree, plagiatSolId, fileExtension.first); size_t id = solutionRepo->storeSolution(sol); sol.setId(id); - return sol; + return std::make_pair(sol, codes); } catch (...) { throw; } diff --git a/server/internal/service/src/TaskService.cpp b/server/internal/service/src/TaskService.cpp old mode 100644 new mode 100755 diff --git a/server/internal/service/src/UserService.cpp b/server/internal/service/src/UserService.cpp old mode 100644 new mode 100755 diff --git a/server/internal/service/src/UserValidator.cpp b/server/internal/service/src/UserValidator.cpp old mode 100644 new mode 100755 diff --git a/server/internal/service/tests/CMakeLists.txt b/server/internal/service/tests/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/internal/service/tests/SolutionServiceTest.cpp b/server/internal/service/tests/SolutionServiceTest.cpp old mode 100644 new mode 100755 index e8f9130a1be5cae4e6294a9bfbe4f8c253e84199..312f367d89939e554592513274439adb193cabb6 --- a/server/internal/service/tests/SolutionServiceTest.cpp +++ b/server/internal/service/tests/SolutionServiceTest.cpp @@ -101,12 +101,12 @@ TEST_F(SolutionServiceTest, createSolutionPlagiat) { .WillOnce(::testing::Return(std::make_optional( Solution(0, "", 1, "int main(){return 0;}", 1, "", "45 132 85 86 89 59 1 128 90 -1", "", -1, "cpp")))); - Solution sol = ss->createSolution(2, 1, "main.cpp", "size_t main(){return 1;}"); - EXPECT_EQ(sol.getId(), 1); + auto sol = ss->createSolution(2, 1, "main.cpp", "size_t main(){return 1;}"); + EXPECT_EQ(sol.first.getId(), 1); + // EXPECT_EQ(sol.second.original, "int main(){return 0;}"); EXPECT_EQ( - sol.getResult(), - "\nНе, ну вы не палитесь. Плагиат.\nРезультаты метрик: 0.72\n\tАнализ текста: 0.54\n\tАнализ токенов: 0.89" - "\nОчень похоже на решение, отправленное до вас:\nint main(){return 0;}"); + sol.first.getResult(), + "\nНе, ну вы не палитесь. Плагиат.\nРезультаты метрик: 0.72\n\tАнализ текста: 0.54\n\tАнализ токенов: 0.89\n"); } TEST_F(SolutionServiceTest, createSolutionNonPlagiat) { @@ -123,7 +123,7 @@ TEST_F(SolutionServiceTest, createSolutionNonPlagiat) { EXPECT_CALL(*taskMockPtr, getTaskById(1)).Times(1).WillOnce(::testing::Return(Task(1, "desription", 0.5f, "name"))); - Solution sol = ss->createSolution(1, 1, "main.cpp", "int main(){return 0;}"); + Solution sol = ss->createSolution(1, 1, "main.cpp", "int main(){return 0;}").first; EXPECT_EQ(sol.getResult(), "\nКрасивое решение. А главное уникальное !\nРезультаты метрик: 0.00\n\tАнализ текста: 0.00\n\tАнализ " "токенов: 0.00"); diff --git a/server/internal/service/tests/TaskServiceTest.cpp b/server/internal/service/tests/TaskServiceTest.cpp old mode 100644 new mode 100755 diff --git a/server/internal/service/tests/UserServiceTest.cpp b/server/internal/service/tests/UserServiceTest.cpp old mode 100644 new mode 100755 diff --git a/server/internal/service/tests/UserValidatorTest.cpp b/server/internal/service/tests/UserValidatorTest.cpp old mode 100644 new mode 100755 diff --git a/server/internal/service/tests/main.cpp b/server/internal/service/tests/main.cpp old mode 100644 new mode 100755 diff --git a/server/internal/service/virtual/IMockMetrics.h b/server/internal/service/virtual/IMockMetrics.h deleted file mode 100644 index fc0a93f5ae08f1f06eaebe2ced75c9e79e77f948..0000000000000000000000000000000000000000 --- a/server/internal/service/virtual/IMockMetrics.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -class IMockMetrics { - public: - virtual void countMetric(); -}; diff --git a/server/internal/service/virtual/ISolutionService.h b/server/internal/service/virtual/ISolutionService.h old mode 100644 new mode 100755 index 7c1294d9ee88ed3773833f5df94510a595af8305..5449ab6d79c723f17a7615f369010d6f4fa118af --- a/server/internal/service/virtual/ISolutionService.h +++ b/server/internal/service/virtual/ISolutionService.h @@ -8,8 +8,9 @@ class ISolutionService { public: virtual ~ISolutionService() = default; - virtual Solution createSolution(size_t userId, size_t taskId, const std::string& filename, - const std::string& filedata) = 0; + virtual std::pair createSolution(size_t userId, size_t taskId, + const std::string& filename, + const std::string& filedata) = 0; virtual void deleteSolutionById(size_t solId) = 0; virtual std::vector getSolutionsByUserAndTaskId(size_t user_id, size_t task_id) = 0; virtual std::pair getMetrics(size_t solId) = 0; diff --git a/server/internal/service/virtual/ITaskService.h b/server/internal/service/virtual/ITaskService.h old mode 100644 new mode 100755 diff --git a/server/internal/service/virtual/IUserService.h b/server/internal/service/virtual/IUserService.h old mode 100644 new mode 100755 diff --git a/server/pkg/CMakeLists.txt b/server/pkg/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/pkg/antlr/CMakeLists.txt b/server/pkg/antlr/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/pkg/antlr/cmake/ExternalAntlr4Cpp.cmake b/server/pkg/antlr/cmake/ExternalAntlr4Cpp.cmake old mode 100644 new mode 100755 diff --git a/server/pkg/antlr/cmake/FindANTLR.cmake b/server/pkg/antlr/cmake/FindANTLR.cmake old mode 100644 new mode 100755 diff --git a/server/pkg/antlr/cmake/antlr4-generator.cmake.in b/server/pkg/antlr/cmake/antlr4-generator.cmake.in old mode 100644 new mode 100755 diff --git a/server/pkg/antlr/cmake/antlr4-runtime.cmake.in b/server/pkg/antlr/cmake/antlr4-runtime.cmake.in old mode 100644 new mode 100755 diff --git a/server/pkg/antlr/cpp14/CMakeLists.txt b/server/pkg/antlr/cpp14/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/pkg/antlr/cpp14/CPP14Lexer.g4 b/server/pkg/antlr/cpp14/CPP14Lexer.g4 old mode 100644 new mode 100755 diff --git a/server/pkg/antlr/cpp14/CPP14Parser.g4 b/server/pkg/antlr/cpp14/CPP14Parser.g4 old mode 100644 new mode 100755 diff --git a/server/pkg/antlr/cpp14/include/MyCppAntlr.h b/server/pkg/antlr/cpp14/include/MyCppAntlr.h old mode 100644 new mode 100755 index 8e2d32892937d16a74c27e9a3065e75a30376693..57ac29b48f18a1520866df94cf6d4e52a106d341 --- a/server/pkg/antlr/cpp14/include/MyCppAntlr.h +++ b/server/pkg/antlr/cpp14/include/MyCppAntlr.h @@ -20,6 +20,9 @@ class MyCppAntlr : public IAntlrWrapper { ~MyCppAntlr() override = default; std::vector getTokens() override; std::vector getTokensTypes() override; + std::vector getTokensNames() override; + std::vector> getTokensNamesWithPosition() override; + std::vector>> getTokensNamesWithFullPosition() override; std::pair getTokensAndTree() override; std::string getTokensString() override; std::string getTreeString() override; diff --git a/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp b/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp old mode 100644 new mode 100755 index fcbc51928044a01cbc1ecec2fc22a74087c3af55..5f781048ab53627df53884f0b92cdc4e0ea324f7 --- a/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp +++ b/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp @@ -22,6 +22,37 @@ std::vector MyCppAntlr::getTokens() { return ans; } +std::vector> MyCppAntlr::getTokensNamesWithPosition() { + tokenStream_ptr->fill(); + std::vector> ans(tokenStream_ptr->size()); + + int i = 0; + for (antlr4::Token* token : tokenStream_ptr->getTokens()) { + auto type = token->getText(); + int line = token->getLine(); + ans[i] = std::make_pair(type, line); + i++; + } + + return ans; +} + +std::vector>> MyCppAntlr::getTokensNamesWithFullPosition() { + tokenStream_ptr->fill(); + std::vector>> ans(tokenStream_ptr->size()); + + size_t i = 0; + for (antlr4::Token* token : tokenStream_ptr->getTokens()) { + auto type = token->getText(); + int line = static_cast(token->getLine()); + int pos = static_cast(token->getCharPositionInLine()); + ans[i] = std::make_pair(type, std::make_pair(line, pos)); + i++; + } + + return ans; +} + std::vector MyCppAntlr::getTokensTypes() { tokenStream_ptr->fill(); std::vector ans(tokenStream_ptr->size()); @@ -39,6 +70,19 @@ std::vector MyCppAntlr::getTokensTypes() { return ans; } +std::vector MyCppAntlr::getTokensNames() { + tokenStream_ptr->fill(); + std::vector ans(tokenStream_ptr->size()); + + int i = 0; + for (antlr4::Token* token : tokenStream_ptr->getTokens()) { + ans[i] = token->getText(); + i++; + } + + return ans; +} + std::string MyCppAntlr::getTokensString() { tokenStream_ptr->fill(); std::string res; diff --git a/server/pkg/antlr/python3/CMakeLists.txt b/server/pkg/antlr/python3/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/server/pkg/antlr/python3/Python3.g4 b/server/pkg/antlr/python3/Python3.g4 old mode 100644 new mode 100755 diff --git a/server/pkg/antlr/python3/include/PythonAntlr.h b/server/pkg/antlr/python3/include/PythonAntlr.h old mode 100644 new mode 100755 index aee2aa3dd36b3becf9e8069dcc9d335a80db19d1..dc1959ea83ecf389423ee251a2914263dd02fa5e --- a/server/pkg/antlr/python3/include/PythonAntlr.h +++ b/server/pkg/antlr/python3/include/PythonAntlr.h @@ -21,6 +21,9 @@ class PythonAntlr : public IAntlrWrapper { ~PythonAntlr() override = default; std::vector getTokens() override; std::vector getTokensTypes() override; + std::vector getTokensNames() override; + std::vector> getTokensNamesWithPosition() override; + std::vector>> getTokensNamesWithFullPosition() override; std::pair getTokensAndTree() override; std::string getTokensString() override; std::string getTreeString() override; diff --git a/server/pkg/antlr/python3/src/PythonAntlr.cpp b/server/pkg/antlr/python3/src/PythonAntlr.cpp old mode 100644 new mode 100755 index 013966ff854f0149072303182d3fcbb00145d261..1aece1879b4d7540bc180846b88df4f1b6a4103f --- a/server/pkg/antlr/python3/src/PythonAntlr.cpp +++ b/server/pkg/antlr/python3/src/PythonAntlr.cpp @@ -22,6 +22,37 @@ std::vector PythonAntlr::getTokens() { return ans; } +std::vector> PythonAntlr::getTokensNamesWithPosition() { + tokenStream_ptr->fill(); + std::vector> ans(tokenStream_ptr->size()); + + int i = 0; + for (antlr4::Token* token : tokenStream_ptr->getTokens()) { + auto type = token->getText(); + int line = token->getLine(); + ans[i] = std::make_pair(type, line); + i++; + } + + return ans; +} + +std::vector>> PythonAntlr::getTokensNamesWithFullPosition() { + tokenStream_ptr->fill(); + std::vector>> ans(tokenStream_ptr->size()); + + size_t i = 0; + for (antlr4::Token* token : tokenStream_ptr->getTokens()) { + auto type = token->getText(); + int line = token->getLine(); + int pos = token->getCharPositionInLine(); + ans[i] = std::make_pair(type, std::make_pair(line, pos)); + i++; + } + + return ans; +} + std::vector PythonAntlr::getTokensTypes() { tokenStream_ptr->fill(); std::vector ans(tokenStream_ptr->size()); @@ -50,6 +81,19 @@ std::string PythonAntlr::getTokensString() { return res; } +std::vector PythonAntlr::getTokensNames() { + tokenStream_ptr->fill(); + std::vector ans(tokenStream_ptr->size()); + + int i = 0; + for (antlr4::Token* token : tokenStream_ptr->getTokens()) { + ans[i] = token->getText(); + i++; + } + + return ans; +} + std::string PythonAntlr::getTreeString() { auto tree = parser_ptr->file_input(); return tree->toStringTree(&(*parser_ptr)); diff --git a/server/pkg/antlr/testprogs/cpp/test.cpp b/server/pkg/antlr/testprogs/cpp/test.cpp old mode 100644 new mode 100755 diff --git a/server/pkg/antlr/testprogs/python/test.py b/server/pkg/antlr/testprogs/python/test.py old mode 100644 new mode 100755 diff --git a/server/pkg/antlr/virtual/IAntlrWrapper.h b/server/pkg/antlr/virtual/IAntlrWrapper.h old mode 100644 new mode 100755 index 824119e67d6d1ea283b23f9556308abd30eac966..66bb8f48206841142655026ce2aec4dc24f7b4ec --- a/server/pkg/antlr/virtual/IAntlrWrapper.h +++ b/server/pkg/antlr/virtual/IAntlrWrapper.h @@ -10,6 +10,9 @@ class IAntlrWrapper { virtual ~IAntlrWrapper() = default; virtual std::vector getTokens() = 0; virtual std::vector getTokensTypes() = 0; + virtual std::vector getTokensNames() = 0; + virtual std::vector> getTokensNamesWithPosition() = 0; + virtual std::vector>> getTokensNamesWithFullPosition() = 0; virtual std::pair getTokensAndTree() = 0; virtual std::string getTokensString() = 0; virtual std::string getTreeString() = 0; diff --git a/sql/database.sql b/sql/database.sql old mode 100644 new mode 100755