using System; using System.Collections.Generic; using System.IO; using System.Linq; using ZeroLevel.Services.FileSystem; namespace ZeroLevel.Services.PartitionStorage { /// /// Options /// /// Record key /// The value that is written in the stream /// Value after compression of TInput values by duplicate keys (TInput list or similar) /// Meta information for partition search public class StoreOptions { private const string DEFAULT_FILE_NAME = "defaultGroup"; /// /// Method for key comparison /// public Func KeyComparer { get; set; } /// /// Storage root directory /// public string RootFolder { get; set; } /// /// Maximum degree of parallelis /// public int MaxDegreeOfParallelism { get; set; } = 64; /// /// Function for translating a list of TInput into one TValue /// public Func, TValue> MergeFunction { get; set; } /// /// List of partitions for accessing the catalog /// public List> Partitions { get; set; } = new List>(); /// /// File Partition /// public StoreFilePartition FilePartition { get; set; } /// /// Uses a thread-safe mechanism for writing to files during multi-threaded writes /// public bool ThreadSafeWriting { get; set; } = false; /// /// Period before memory mapped file was closed, after last access time /// public TimeSpan PhisicalFileAccessorExpirationPeriod { get; set; } = TimeSpan.FromMinutes(30); public IndexOptions Index { get; set; } = new IndexOptions { Enabled = false, StepValue = 64, StepType = IndexStepType.AbsoluteCount }; internal string GetFileName(TKey key, TMeta info) { var name = FilePartition.FileNameExtractor(key, info); if (string.IsNullOrWhiteSpace(name)) { name = DEFAULT_FILE_NAME; } return name; } internal string GetCatalogPath(TMeta info) { var path = RootFolder; foreach (var partition in Partitions) { var pathPart = partition.PathExtractor(info); pathPart = FSUtils.FileNameCorrection(pathPart); if (string.IsNullOrWhiteSpace(pathPart)) { throw new Exception($"Partition '{partition.Name}' not return name of part of path"); } path = Path.Combine(path, pathPart); } return path; } public StoreOptions Clone() { var options = new StoreOptions { Index = new IndexOptions { Enabled = this.Index.Enabled, StepValue = 64, StepType = IndexStepType.AbsoluteCount }, FilePartition = this.FilePartition, KeyComparer = this.KeyComparer, MaxDegreeOfParallelism = this.MaxDegreeOfParallelism, MergeFunction = this.MergeFunction, Partitions = this.Partitions .Select(p => new StoreCatalogPartition(p.Name, p.PathExtractor)) .ToList(), RootFolder = this.RootFolder, ThreadSafeWriting = this.ThreadSafeWriting }; return options; } } }