summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
authorAngie Byron <webchick@24967.no-reply.drupal.org>2010-12-31 20:43:43 +0000
committerAngie Byron <webchick@24967.no-reply.drupal.org>2010-12-31 20:43:43 +0000
commit98f287b55a88d06199cda88b6929af589c182e23 (patch)
tree50b7a7a71eb8c54e417cbaa8f4d6f1a975e9d72f /includes
parent0c8931dd76d066c5332846d478964d1145c5c6c2 (diff)
downloadbrdo-98f287b55a88d06199cda88b6929af589c182e23.tar.gz
brdo-98f287b55a88d06199cda88b6929af589c182e23.tar.bz2
#1001242 by agentrickard, pwolanin, Crell, chx: Add DBTNG support for EXISTS conditions.
Diffstat (limited to 'includes')
-rw-r--r--includes/database/query.inc86
-rw-r--r--includes/database/select.inc32
2 files changed, 117 insertions, 1 deletions
diff --git a/includes/database/query.inc b/includes/database/query.inc
index 7c590c220..de421b30c 100644
--- a/includes/database/query.inc
+++ b/includes/database/query.inc
@@ -77,6 +77,28 @@ interface QueryConditionInterface {
public function isNotNull($field);
/**
+ * Sets a condition that the specified subquery returns values.
+ *
+ * @param SelectQueryInterface $select
+ * The subquery that must contain results.
+ *
+ * @return QueryConditionInterface
+ * The called object.
+ */
+ public function exists(SelectQueryInterface $select);
+
+ /**
+ * Sets a condition that the specified subquery returns no values.
+ *
+ * @param SelectQueryInterface $select
+ * The subquery that must not contain results.
+ *
+ * @return QueryConditionInterface
+ * The called object.
+ */
+ public function notExists(SelectQueryInterface $select);
+
+ /**
* Gets a complete list of all conditions in this conditional clause.
*
* This method returns by reference. That allows alter hooks to access the
@@ -727,6 +749,22 @@ class DeleteQuery extends Query implements QueryConditionInterface {
}
/**
+ * Implements QueryConditionInterface::exists().
+ */
+ public function exists(SelectQueryInterface $select) {
+ $this->condition->exists($select);
+ return $this;
+ }
+
+ /**
+ * Implements QueryConditionInterface::notExists().
+ */
+ public function notExists(SelectQueryInterface $select) {
+ $this->condition->notExists($select);
+ return $this;
+ }
+
+ /**
* Implements QueryConditionInterface::conditions().
*/
public function &conditions() {
@@ -947,6 +985,22 @@ class UpdateQuery extends Query implements QueryConditionInterface {
}
/**
+ * Implements QueryConditionInterface::exists().
+ */
+ public function exists(SelectQueryInterface $select) {
+ $this->condition->exists($select);
+ return $this;
+ }
+
+ /**
+ * Implements QueryConditionInterface::notExists().
+ */
+ public function notExists(SelectQueryInterface $select) {
+ $this->condition->notExists($select);
+ return $this;
+ }
+
+ /**
* Implements QueryConditionInterface::conditions().
*/
public function &conditions() {
@@ -1417,6 +1471,22 @@ class MergeQuery extends Query implements QueryConditionInterface {
}
/**
+ * Implements QueryConditionInterface::exists().
+ */
+ public function exists(SelectQueryInterface $select) {
+ $this->condition->exists($select);
+ return $this;
+ }
+
+ /**
+ * Implements QueryConditionInterface::notExists().
+ */
+ public function notExists(SelectQueryInterface $select) {
+ $this->condition->notExists($select);
+ return $this;
+ }
+
+ /**
* Implements QueryConditionInterface::conditions().
*/
public function &conditions() {
@@ -1615,6 +1685,20 @@ class DatabaseCondition implements QueryConditionInterface, Countable {
}
/**
+ * Implements QueryConditionInterface::exists().
+ */
+ public function exists(SelectQueryInterface $select) {
+ return $this->condition('', $select, 'EXISTS');
+ }
+
+ /**
+ * Implements QueryConditionInterface::notExists().
+ */
+ public function notExists(SelectQueryInterface $select) {
+ return $this->condition('', $select, 'NOT EXISTS');
+ }
+
+ /**
* Implements QueryConditionInterface::conditions().
*/
public function &conditions() {
@@ -1756,6 +1840,8 @@ class DatabaseCondition implements QueryConditionInterface, Countable {
'BETWEEN' => array('delimiter' => ' AND '),
'IN' => array('delimiter' => ', ', 'prefix' => ' (', 'postfix' => ')'),
'NOT IN' => array('delimiter' => ', ', 'prefix' => ' (', 'postfix' => ')'),
+ 'EXISTS' => array('prefix' => ' (', 'postfix' => ')'),
+ 'NOT EXISTS' => array('prefix' => ' (', 'postfix' => ')'),
'IS NULL' => array('use_value' => FALSE),
'IS NOT NULL' => array('use_value' => FALSE),
// Use backslash for escaping wildcard characters.
diff --git a/includes/database/select.inc b/includes/database/select.inc
index 7f44063a2..43f92671e 100644
--- a/includes/database/select.inc
+++ b/includes/database/select.inc
@@ -810,6 +810,16 @@ class SelectQueryExtender implements SelectQueryInterface {
return $this;
}
+ public function exists(SelectQueryInterface $select) {
+ $this->query->exists($select);
+ return $this;
+ }
+
+ public function notExists(SelectQueryInterface $select) {
+ $this->query->notExists($select);
+ return $this;
+ }
+
public function __toString() {
return (string) $this->query;
}
@@ -1022,6 +1032,16 @@ class SelectQuery extends Query implements SelectQueryInterface {
return $this;
}
+ public function exists(SelectQueryInterface $select) {
+ $this->where->exists($select);
+ return $this;
+ }
+
+ public function notExists(SelectQueryInterface $select) {
+ $this->where->notExists($select);
+ return $this;
+ }
+
public function compile(DatabaseConnection $connection, QueryPlaceholderInterface $queryPlaceholder = NULL) {
return $this->where->compile($connection, isset($queryPlaceholder) ? $queryPlaceholder : $this);
}
@@ -1069,7 +1089,17 @@ class SelectQuery extends Query implements SelectQueryInterface {
$this->having->isNotNull($field);
return $this;
}
-
+
+ public function havingExists(SelectQueryInterface $select) {
+ $this->having->exists($select);
+ return $this;
+ }
+
+ public function havingNotExists(SelectQueryInterface $select) {
+ $this->having->notExists($select);
+ return $this;
+ }
+
public function forUpdate($set = TRUE) {
if (isset($set)) {
$this->forUpdate = $set;