using System;
using System.Collections.Generic;
using System.Data;
using System.Web.UI.WebControls;
using CMS.CMSHelper;
using CMS.GlobalHelper;
using CMS.Newsletter;
using CMS.SettingsProvider;
using CMS.UIControls;
public partial class CMSModules_Newsletters_Controls_OpenedByFilter : CMSUserControl
{
#region "Properties"
///
/// Gets the where condition created using filtered parameters.
///
public string WhereCondition
{
get
{
// Get condition from name and email parts of the filter
string whereCond = GetSubscriberCondition();
if (ShowDateFilter)
{
// Get condition from date part of the filter
whereCond = SqlHelperClass.AddWhereCondition(whereCond, fltOpenedBetween.GetCondition());
}
if (plcVariants.Visible)
{
// Get condition from variant part of the filter
whereCond = SqlHelperClass.AddWhereCondition(whereCond, fltVariants.GetWhereCondition());
}
return whereCond;
}
}
///
/// Indicates if date part of the filter should be visible.
///
public bool ShowDateFilter
{
get;
set;
}
///
/// Gets or sets issue ID of or to variant selector. Used for A/B test issues.
///
public int IssueId
{
get
{
return ValidationHelper.GetInteger(fltVariants.Value, 0);
}
set
{
fltVariants.Value = value;
// Display variant part of the filter
plcVariants.Visible = fltVariants.Visible = true;
}
}
#endregion
#region "Page events"
protected void Page_PreRender(object sender, EventArgs e)
{
// Display/hide date part of the filter
plcDate.Visible = ShowDateFilter;
}
#endregion
#region "Methods"
///
/// Gets complex where condition for name and email fields.
///
protected string GetSubscriberCondition()
{
string result = string.Empty;
// Get condition from subscriber filter fields
string baseCondition = string.Empty;
string nameCondition = fltSubscriberName.GetCondition();
string emailCondition = fltEmail.GetCondition();
// Prepare base condition for subscriber email and name
baseCondition = SqlHelperClass.AddWhereCondition(nameCondition, emailCondition);
if (!string.IsNullOrEmpty(emailCondition))
{
// Extend the condition for 'Email' column
fltEmail.Column = "Email";
emailCondition = SqlHelperClass.AddWhereCondition(emailCondition, fltEmail.GetCondition(), "OR");
}
if (!string.IsNullOrEmpty(baseCondition))
{
string subscriberCondition = SqlHelperClass.AddWhereCondition(nameCondition, emailCondition);
result = BuildCondition(baseCondition, subscriberCondition, !string.IsNullOrEmpty(emailCondition));
}
return result;
}
///
/// Builds where condition with subscriber IDs from main DB who meet base filter condition.
///
/// Base condition
/// Condition for subscribers from main DB
/// Indicates if subscriber view should be used
protected string BuildCondition(string baseCondition, string subscriberCondition, bool useView)
{
string result = string.Empty;
// Get IDs of subscribers from current site who meet the original condition
string tempWhere = SqlHelperClass.AddWhereCondition("SubscriberSiteID=" + CMSContext.CurrentSiteID, subscriberCondition);
DataSet ds = null;
if (useView)
{
ds = SubscriberInfoProvider.GetSubscribersFromView(tempWhere, null, -1, "SubscriberID");
}
else
{
ds = SubscriberInfoProvider.GetSubscribers(tempWhere, null, -1, "SubscriberID");
}
if (!DataHelper.DataSourceIsEmpty(ds))
{
List subscriberIDs = SystemDataHelper.GetStringValues(ds.Tables[0], "SubscriberID");
string subscriberIDCond = string.Empty;
int maxItems = 10000;
int maxToProcess = 0;
do
{
maxToProcess = (subscriberIDs.Count > maxItems) ? maxItems : subscriberIDs.Count;
// Get condition in form 'SubscriberID IN (....)' with maximally 10.000 items
subscriberIDCond = SqlHelperClass.AddWhereCondition(subscriberIDCond, SqlHelperClass.GetWhereCondition("SubscriberID", subscriberIDs.GetRange(0, maxToProcess), false), "OR");
subscriberIDs.RemoveRange(0, maxToProcess);
}
while (subscriberIDs.Count > 0);
// Add the condition that only clasic subscribers should be filtered with the IDs condition
result = SqlHelperClass.AddWhereCondition("SubscriberID>0", subscriberIDCond);
}
// Add original condition for contact group members
return SqlHelperClass.AddWhereCondition(result, string.Format("(SubscriberID=0 AND {0})", baseCondition), "OR");
}
#endregion
}