From f4c0bc632fc358cfe7a527d917a198d98a9b7b05 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Mon, 11 Apr 2016 10:34:28 -0400 Subject: [PATCH] (API CHANGE) Enhance the sysadm-pkg search functionality a bit: 1) Add a new optional argument to the pkg_search action: "search_excludes" (string or array of strings). This will exclude matches which contain a restricted string. 2) Add a new output field to the search results: "pkg_search":{"results_order":[list of origins by priority], } 3) Adjust how the search is performed when the search term has multiple words. First look for any result which contains all the words, then if nothing is found look for any result which contains any of the words. --- src/server/WebBackend.cpp | 9 +++++- src/server/library/sysadm-pkg.cpp | 49 +++++++++++++++++++++++++------ src/server/library/sysadm-pkg.h | 2 +- 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/src/server/WebBackend.cpp b/src/server/WebBackend.cpp index 753cf50..f61cd8f 100644 --- a/src/server/WebBackend.cpp +++ b/src/server/WebBackend.cpp @@ -726,11 +726,18 @@ RestOutputStruct::ExitCode WebSocket::EvaluateSysadmPkgRequest(const QJsonValue //REQUIRED: "search_term" (string to search for) //OPTIONAL: "repo" //OPTIONAL: "category" + //OPTIONAL: "search_excludes" (array of string or single string); QString srch = in_args.toObject().value("search_term").toString(); if(srch.isEmpty()){ return RestOutputStruct::BADREQUEST; } - QStringList pkgs = sysadm::PKG::pkg_search(repo, srch, cat); + QStringList exclude; + if(in_args.toObject().contains("search_excludes")){ + if(in_args.toObject().value("search_excludes").isString()){ exclude << in_args.toObject().value("search_excludes").toString(); } + else if(in_args.toObject().value("search_excludes").isArray()){ exclude = JsonArrayToStringList( in_args.toObject().value("search_excludes").toArray() ); } + } + QStringList pkgs = sysadm::PKG::pkg_search(repo, srch, exclude, cat); if(!pkgs.isEmpty()){ QJsonObject info = sysadm::PKG::pkg_info(pkgs, repo, cat, false); //always do simple results for a search + info.insert("results_order", QJsonArray::fromStringList(pkgs)); if(!info.isEmpty()){ out->insert("pkg_search",info); } }else{ return RestOutputStruct::NOCONTENT; diff --git a/src/server/library/sysadm-pkg.cpp b/src/server/library/sysadm-pkg.cpp index 580bfd9..99618d7 100644 --- a/src/server/library/sysadm-pkg.cpp +++ b/src/server/library/sysadm-pkg.cpp @@ -89,18 +89,28 @@ inline void checkDB(QString repo){ // ================= QJsonObject PKG::pkg_info(QStringList origins, QString repo, QString category, bool fullresults){ QJsonObject retObj; + //if(origins.contains("math/R")){ qDebug() << "pkg_info:" << repo << category; } checkDB(repo); //create if needed QSqlDatabase DB = QSqlDatabase::database(repo); if(!DB.isOpen()){ return retObj; } //could not open DB (file missing?) //Now do all the pkg info, one pkg origin at a time origins.removeAll(""); + origins.removeDuplicates(); QString q_string = "SELECT * FROM packages"; - if(!origins.isEmpty()){ q_string.append(" WHERE origin = '"+origins.join("' OR origin = '")+"'"); } + if(!origins.isEmpty()){ + q_string.append(" WHERE origin IN ('"+origins.join("', '")+"')"); + //Also keep the ordering of the origins preserved + /*q_string.append(" ORDER BY CASE origins "); + for(int i=0; i