From fb582e4e51c0fb3bb0e21c19becf04ef841c9e21 Mon Sep 17 00:00:00 2001 From: Peter Rotich <peter@enhancesoft.com> Date: Mon, 22 Oct 2018 15:11:38 +0000 Subject: [PATCH] ORM: Extra Joins This commits adds ability to add extra joins to a queryset. If the join has constraints then it's LEFT joined otherwise straight JOIN is assumed. This is necessary to fix queue counts for queues with keyword search. --- include/class.orm.php | 16 ++++++++++++++++ include/class.search.php | 9 +++++++++ 2 files changed, 25 insertions(+) diff --git a/include/class.orm.php b/include/class.orm.php index b95735e0d..35886ad1f 100644 --- a/include/class.orm.php +++ b/include/class.orm.php @@ -1287,6 +1287,10 @@ class QuerySet implements IteratorAggregate, ArrayAccess, Serializable, Countabl return $this; } + function addExtraJoin(array $join) { + return $this->extra(array('joins' => array($join))); + } + function distinct() { foreach (func_get_args() as $D) $this->distinct[] = $D; @@ -2633,6 +2637,18 @@ class SqlCompiler { $sql .= $join.$S; } } + + // Add extra joins from QuerySet + if (isset($queryset->extra['joins'])) { + foreach ($queryset->extra['joins'] as $J) { + list($base, $constraints, $alias) = $J; + $join = $constraints ? ' LEFT JOIN ' : ' JOIN '; + $sql .= "{$join}{$base} $alias"; + if ($constraints instanceof Q) + $sql .= ' ON ('.$this->compileQ($constraints, $queryset->model).')'; + } + } + return $sql; } diff --git a/include/class.search.php b/include/class.search.php index bc44af16b..1f403f211 100644 --- a/include/class.search.php +++ b/include/class.search.php @@ -902,6 +902,15 @@ class SavedQueue extends CustomQueue { $query->aggregate(array( "q{$queue->id}" => SqlAggregate::COUNT($expr, true) )); + + // Add extra tables joins (if any) + if ($Q->extra && isset($Q->extra['tables'])) { + $contraints = array(); + if ($Q->constraints) + $constraints = new Q($Q->constraints); + foreach ($Q->extra['tables'] as $T) + $query->addExtraJoin(array($T, $constraints, '')); + } } $counts = $query->values()->one(); -- GitLab