Exemplo n.º 1
0
        public async Task SessionCreateDerivedPartitionCancellation()
        {
            var dataset = new Dataset();
            var session = dataset.CreateSession();

            // generate a test store
            var originalStoreName = "OriginalStore";

            GenerateTestStore(originalStoreName, StorePath);

            // add a partition
            var partition0 = session.AddPsiStorePartition(originalStoreName, StorePath, "Partition_0");

            Assert.AreEqual(1, session.Partitions.Count);
            Assert.AreEqual("Partition_0", session.Partitions[0].Name);

            int multiplier = 7;

            try
            {
                // create a cancellation token source that will automatically request cancellation after 500 ms
                var cts = new CancellationTokenSource(TimeSpan.FromMilliseconds(500));

                // create a derived partition which contains the values from the original stream multiplied by a multiplier
                await session.CreateDerivedPsiPartitionAsync(
                    (pipeline, importer, exporter, parameter) =>
                {
                    var inputStream   = importer.OpenStream <int>("Root");
                    var derivedStream = inputStream.Sample(TimeSpan.FromMinutes(1), RelativeTimeInterval.Infinite).Select(x => x *parameter).Write("DerivedStream", exporter);

                    // add a dummy source and propose a long time interval so that the operation will block (and eventually be canceled)
                    var generator          = Generators.Repeat(pipeline, 0, int.MaxValue, TimeSpan.FromMilliseconds(1000));
                    var replayTimeInterval = TimeInterval.LeftBounded(importer.MessageOriginatingTimeInterval.Left);
                    pipeline.ProposeReplayTime(replayTimeInterval);
                },
                    multiplier,
                    "Partition_1",
                    false,
                    "DerivedStore",
                    StorePath,
                    null,
                    null,
                    cts.Token);
            }
            catch (OperationCanceledException)
            {
                // should NOT have created a new partition (but original partition should be intact)
                Assert.AreEqual(1, session.Partitions.Count);
                Assert.IsTrue(PsiStore.Exists("OriginalStore", StorePath));
                Assert.IsFalse(PsiStore.Exists("DerivedStore", StorePath));

                // verify original partition metadata
                var originalPartition = session.Partitions[0] as Partition <PsiStoreStreamReader>;
                Assert.AreEqual("Partition_0", originalPartition.Name);
                Assert.AreEqual("OriginalStore", originalPartition.StoreName);
                Assert.AreEqual($"{StorePath}{Path.DirectorySeparatorChar}OriginalStore.0000", originalPartition.StorePath);

                throw;
            }
        }
Exemplo n.º 2
0
        public void SessionAddPartition()
        {
            var dataset = new Dataset();
            var session = dataset.CreateSession();
            Assert.AreEqual(0, session.Partitions.Count);

            // generate a test store
            GenerateTestStore("PsiStore", StorePath);

            // add a partition
            var partition0 = session.AddPsiStorePartition("PsiStore", StorePath, "Partition_0");
            Assert.AreEqual(1, session.Partitions.Count);
            Assert.AreEqual("Partition_0", session.Partitions[0].Name);

            // verify new originating time intervals (session and dataset)
            Assert.AreEqual(partition0.OriginatingTimeInterval.Left, session.OriginatingTimeInterval.Left);
            Assert.AreEqual(partition0.OriginatingTimeInterval.Right, session.OriginatingTimeInterval.Right);
            Assert.AreEqual(partition0.OriginatingTimeInterval.Left, dataset.OriginatingTimeInterval.Left);
            Assert.AreEqual(partition0.OriginatingTimeInterval.Right, dataset.OriginatingTimeInterval.Right);

            // generate a new store with a different originating time interval than the first
            GenerateTestStore("NewStore", StorePath);

            // add a second partition with a different name
            var partition1 = session.AddPsiStorePartition("NewStore", StorePath, "Partition_1");
            Assert.AreEqual(2, session.Partitions.Count);
            Assert.AreEqual("Partition_0", session.Partitions[0].Name);
            Assert.AreEqual("Partition_1", session.Partitions[1].Name);

            // verify new originating time intervals (session and dataset)
            Assert.AreEqual(partition0.OriginatingTimeInterval.Left, session.OriginatingTimeInterval.Left);
            Assert.AreEqual(partition1.OriginatingTimeInterval.Right, session.OriginatingTimeInterval.Right);
            Assert.AreEqual(partition0.OriginatingTimeInterval.Left, dataset.OriginatingTimeInterval.Left);
            Assert.AreEqual(partition1.OriginatingTimeInterval.Right, dataset.OriginatingTimeInterval.Right);
        }
Exemplo n.º 3
0
 public void DatasetUnsavedChanges()
 {
     var dataset = new Dataset("autosave");
     dataset.CreateSession("test-session1");
     Assert.IsTrue(dataset.HasUnsavedChanges);
     dataset.SaveAs("unsave.pds");
     Assert.IsTrue(!dataset.HasUnsavedChanges);
 }
Exemplo n.º 4
0
        public void SessionAddPartitionDuplicateName()
        {
            var dataset = new Dataset();
            var session = dataset.CreateSession();
            Assert.AreEqual(0, session.Partitions.Count);

            // generate a test store
            GenerateTestStore("PsiStore", StorePath);

            // add a partition
            session.AddPsiStorePartition("PsiStore", StorePath, "Partition_0");
            Assert.AreEqual(1, session.Partitions.Count);
            Assert.AreEqual("Partition_0", session.Partitions[0].Name);

            // generate a new store with a different originating time interval than the first
            GenerateTestStore("NewStore", StorePath);

            // add a second partition with a duplicate name
            session.AddPsiStorePartition("NewStore", StorePath, "Partition_0"); // should throw
        }
Exemplo n.º 5
0
        public void DatasetAutoSave()
        {
            var datasetPath = Path.Join(StorePath, "autosave.pds");

            var dataset = new Dataset("autosave", datasetPath, autoSave: true);

            dataset.Name = "autosave-saved";
            GenerateTestStore("store1", StorePath);

            var session1 = dataset.CreateSession("test-session1");
            var session2 = dataset.AddSessionFromPsiStore("store1", StorePath);

            session1.Name = "no-longer-test-session1";

            // open the dataset file as a different dataset and validate information
            var sameDataset = Dataset.Load(datasetPath);

            Assert.AreEqual("autosave-saved", sameDataset.Name);
            Assert.AreEqual(2, sameDataset.Sessions.Count);
            Assert.AreEqual("no-longer-test-session1", sameDataset.Sessions[0].Name);
            Assert.AreEqual(session2.Name, sameDataset.Sessions[1].Name);

            // remove a session and verify changes are saved.
            dataset.RemoveSession(session1);
            sameDataset = Dataset.Load(datasetPath);
            Assert.AreEqual(1, sameDataset.Sessions.Count);
            Assert.AreEqual(session2.Name, sameDataset.Sessions[0].Name);
            Assert.AreEqual(1, sameDataset.Sessions[0].Partitions.Count);
            Assert.AreEqual(session2.OriginatingTimeInterval.Left, sameDataset.Sessions[0].OriginatingTimeInterval.Left);
            Assert.AreEqual(session2.OriginatingTimeInterval.Right, sameDataset.Sessions[0].OriginatingTimeInterval.Right);

            // now we edit the session and we want to make sure the changes stick!
            GenerateTestStore("store3", StorePath);
            session2.AddPsiStorePartition("store3", StorePath);
            sameDataset = Dataset.Load(datasetPath);
            Assert.AreEqual(session2.Name, sameDataset.Sessions[0].Name);
            Assert.AreEqual(2, sameDataset.Sessions[0].Partitions.Count);
            Assert.AreEqual("store3", sameDataset.Sessions[0].Partitions[1].Name);
        }
Exemplo n.º 6
0
        public async Task SessionCreateDerivedPartition()
        {
            var dataset = new Dataset();
            var session = dataset.CreateSession();

            // generate a test store
            var originalStoreName = "OriginalStore";

            GenerateTestStore(originalStoreName, StorePath);

            // add a partition
            var partition0 = session.AddPsiStorePartition(originalStoreName, StorePath, "Partition_0");

            Assert.AreEqual(1, session.Partitions.Count);
            Assert.AreEqual("Partition_0", session.Partitions[0].Name);

            int multiplier = 7;

            // create a derived partition which contains the values from the original stream multiplied by a multiplier
            await session.CreateDerivedPsiPartitionAsync(
                (pipeline, importer, exporter, parameter) =>
            {
                var inputStream   = importer.OpenStream <int>("Root");
                var derivedStream = inputStream.Select(x => x *parameter).Write("DerivedStream", exporter);
            },
                multiplier,
                "Partition_1",
                false,
                "DerivedStore",
                StorePath);

            // should have created a new store partition
            Assert.AreEqual(2, session.Partitions.Count);
            Assert.IsTrue(PsiStore.Exists("OriginalStore", StorePath));
            Assert.IsTrue(PsiStore.Exists("DerivedStore", StorePath));

            // verify partition metadata
            var originalPartition = session.Partitions[0] as Partition <PsiStoreStreamReader>;

            Assert.AreEqual("Partition_0", originalPartition.Name);
            Assert.AreEqual("OriginalStore", originalPartition.StoreName);
            Assert.AreEqual($"{StorePath}{Path.DirectorySeparatorChar}OriginalStore.0000", originalPartition.StorePath);

            var derivedPartition = session.Partitions[1] as Partition <PsiStoreStreamReader>;

            Assert.AreEqual("Partition_1", derivedPartition.Name);
            Assert.AreEqual("DerivedStore", derivedPartition.StoreName);
            Assert.AreEqual(StorePath, derivedPartition.StorePath);

            // collections to capture stream values
            var originalValues = new List <int>();
            var originalTimes  = new List <DateTime>();
            var derivedValues  = new List <int>();
            var derivedTimes   = new List <DateTime>();

            // read stream values from the partitions
            using (var pipeline = Pipeline.Create())
            {
                var originalPartitionImporter = PsiStore.Open(pipeline, originalPartition.StoreName, originalPartition.StorePath);
                originalPartitionImporter.OpenStream <int>("Root").Do(
                    (i, e) =>
                {
                    originalValues.Add(i);
                    originalTimes.Add(e.OriginatingTime);
                });

                var derivedPartitionImporter = PsiStore.Open(pipeline, derivedPartition.StoreName, derivedPartition.StorePath);
                derivedPartitionImporter.OpenStream <int>("DerivedStream").Do(
                    (i, e) =>
                {
                    derivedValues.Add(i);
                    derivedTimes.Add(e.OriginatingTime);
                });

                pipeline.Run();
            }

            // verify that we read the data
            Assert.AreEqual(10, originalValues.Count);
            Assert.AreEqual(10, originalTimes.Count);
            Assert.AreEqual(10, derivedValues.Count);
            Assert.AreEqual(10, derivedTimes.Count);

            // verify values from both streams are what we expect
            CollectionAssert.AreEqual(originalValues.Select(x => x * multiplier).ToList(), derivedValues);
            CollectionAssert.AreEqual(originalTimes, derivedTimes);
        }