summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Pritz <bluewind@xinu.at>2018-02-21 15:49:05 +0100
committerLukas Fleischer <lfleischer@archlinux.org>2018-02-24 14:57:31 +0100
commitf51d4c32cd8bed69d2f6b0c50424280613c68496 (patch)
treeeeece4750080f1cb269809ce27826aa8e34273b4
parent34a0d399103a3b866995e54f03ac75740fdd26a0 (diff)
downloadaur-f51d4c32cd8bed69d2f6b0c50424280613c68496.tar.gz
aur-f51d4c32cd8bed69d2f6b0c50424280613c68496.tar.xz
Remove disjunction in pkg_providers query
For some reason, running the SELECT .. WHERE .. OR .. query takes e.g. 58ms on a randomly generated db for some dependency name. Splitting the OR into two dedicated queries and UNIONing the result takes only 0.42ms. On the Arch Linux installation, searching for the providers of e.g. mongodb takes >=110ms when not cached by the query cache. The new query takes <1ms even when not cached. Signed-off-by: Florian Pritz <bluewind@xinu.at> Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
-rw-r--r--web/lib/pkgfuncs.inc.php6
1 files changed, 4 insertions, 2 deletions
diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php
index d022ebe5..ad254746 100644
--- a/web/lib/pkgfuncs.inc.php
+++ b/web/lib/pkgfuncs.inc.php
@@ -212,10 +212,12 @@ function pkg_groups($pkgid) {
function pkg_providers($name) {
$dbh = DB::connect();
$q = "SELECT p.ID, p.Name FROM Packages p ";
+ $q.= "WHERE p.Name = " . $dbh->quote($name) . " ";
+ $q.= "UNION ";
+ $q.= "SELECT p.ID, p.Name FROM Packages p ";
$q.= "LEFT JOIN PackageRelations pr ON pr.PackageID = p.ID ";
$q.= "LEFT JOIN RelationTypes rt ON rt.ID = pr.RelTypeID ";
- $q.= "WHERE p.Name = " . $dbh->quote($name) . " ";
- $q.= "OR (rt.Name = 'provides' ";
+ $q.= "WHERE (rt.Name = 'provides' ";
$q.= "AND pr.RelName = " . $dbh->quote($name) . ")";
$q.= "UNION ";
$q.= "SELECT 0, Name FROM OfficialProviders ";