Skip to content

Commit

Permalink
added count feature
Browse files Browse the repository at this point in the history
  • Loading branch information
michael-shattuck committed Feb 2, 2015
1 parent 446ea36 commit 58f533c
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 7 deletions.
14 changes: 14 additions & 0 deletions SalesforceMagic/Abstract/ISalesforceClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,20 @@ public interface ISalesforceClient : IDisposable

#endregion

#region Count Methods

/// <summary>
/// Retrieve an object total count.
/// - Allows for filtering count totals
/// using the conditional lambda.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="predicate"></param>
/// <returns></returns>
int Count<T>(Expression<Func<T, bool>> predicate = null) where T : SObject;

#endregion

#region Query Methods

/// <summary>
Expand Down
13 changes: 11 additions & 2 deletions SalesforceMagic/ORM/QueryBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace SalesforceMagic.ORM
{
public static class QueryBuilder
{
public static string GenerateQuery<T>(int limit = default(int))
internal static string GenerateQuery<T>(int limit = default(int))
where T : SObject
{
Type type = typeof(T);
Expand All @@ -18,7 +18,7 @@ public static class QueryBuilder
return query;
}

public static string GenerateQuery<T>(Expression<Func<T, bool>> predicate, int limit = default(int))
internal static string GenerateQuery<T>(Expression<Func<T, bool>> predicate, int limit = default(int))
where T : SObject
{
Type type = typeof(T);
Expand All @@ -29,6 +29,15 @@ public static class QueryBuilder
return query;
}

internal static string GenerateCountyQuery<T>(Expression<Func<T, bool>> predicate)
{
Type type = typeof(T);
string query = string.Format("SELECT COUNT() FROM {0}", type.GetName());
if (predicate != null) AddConditionsSet(ref query, predicate);

return query;
}

private static string CompileSelectStatements(Type type)
{
return string.Format("SELECT {0} FROM {1}", string.Join(", ", type.GetPropertyNames(true)), type.GetName());
Expand Down
6 changes: 6 additions & 0 deletions SalesforceMagic/ORM/ResponseReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ internal static bool ReadBoolResponse(string name, XmlDocument document)
return node != null ? Convert.ToBoolean(node.InnerText) : default(bool);
}

internal static int ReadCountResponse(string name, XmlDocument document)
{
XmlNode node = GetSingleNamedNodes(document, name);
return node != null ? Convert.ToInt32(node.InnerText) : default(int);
}

internal static SalesforceResponse ReadSimpleResponse(XmlDocument document)
{
SalesforceResponse response = new SalesforceResponse();
Expand Down
23 changes: 23 additions & 0 deletions SalesforceMagic/SalesforceClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,20 @@ public SalesforceSession Login()
}
}

/// <summary>
/// Retrieve an object total count.
/// - Allows for filtering count totals
/// using the conditional lambda.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="predicate"></param>
/// <returns></returns>
public int Count<T>(Expression<Func<T, bool>> predicate = null) where T : SObject
{
var request = SoapRequestManager.GetCountRequest(Login(), predicate);
return PerformCountRequest(request);
}

/// <summary>
/// Simple Query
/// - Query items based on generic object
Expand Down Expand Up @@ -320,6 +334,15 @@ private T PerformGenericRequest<T>(HttpRequest request, string rootName = "resul
}
}

private int PerformCountRequest(HttpRequest request)
{
using (HttpClient httpClient = new HttpClient())
{
XmlDocument response = httpClient.PerformRequest(request);
return ResponseReader.ReadCountResponse("size", response);
}
}

private SalesforceResponse PerformSimpleRequest(HttpRequest request)
{
using (HttpClient httpClient = new HttpClient())
Expand Down
16 changes: 11 additions & 5 deletions SalesforceMagic/SoapApi/SoapRequestManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,19 @@ internal static HttpRequest GetLoginRequest(SalesforceConfig config)
return request;
}

public static HttpRequest GetQueryRequest<T>(Expression<Func<T, bool>> predicate, int limit, SalesforceSession session) where T : SObject
internal static HttpRequest GetQueryRequest<T>(Expression<Func<T, bool>> predicate, int limit, SalesforceSession session) where T : SObject
{
string query = QueryBuilder.GenerateQuery(predicate, limit);
return GetQueryRequest(query, session);
}

public static HttpRequest GetQueryAllRequest<T>(int limit, SalesforceSession session) where T : SObject
internal static HttpRequest GetQueryAllRequest<T>(int limit, SalesforceSession session) where T : SObject
{
string query = QueryBuilder.GenerateQuery<T>(limit);
return GetQueryRequest(query, session);
}

public static HttpRequest GetQueryRequest(string query, SalesforceSession session)
internal static HttpRequest GetQueryRequest(string query, SalesforceSession session)
{
HttpRequest request = new HttpRequest
{
Expand All @@ -51,7 +51,7 @@ public static HttpRequest GetQueryRequest(string query, SalesforceSession sessio
return request;
}

public static HttpRequest GetQueryMoreRequest(string queryLocator, SalesforceSession session)
internal static HttpRequest GetQueryMoreRequest(string queryLocator, SalesforceSession session)
{
HttpRequest request = new HttpRequest
{
Expand All @@ -64,7 +64,7 @@ public static HttpRequest GetQueryMoreRequest(string queryLocator, SalesforceSes
return request;
}

public static HttpRequest GetCrudRequest<T>(CrudOperation<T> operation, SalesforceSession session) where T : SObject
internal static HttpRequest GetCrudRequest<T>(CrudOperation<T> operation, SalesforceSession session) where T : SObject
{
string body = SoapCommands.CrudOperation(operation, session.SessionId);
HttpRequest request = new HttpRequest
Expand All @@ -77,5 +77,11 @@ public static HttpRequest GetCrudRequest<T>(CrudOperation<T> operation, Salesfor

return request;
}

internal static HttpRequest GetCountRequest<T>(SalesforceSession session, Expression<Func<T, bool>> predicate = null)
{
string query = QueryBuilder.GenerateCountyQuery(predicate);
return GetQueryRequest(query, session);
}
}
}

0 comments on commit 58f533c

Please sign in to comment.