public override Task GeneratPartitionMetadata(PartitionOptions partitionOptions) { var tpchData = partitionOptions.ServiceProvider.GetService <TpchData>(); var orders = tpchData.Orders.OrderBy(x => x.Orderkey).ToList(); List <long> keys = new List <long>(); for (int i = PartitionLength; i < orders.Count; i += PartitionLength) { keys.Add(orders[i].Orderkey); } keys = keys.OrderBy(x => x).ToList(); List <BooleanExpression> partitionFilters = new List <BooleanExpression>(); if (keys.Count > 0) { var firstData = tpchData.Orders.Where(x => x.Orderkey < keys.First()).ToList(); partitionFilters.Add(QueryBuilder.BooleanExpression <Order>(x => x.Orderkey < keys.First())); //Middle partitions contains both start and end for (int i = 1; i < keys.Count; i++) { var middleData = tpchData.Orders.Where(x => x.Orderkey >= keys[i - 1] && x.Orderkey < keys[i]).ToList(); partitionFilters.Add(QueryBuilder.BooleanExpression <Order>(x => x.Orderkey >= keys[i - 1] && x.Orderkey < keys[i])); } var lastData = tpchData.Orders.Where(x => x.Orderkey >= keys.Last()).ToList(); partitionFilters.Add(QueryBuilder.BooleanExpression <Order>(x => x.Orderkey >= keys.Last())); //Last partition only contains a start } _partitionFilters = partitionFilters; return(Task.CompletedTask); }
/// <summary> /// This method is called only if GenerateMetadataTimespan is set. /// It allows a partition resolver to generate metadata in between calls. /// This is useful if the source it self does not have partitions, and the partitions needs to be recalculated in specific intervals. /// </summary> /// <returns></returns> public virtual Task GeneratPartitionMetadata(PartitionOptions partitionOptions) { return(Task.CompletedTask); }
/// <summary> /// Get the partitions for a specific table /// </summary> /// <param name="tableName">The name of the table</param> /// <param name="canHandleMultiplePartitions">True if the caller can handle getting multiple partitions</param> /// <param name="sqlTree">The SQL tree that can be modified to give the user the correct partitions</param> /// <param name="httpContext">The http context that contains user information etc.</param> /// <returns></returns> public virtual Task <IImmutableList <Partition> > GetPartitions(bool canHandleMultiplePartitions, PartitionsBuilder partitionsBuilder, HttpContext httpContext, PartitionOptions partitionOptions) { return(Task.FromResult <IImmutableList <Partition> >(ImmutableList.Create <Partition>(partitionsBuilder.NewPartition().Build()))); }
public override Task <IImmutableList <Partition> > GetPartitions(bool canHandleMultiplePartitions, PartitionsBuilder partitionsBuilder, HttpContext httpContext, PartitionOptions partitionOptions) { if (!canHandleMultiplePartitions) { return(base.GetPartitions(canHandleMultiplePartitions, partitionsBuilder, httpContext, partitionOptions)); } if (_partitionFilters == null) { GeneratPartitionMetadata(partitionOptions); } var builder = ImmutableList.CreateBuilder <Partition>(); foreach (var filter in _partitionFilters) { builder.Add(partitionsBuilder.NewPartition().AddFilter(filter).Build()); } return(Task.FromResult <IImmutableList <Partition> >(builder.ToImmutable())); }