public static function groupSQL($group, $tally = false, $status = 1, $filter = false)
{
// used to prevent against group include/exclude recursion
static $groups;
if (!isset($groups[$group['id']])) {
$groups[$group['id']] = TRUE;
}
global $pommo;
$dbo =& Pommo::$_dbo;
$rules = Pommo_Sql::sortRules($group['rules']);
$ands = Pommo_Sql::getSubQueries(Pommo_Sql::sortLogic($rules['and']));
$ors = empty($rules['or']) ? array() : Pommo_Sql::getSubQueries(Pommo_Sql::sortLogic($rules['or']));
$sql = $tally ? 'SELECT count(subscriber_id) ' : 'SELECT subscriber_id ';
$sql .= "\n FROM {$dbo->table['subscribers']}\n WHERE status=" . intval($status);
$q = FALSE;
if (!empty($ands)) {
$sql .= " AND (\n";
foreach ($ands as $k => $s) {
if ($k != 0) {
$sql .= "\n AND ";
}
$sql .= $s;
}
foreach ($ors as $s) {
$sql .= "\n OR {$s}";
}
$sql .= "\n)";
$q = TRUE;
}
foreach ($rules['exclude'] as $gid) {
if (!isset($groups[$gid])) {
$sql .= "\nAND subscriber_id NOT IN (\n";
$sql .= Pommo_Sql::groupSQL(current(Pommo_Groups::get(array('id' => $gid))));
$sql .= "\n)";
}
$q = TRUE;
}
foreach ($rules['include'] as $gid) {
if (!isset($groups[$gid])) {
$sql .= "\n" . ($q ? 'OR' : 'AND') . " subscriber_id IN (\n";
$sql .= Pommo_Sql::groupSQL(current(Pommo_Groups::get(array('id' => $gid))));
$sql .= "\n)";
}
$q = TRUE;
}
// If a filter/search is requested, perform a match
if (is_array($filter) && !empty($filter['field']) && !empty($filter['string'])) {
// make MySQL LIKE() compliant
$filter['string'] = mysql_real_escape_string(addcslashes($filter['string'], '%_'));
$sql .= is_numeric($filter['field']) ? "\n AND subscriber_id in (select subscriber_id from {$dbo->table['subscriber_data']} WHERE field_id = " . (int) $filter['field'] . " AND value LIKE '%{$filter['string']}%')" : "\n AND " . mysql_real_escape_string($filter['field']) . " LIKE '%{$filter['string']}%'";
}
return $sql;
}