Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
 /// <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);
 }
Exemplo n.º 3
0
 /// <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())));
 }
Exemplo n.º 4
0
        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()));
        }