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