diff --git a/include/class.orm.php b/include/class.orm.php index b95735e0dca6553dfdabe9f68f0faa23153590a6..35886ad1f619298310582337a51679a931ca50ad 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 bc44af16be23305b4ae073c4dded6695e0c3f446..1f403f211cafdfd7d926bf3b88a2d18dc9fe557e 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();