function notifications_subscriptions_query_build in Notifications 6
Same name and namespace in other branches
- 6.2 notifications.module \notifications_subscriptions_query_build()
- 6.3 notifications.module \notifications_subscriptions_query_build()
Query builder for subscriptions
Builds queries for 'notifications' and 'notifications_fields' tables using schema and fields (subscription fields) information.
Parameters
array $params: Array of multiple conditions in the notifications table.
array $conditions: Array of multiple conditions in the notifications_fields table. The array elements may be
- single field => value pairs
- or key => array('type' => field, 'value' => value)
If value is null, it just checks that a condition for the given field type exists
$limit: Whether to limit the result to subscriptions with exactly that condition fields
Return value
array() Structured array with 'join', 'where', 'args' elements
2 calls to notifications_subscriptions_query_build()
- notifications_delete_subscriptions in ./notifications.module 
- Delete multiple subscriptions and clean up related data (pending notifications, fields).
- notifications_get_subscriptions in ./notifications.module 
- Get subscriptions that fit a set of conditions.
File
- ./notifications.module, line 835 
- Notifications module
Code
function notifications_subscriptions_query_build($params, $conditions = array(), $limit = FALSE) {
  $join = $where = $args = array();
  $schema = drupal_get_schema('notifications');
  // If we limit this query to the number of conditions add a new param
  if ($limit && $conditions) {
    $params += array(
      'conditions' => count($conditions),
    );
  }
  // Add conditions for main notifications table
  foreach ($params as $field => $value) {
    if (in_array($schema['fields'][$field]['type'], array(
      'serial',
      'int',
    ))) {
      $where[] = 'n.' . $field . " = %d";
    }
    else {
      $where[] = 'n.' . $field . " = '%s'";
    }
    $args[] = $value;
  }
  // Now we need to join once the fields table for each condition
  if ($conditions) {
    $index = 0;
    foreach ($conditions as $key => $data) {
      if (is_array($data)) {
        $field = $data['type'];
        $value = $data['value'];
      }
      else {
        $field = $key;
        $value = $data;
      }
      $alias = 'nf' . $index++;
      $join[] = "INNER JOIN {notifications_fields} {$alias} ON n.sid = {$alias}.sid";
      $where[] = "{$alias}.field = '%s'";
      $args[] = $field;
      // If null value, do not check value, we just check that a condition for this field type exists
      if (!is_null($value)) {
        if (notifications_subscription_fields($field, 'type') == 'int') {
          $where[] = "{$alias}.intval = %d";
        }
        else {
          $where[] = "{$alias}.value = '%s'";
        }
        $args[] = $value;
      }
    }
  }
  // Return query array
  return array(
    'from' => array(
      '{notifications} n',
    ),
    'join' => $join,
    'where' => $where,
    'args' => $args,
  );
}