/// <summary> /// Filters a queryable to the data within a specified range partition. /// </summary> /// <typeparam name="TData">The type of the data.</typeparam> /// <typeparam name="TPartition">The type of the partition value.</typeparam> /// <param name="source">The source queryable.</param> /// <param name="key">A selector for the partitioned value.</param> /// <param name="partition">The partition.</param> public static IQueryable <TData> WithinPartition <TData, TPartition>( this IQueryable <TData> source, Expression <Func <TData, TPartition> > key, IStreamQueryRangePartition <TPartition> partition) { var lower = Expression.Constant(partition.LowerBoundExclusive); var upper = Expression.Constant(partition.UpperBoundInclusive); var compareTo = MethodInfoFor <TPartition> .CompareTo; var selectLeft = Expression.GreaterThan( Expression.Call(key.Body, compareTo, lower), Expression.Constant(0)); var selectRight = Expression.LessThanOrEqual( Expression.Call(key.Body, compareTo, upper), Expression.Constant(0)); var filterExpression = Expression.AndAlso(selectLeft, selectRight); return(source.Where( Expression.Lambda <Func <TData, bool> >(filterExpression, key.Parameters.Single()))); }
/// <summary> /// Splits a query partition into several smaller, non-overlapping, gapless partitions. /// </summary> public static IEnumerable <IStreamQueryRangePartition <TPartition> > Among <TPartition>( this IStreamQueryRangePartition <TPartition> partition, int numberOfPartitions) { if (typeof(TPartition) == typeof(Guid)) { dynamic partitions = SqlGuidPartitionBuilder.ByRange( (dynamic)partition.LowerBoundExclusive, (dynamic)partition.UpperBoundInclusive, numberOfPartitions); return(partitions); } if (typeof(TPartition) == typeof(int)) { dynamic partitions = Int32PartitionBuilder.ByRange( (dynamic)partition.LowerBoundExclusive, (dynamic)partition.UpperBoundInclusive, numberOfPartitions); return(partitions); } if (typeof(TPartition) == typeof(long)) { dynamic partitions = Int64PartitionBuilder.ByRange( (dynamic)partition.LowerBoundExclusive, (dynamic)partition.UpperBoundInclusive, numberOfPartitions); return(partitions); } if (typeof(TPartition) == typeof(BigInteger)) { dynamic partitions = BigIntegerPartitionBuilder.ByRange( (dynamic)partition.LowerBoundExclusive, (dynamic)partition.UpperBoundInclusive, numberOfPartitions); return(partitions); } throw new ArgumentException(string.Format("Partitions of type {0} cannot be generated dynamically.", typeof(TPartition))); }