Skip to content

Commit

Permalink
moved provider to cassandra column family object since it made more s…
Browse files Browse the repository at this point in the history
…ense there
  • Loading branch information
Nick Berardi committed Nov 2, 2011
1 parent 36a65ba commit f236bd0
Show file tree
Hide file tree
Showing 35 changed files with 196 additions and 296 deletions.
8 changes: 7 additions & 1 deletion src/BaseCassandraColumnFamily.cs
Expand Up @@ -79,7 +79,8 @@ public TResult ExecuteOperation<TResult>(ColumnFamilyOperation<TResult> action,
LastError = null;

TResult result;
bool success = action.TryExecute(this, out result);
action.ColumnFamily = this;
bool success = action.TryExecute(out result);

if (!success)
LastError = action.Error;
Expand Down Expand Up @@ -116,5 +117,10 @@ TResult ICassandraQueryProvider.Execute<TResult>(ICassandraQueryable query, Func
}

#endregion

public override string ToString()
{
return FamilyName;
}
}
}
2 changes: 1 addition & 1 deletion src/CassandraColumnFamily`1.cs
Expand Up @@ -3,7 +3,7 @@

namespace FluentCassandra
{
public class CassandraColumnFamily<CompareWith> : BaseCassandraColumnFamily
public partial class CassandraColumnFamily<CompareWith> : BaseCassandraColumnFamily
where CompareWith : CassandraType
{
public CassandraColumnFamily(CassandraContext context, string columnFamily)
Expand Down
5 changes: 2 additions & 3 deletions src/FluentCassandra.csproj
Expand Up @@ -164,9 +164,8 @@
<Compile Include="CassandraColumnFamilyOperations.cs" />
<Compile Include="Linq\CqlQuery.cs" />
<Compile Include="Linq\CqlQueryEvaluator.cs" />
<Compile Include="Linq\CqlQueryExtensions.cs" />
<Compile Include="Linq\CqlQueryProvider.cs" />
<Compile Include="Linq\List.cs" />
<Compile Include="Linq\CassandraColumnFamily`1+QueryProvider.cs" />
<Compile Include="Linq\ICqlRow.cs" />
<Compile Include="Operations\BatchMutate.cs" />
<Compile Include="Operations\CassandraIndexClause.cs" />
<Compile Include="Operations\CassandraQueryable.cs" />
Expand Down
Expand Up @@ -3,90 +3,19 @@
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using FluentCassandra.Types;
using FluentCassandra.Operations;
using FluentCassandra.Types;
using FluentCassandra.Linq;

namespace FluentCassandra.Linq
namespace FluentCassandra
{
public class CqlQueryProvider : IQueryable, IQueryProvider
public partial class CassandraColumnFamily<CompareWith> : IQueryable, IQueryable<ICqlRow<CompareWith>>, IQueryProvider
where CompareWith : CassandraType
{
private CassandraSession _session;
private string _family;

public CqlQueryProvider(string family)
: this(new CassandraSession(), family) { }

public CqlQueryProvider(CassandraSession session, string family)
{
if (session == null)
throw new ArgumentNullException("session");

_session = session;
_family = family;
}

/// <summary>
/// The last error that occured during the execution of an operation.
/// </summary>
public CassandraException LastError { get; private set; }

/// <summary>
/// Indicates if errors should be thrown when occuring on opperation.
/// </summary>
public bool ThrowErrors { get; set; }

/// <summary>
/// Execute the column family operation against the connection to the server.
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="action"></param>
/// <param name="throwOnError"></param>
/// <returns></returns>
public TResult ExecuteOperation<TResult>(Operation<TResult> action, bool? throwOnError = null)
{
if (!throwOnError.HasValue)
throwOnError = ThrowErrors;

CassandraSession _localSession = null;
if (CassandraSession.Current == null)
_localSession = new CassandraSession();

try
{
LastError = null;

TResult result;
bool success = action.TryExecute(out result);

if (!success)
LastError = action.Error;

if (!success && (throwOnError ?? ThrowErrors))
throw action.Error;

return result;
}
finally
{
if (_localSession != null)
_localSession.Dispose();
}
}

public string ColumnFamily
{
get { return _family; }
}

public CqlQuery ToQuery()
public CqlQuery<CompareWith> ToQuery()
{
var queryable = (IQueryable)this;
return new CqlQuery(queryable.Expression, this);
}

public override string ToString()
{
return _family;
return new CqlQuery<CompareWith>(queryable.Expression, this);
}

#region IEnumerable Members
Expand All @@ -99,8 +28,20 @@ public override string ToString()
/// </returns>
IEnumerator IEnumerable.GetEnumerator()
{
var queryable = (IQueryable)this;
return ((IEnumerable)queryable.Provider.Execute(queryable.Expression)).GetEnumerator();
return ((IEnumerable<IFluentBaseColumnFamily>)this).GetEnumerator();
}

#endregion

#region IEnumerable<IFluentBaseColumnFamily> Members

/// <summary>
///
/// </summary>
/// <returns></returns>
IEnumerator<ICqlRow<CompareWith>> IEnumerable<ICqlRow<CompareWith>>.GetEnumerator()
{
return ToQuery().GetEnumerator();
}

#endregion
Expand All @@ -116,7 +57,7 @@ IEnumerator IEnumerable.GetEnumerator()
/// </returns>
public virtual Type ElementType
{
get { return typeof(object); }
get { return typeof(IFluentBaseColumnFamily); }
}

/// <summary>
Expand Down Expand Up @@ -164,7 +105,7 @@ IQueryable<TElement> IQueryProvider.CreateQuery<TElement>(Expression expression)
if (!typeof(IQueryable<TElement>).IsAssignableFrom(expression.Type))
throw new ApplicationException("'expression' is not assignable from this type of repository.");

return (IQueryable<TElement>)new CqlQuery(expression, this);
return (IQueryable<TElement>)new CqlQuery<CompareWith>(expression, this);
}

/// <summary>
Expand All @@ -179,7 +120,7 @@ IQueryable IQueryProvider.CreateQuery(Expression expression)
if (expression == null)
throw new ArgumentNullException("expression");

return new CqlQuery(expression, this);
return new CqlQuery<CompareWith>(expression, this);
}

/// <summary>
Expand All @@ -193,7 +134,7 @@ TResult IQueryProvider.Execute<TResult>(Expression expression)
if (!typeof(TResult).IsAssignableFrom(typeof(IFluentBaseColumnFamily)))
throw new CassandraException("'TElement' must inherit from IFluentBaseColumnFamily");

return (TResult)Execute(expression).FirstOrDefault();
return (TResult)new CqlQuery<CompareWith>(expression, this).FirstOrDefault();
}

/// <summary>
Expand All @@ -205,19 +146,9 @@ TResult IQueryProvider.Execute<TResult>(Expression expression)
/// </returns>
object IQueryProvider.Execute(Expression expression)
{
return Execute(expression);
return new CqlQuery<CompareWith>(expression, this).GetEnumerator();
}

#endregion

public IEnumerable<IFluentBaseColumnFamily> Execute(Expression expression)
{
if (expression == null)
throw new ArgumentNullException("expression");

var result = CqlQueryEvaluator.GetEvaluator(expression);
var op = new ExecuteCqlQuery(result.Query);
return ExecuteOperation(op);
}
}
}
}
31 changes: 18 additions & 13 deletions src/Linq/CqlQuery.cs
Expand Up @@ -3,20 +3,23 @@
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using FluentCassandra.Types;
using FluentCassandra.Operations;

namespace FluentCassandra.Linq
{
public class CqlQuery : IQueryable, IQueryable<IFluentBaseColumnFamily>
public class CqlQuery<CompareWith> : IQueryable, IQueryable<ICqlRow<CompareWith>>
where CompareWith : CassandraType
{
private readonly Expression _expression;
private readonly CqlQueryProvider _provider;
private readonly CassandraColumnFamily<CompareWith> _provider;

/// <summary>
/// Initializes a new instance of the <see cref="CqlQuery&lt;T&gt;"/> class.
/// </summary>
/// <param name="expression">The expression.</param>
/// <param name="provider">The provider.</param>
public CqlQuery(Expression expression, CqlQueryProvider provider)
public CqlQuery(Expression expression, CassandraColumnFamily<CompareWith> provider)
{
_expression = expression;
_provider = provider;
Expand All @@ -37,15 +40,17 @@ IEnumerator IEnumerable.GetEnumerator()

#endregion

#region IEnumerable<IFluentBaseColumnFamily> Members
#region IEnumerable<ICqlRow<CompareWith>> Members

public IEnumerator<IFluentBaseColumnFamily> GetEnumerator()
/// <summary>
///
/// </summary>
/// <returns></returns>
public IEnumerator<ICqlRow<CompareWith>> GetEnumerator()
{
if (ElementType.IsAnonymousType())
throw new NotSupportedException(
"Please call the AsTypelessQuery() on this query, because anonymous types are not supported.");

return Provider.Execute(Expression).GetEnumerator();
var result = CqlQueryEvaluator<CompareWith>.GetEvaluator<CompareWith>(Expression);
var op = new ExecuteCqlQuery<CompareWith>(result.Query);
return Provider.ExecuteOperation(op).GetEnumerator();
}

#endregion
Expand All @@ -61,7 +66,7 @@ public IEnumerator<IFluentBaseColumnFamily> GetEnumerator()
/// </returns>
public virtual Type ElementType
{
get { return typeof(object); }
get { return typeof(IFluentBaseColumnFamily); }
}

/// <summary>
Expand All @@ -83,7 +88,7 @@ public Expression Expression
/// <returns>
/// The <see cref="T:System.Linq.IQueryProvider"/> that is associated with this data source.
/// </returns>
public CqlQueryProvider Provider
public CassandraColumnFamily<CompareWith> Provider
{
get { return _provider; }
}
Expand All @@ -104,7 +109,7 @@ IQueryProvider IQueryable.Provider
/// <returns></returns>
public override string ToString()
{
return CqlQueryEvaluator.GetCql(Expression);
return CqlQueryEvaluator<CompareWith>.GetCql<CompareWith>(Expression);
}
}
}
21 changes: 13 additions & 8 deletions src/Linq/CqlQueryEvaluator.cs
Expand Up @@ -3,11 +3,13 @@
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using FluentCassandra.Types;

namespace FluentCassandra.Linq
{
/// <see href="https://github.com/apache/cassandra/blob/trunk/doc/cql/CQL.textile"/>
internal class CqlQueryEvaluator
internal class CqlQueryEvaluator<CompareWith>
where CompareWith : CassandraType
{
private string _columnFamily;

Expand Down Expand Up @@ -48,9 +50,10 @@ private string Fields

private string WhereCriteria { get; set; }

private void AddTable(CqlQueryProvider provider)
private void AddTable<CompareWith>(CassandraColumnFamily<CompareWith> provider)
where CompareWith : CassandraType
{
_columnFamily = provider.ColumnFamily;
_columnFamily = provider.FamilyName;
}

private void AddField(Expression exp)
Expand Down Expand Up @@ -105,15 +108,17 @@ private static string GetPropertyName(Expression exp)

#region Expression Parsing

public static string GetCql(Expression expression)
public static string GetCql<CompareWith>(Expression expression)
where CompareWith : CassandraType
{
var eval = GetEvaluator(expression);
var eval = GetEvaluator<CompareWith>(expression);
return eval.Query;
}

public static CqlQueryEvaluator GetEvaluator(Expression expression)
public static CqlQueryEvaluator<CompareWith> GetEvaluator<CompareWith>(Expression expression)
where CompareWith : CassandraType
{
var eval = new CqlQueryEvaluator();
var eval = new CqlQueryEvaluator<CompareWith>();
eval.Evaluate(expression);

return eval;
Expand Down Expand Up @@ -144,7 +149,7 @@ private void Evaluate(Expression exp, Action<string> call = null)
break;

case ExpressionType.Constant:
AddTable(((ConstantExpression)exp).Value as CqlQueryProvider);
AddTable(((ConstantExpression)exp).Value as CassandraColumnFamily<CompareWith>);
break;
}
}
Expand Down
28 changes: 0 additions & 28 deletions src/Linq/CqlQueryExtensions.cs

This file was deleted.

0 comments on commit f236bd0

Please sign in to comment.