Ejemplo n.º 1
0
        /// <summary>
        /// Exports a streamable as an observable of events. Produces events that are sync time ordered.
        /// </summary>
        /// <typeparam name="TKey"></typeparam>
        /// <typeparam name="TPayload"></typeparam>
        /// <param name="stream"></param>
        /// <param name="reshapingPolicy">Policy that specifies whether and how events are reshaped at egress. Default passes events through unmodified.</param>
        /// <returns></returns>
        public static IObservable <PartitionedStreamEvent <TKey, TPayload> > ToStreamEventObservable <TKey, TPayload>(
            this IStreamable <PartitionKey <TKey>, TPayload> stream,
            ReshapingPolicy reshapingPolicy = ReshapingPolicy.None)
        {
            Invariant.IsNotNull(stream, nameof(stream));

            return(stream.ToStreamEventObservable(
                       null, Guid.NewGuid().ToString(), reshapingPolicy));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Exports a streamable as an observable of events. Produces events that are sync time ordered.
        /// </summary>
        /// <typeparam name="TPayload"></typeparam>
        /// <param name="container">The query container to which an egress point is being added.</param>
        /// <param name="identifier">A string that can uniquely identify the point of egress in the query.</param>
        /// <param name="stream"></param>
        /// <param name="reshapingPolicy">Policy that specifies whether and how events are reshaped at egress. Default passes events through unmodified.</param>
        /// <returns></returns>
        public static IObservable <StreamEvent <TPayload> > RegisterOutput <TPayload>(
            this QueryContainer container,
            IStreamable <Empty, TPayload> stream,
            ReshapingPolicy reshapingPolicy = ReshapingPolicy.None,
            string identifier = null)
        {
            Invariant.IsNotNull(stream, nameof(stream));

            return(stream.ToStreamEventObservable(
                       container, identifier ?? Guid.NewGuid().ToString(), reshapingPolicy));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Exports a streamable as an observable of events. Produces events that are sync time ordered.
        /// </summary>
        /// <typeparam name="TKey"></typeparam>
        /// <typeparam name="TPayload"></typeparam>
        /// <param name="stream"></param>
        /// <param name="reshapingPolicy">Policy that specifies whether and how events are reshaped at egress. Default passes events through unmodified.</param>
        /// <returns></returns>
        public static IObservable <ArraySegment <PartitionedStreamEvent <TKey, TPayload> > > ToStreamEventArrayObservable <TKey, TPayload>(
            this IStreamable <PartitionKey <TKey>, TPayload> stream,
            ReshapingPolicy reshapingPolicy = ReshapingPolicy.None)
        {
            Invariant.IsNotNull(stream, nameof(stream));

            return(stream.ToStreamEventArrayObservable(
                       () => new PartitionedStreamEvent <TKey, TPayload> [Config.DataBatchSize],
                       null,
                       Guid.NewGuid().ToString(),
                       reshapingPolicy));
        }
Ejemplo n.º 4
0
        internal static IObservable <ArraySegment <PartitionedStreamEvent <TKey, TPayload> > > ToStreamEventArrayObservable <TKey, TPayload>(
            this IStreamable <PartitionKey <TKey>, TPayload> stream,
            Func <PartitionedStreamEvent <TKey, TPayload>[]> generator,
            QueryContainer container,
            string identifer,
            ReshapingPolicy reshapingPolicy)
        {
            Invariant.IsNotNull(stream, nameof(stream));

            return((reshapingPolicy == ReshapingPolicy.None)
                ? new PartitionedStreamEventArrayObservable <TKey, TPayload>(stream, generator, container, identifer)
                : new PartitionedStreamEventArrayObservable <TKey, TPayload>(stream.ToEndEdgeFreeStream(), generator, container, identifer));
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Exports a streamable as an observable of events. Produces events that are sync time ordered.
        /// </summary>
        /// <typeparam name="TPayload"></typeparam>
        /// <param name="stream"></param>
        /// <param name="generator">A function that returns an array that will be populated with stream results.</param>
        /// <param name="reshapingPolicy">Policy that specifies whether and how events are reshaped at egress. Default passes events through unmodified.</param>
        /// <returns></returns>
        public static IObservable <ArraySegment <StreamEvent <TPayload> > > ToStreamEventArrayObservable <TPayload>(
            this IStreamable <Empty, TPayload> stream,
            Func <StreamEvent <TPayload>[]> generator,
            ReshapingPolicy reshapingPolicy = ReshapingPolicy.None)
        {
            Invariant.IsNotNull(stream, nameof(stream));

            return(stream.ToStreamEventArrayObservable(
                       generator,
                       null,
                       Guid.NewGuid().ToString(),
                       reshapingPolicy));
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Exports a streamable as an observable of events. Produces events that are sync time ordered.
        /// </summary>
        /// <typeparam name="TPayload"></typeparam>
        /// <param name="container">The query container to which an egress point is being added.</param>
        /// <param name="identifier">A string that can uniquely identify the point of egress in the query.</param>
        /// <param name="stream"></param>
        /// <param name="reshapingPolicy">Policy that specifies whether and how events are reshaped at egress. Default passes events through unmodified.</param>
        /// <returns></returns>
        public static IObservable <ArraySegment <StreamEvent <TPayload> > > RegisterArrayOutput <TPayload>(
            this QueryContainer container,
            IStreamable <Empty, TPayload> stream,
            ReshapingPolicy reshapingPolicy = ReshapingPolicy.None,
            string identifier = null)
        {
            Invariant.IsNotNull(stream, nameof(stream));

            return(stream.ToStreamEventArrayObservable(
                       () => new StreamEvent <TPayload> [Config.DataBatchSize],
                       container,
                       identifier ?? Guid.NewGuid().ToString(),
                       reshapingPolicy));
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Exports a streamable as an observable of events. Produces events that are sync time ordered.
        /// </summary>
        /// <typeparam name="TKey"></typeparam>
        /// <typeparam name="TPayload"></typeparam>
        /// <param name="container">The query container to which an egress point is being added.</param>
        /// <param name="identifier">A string that can uniquely identify the point of egress in the query.</param>
        /// <param name="stream"></param>
        /// <param name="generator">A function that returns an array that will be populated with stream results.</param>
        /// <param name="reshapingPolicy">Policy that specifies whether and how events are reshaped at egress. Default passes events through unmodified.</param>
        /// <returns></returns>
        public static IObservable <ArraySegment <PartitionedStreamEvent <TKey, TPayload> > > RegisterArrayOutput <TKey, TPayload>(
            this QueryContainer container,
            IStreamable <PartitionKey <TKey>, TPayload> stream,
            Func <PartitionedStreamEvent <TKey, TPayload>[]> generator,
            ReshapingPolicy reshapingPolicy = ReshapingPolicy.None,
            string identifier = null)
        {
            Invariant.IsNotNull(stream, nameof(stream));

            return(stream.ToStreamEventArrayObservable(
                       generator,
                       container,
                       identifier ?? Guid.NewGuid().ToString(),
                       reshapingPolicy));
        }
Ejemplo n.º 8
0
        private QueryContainer CreateQuery()
        {
            var query = new QueryContainer();

            Config.ForceRowBasedExecution = true;

            // incoming events are received via a conduit
            _tweetConduit = new Subject <StreamEvent <Tweet> >();
            var streamInput = query.RegisterInput(_tweetConduit, OnCompletedPolicy.None(), DisorderPolicy.Drop(TimeSpan.FromSeconds(3).Ticks),
                                                  PeriodicPunctuationPolicy.Time((ulong)TimeSpan.FromMilliseconds(1).Ticks));

            // outgoing events are pushed to the dashboard
            var myOutput = query.RegisterOutput(TwitterAnalytics(streamInput), ReshapingPolicy.None());

            myOutput.Subscribe(tweetEvent => Publish(tweetEvent));
            return(query);
        }
Ejemplo n.º 9
0
        internal static IObservable <StreamEvent <TPayload> > ToStreamEventObservable <TPayload>(
            this IStreamable <Empty, TPayload> stream,
            QueryContainer container,
            string identifier,
            ReshapingPolicy reshapingPolicy)
        {
            Invariant.IsNotNull(stream, nameof(stream));

            if (stream is IFusibleStreamable <Empty, TPayload> f && f.CanFuseEgressObservable)
            {
                if (reshapingPolicy == ReshapingPolicy.None)
                {
                    return(f.FuseEgressObservable((s, e, p, k) => new StreamEvent <TPayload>(s, e, p), container, identifier));
                }
            }

            return((reshapingPolicy == ReshapingPolicy.None)
                ? new StreamEventObservable <TPayload>(stream, container, identifier)
                : new StreamEventObservable <TPayload>(stream.ToEndEdgeFreeStream(), container, identifier));
        }
Ejemplo n.º 10
0
        static void Main(string[] args)
        {
            // This program is a supplement to the Trill Users Guide

            #region Section 2

            IObservable <ContextSwitch> cSTicksObs = new[]
            {
                new ContextSwitch(0, 1, 1, 120),
                new ContextSwitch(0, 3, 2, 121),
                new ContextSwitch(0, 5, 3, 124),
                new ContextSwitch(120, 2, 1, 123),
                new ContextSwitch(300, 1, 1, 122),
                new ContextSwitch(1800, 4, 2, 125),
                new ContextSwitch(3540, 2, 1, 119),
                new ContextSwitch(3600, 1, 1, 120),
            }.ToObservable();

            Console.WriteLine("Figure 11: Complete Pass-Through Trill Query Program");

            var cSTicksEventObs = cSTicksObs.Select(
                e => StreamEvent.CreateInterval(e.CSTicks, e.CSTicks + 1, e));
            var cSTicksStream =
                cSTicksEventObs.ToStreamable(OnCompletedPolicy.EndOfStream(),
                                             DisorderPolicy.Drop());
            var origCSTicksEventObs = cSTicksStream.ToStreamEventObservable();
            origCSTicksEventObs.Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                      "Start Time={0}\tEnd Time={1}\tCSTicks={2}\tPID={3}\tCID={4}\tCPUTemp={5}",
                                                                      e.SyncTime, e.OtherTime, e.Payload.CSTicks, e.Payload.PID, e.Payload.CID,
                                                                      e.Payload.CPUTemp)).Wait();
            Console.WriteLine();

            #endregion

            #region Section 3

            Console.WriteLine("Figure 13: Where Query Code");

            var cSTicks2Cores = cSTicksStream.Where(p => p.CID == 1 || p.CID == 2);
            cSTicks2Cores.ToStreamEventObservable().Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                          "Start Time={0}\tEnd Time={1}\tCSTicks={2}\tPID={3}\tCID={4}\tCPUTemp={5}",
                                                                                          e.SyncTime, e.OtherTime, e.Payload.CSTicks, e.Payload.PID, e.Payload.CID,
                                                                                          e.Payload.CPUTemp)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 16: Select Query Code");
            var cSNarrowTicks2Cores = cSTicks2Cores.Select(
                e => new { CSTicks = e.CSTicks, PID = e.PID, CID = e.CID });
            cSNarrowTicks2Cores.ToStreamEventObservable().Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                "Start Time={0}\tEnd Time={1}\tCSTicks={2}\tPID={3}\tCID={4}",
                                                                                                e.SyncTime, e.OtherTime, e.Payload.CSTicks, e.Payload.PID, e.Payload.CID)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 17: Alternate Select Query Code");
            var cSNarrowTicks2Cores2 = cSTicks2Cores.Select(
                e => new { CSTicks = e.CSTicks, PID = e.PID, CID = e.CID });
            cSNarrowTicks2Cores2.ToStreamEventObservable().Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                 "Start Time={0}\tEnd Time={1}\tCSTicks={2}\tPID={3}\tCID={4}",
                                                                                                 e.SyncTime, e.OtherTime, e.Payload.CSTicks, e.Payload.PID, e.Payload.CID)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 19: Where and Select with the LinQ Comprehension Syntax");
            var cSNarrowTicks2Cores3 = from e in cSTicksStream
                                       where e.CID == 1 || e.CID == 2
                                       select new { e.CSTicks, e.PID, e.CID };
            cSNarrowTicks2Cores3.ToStreamEventObservable().Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                 "Start Time={0}\tEnd Time={1}\tCSTicks={2}\tPID={3}\tCID={4}",
                                                                                                 e.SyncTime, e.OtherTime, e.Payload.CSTicks, e.Payload.PID, e.Payload.CID)).Wait();
            Console.WriteLine();

            #endregion

            #region Section 4

            Console.WriteLine("Figure 22: Join Query Code");

            var processNamesObs = new[]
            {
                new ProcessName(1, "Word"),
                new ProcessName(2, "Internet Explorer"),
                new ProcessName(3, "Excel"),
                new ProcessName(4, "Visual Studio"),
                new ProcessName(5, "Outlook"),
            }.ToObservable();
            var pNamesStream = processNamesObs.
                               Select(e => StreamEvent.CreateInterval(0, 10000, e)).
                               ToStreamable(OnCompletedPolicy.EndOfStream());
            var cSTicks2CoresWithPNames = cSNarrowTicks2Cores.Join(pNamesStream, e => e.PID, e => e.PID,
                                                                   (leftPayload, rightPayload) => new
            {
                leftPayload.CSTicks,
                leftPayload.PID,
                leftPayload.CID,
                PName = rightPayload.PName
            });
            cSTicks2CoresWithPNames.ToStreamEventObservable().Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                    "Start Time={0}\tEnd Time={1}\tCSTicks={2}\tPID={3}\tCID={4}\tPName={5}",
                                                                                                    e.SyncTime, e.OtherTime, e.Payload.CSTicks, e.Payload.PID, e.Payload.CID, e.Payload.PName)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 24: Join Query Comprehension Syntax");
            var cSTicks2CoresWithPNames2 = from leftPayload in cSNarrowTicks2Cores
                                           join rightPayload in pNamesStream on
                                           leftPayload.PID equals rightPayload.PID
                                           select new { leftPayload.CSTicks,
                                                        leftPayload.PID,
                                                        leftPayload.CID,
                                                        PName = rightPayload.PName };
            cSTicks2CoresWithPNames2.ToStreamEventObservable().Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                     "Start Time={0}\tEnd Time={1}\tCSTicks={2}\tPID={3}\tCID={4}\tPName={5}",
                                                                                                     e.SyncTime, e.OtherTime, e.Payload.CSTicks, e.Payload.PID, e.Payload.CID, e.Payload.PName)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 25: Entire Join Query Comprehension Syntax");
            var cSTicks2CoresWithPNames3 = from leftPayload in cSTicksStream
                                           join rightPayload in pNamesStream on
                                           leftPayload.PID equals rightPayload.PID
                                           where leftPayload.CID == 1 || leftPayload.CID == 2
                                           select new
            {
                leftPayload.CSTicks,
                leftPayload.PID,
                leftPayload.CID,
                rightPayload.PName
            };
            cSTicks2CoresWithPNames3.ToStreamEventObservable().Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                     "Start Time={0}\tEnd Time={1}\tCSTicks={2}\tPID={3}\tCID={4}\tPName={5}",
                                                                                                     e.SyncTime, e.OtherTime, e.Payload.CSTicks, e.Payload.PID, e.Payload.CID, e.Payload.PName)).Wait();
            Console.WriteLine();

            #endregion

            #region Section 5

            Console.WriteLine("Figure 26: AlterEventDuration Query Code");
            var infinitecSTicks2Cores =
                cSTicks2CoresWithPNames.AlterEventDuration(StreamEvent.InfinitySyncTime);
            infinitecSTicks2Cores.ToStreamEventObservable().Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                  "Start Time={0}\tEnd Time={1}\tCSTicks={2}\tPID={3}\tCID={4}\tPName={5}",
                                                                                                  e.SyncTime, e.OtherTime, e.Payload.CSTicks, e.Payload.PID, e.Payload.CID, e.Payload.PName)).Wait();
            Console.WriteLine();

            #endregion Section 6

            #region Section 6

            Console.WriteLine("Figure 28: ClipEventDuration Query Code");
            var clippedCSTicks2Cores = infinitecSTicks2Cores.
                                       ClipEventDuration(infinitecSTicks2Cores, e => e.CID, e => e.CID);
            clippedCSTicks2Cores.ToStreamEventObservable(ReshapingPolicy.CoalesceEndEdges()).Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                                                   "Start Time={0}\tEnd Time={1}\tCSTicks={2}\tPID={3}\tCID={4}\tPName={5}",
                                                                                                                                   e.SyncTime, e.OtherTime, e.Payload.CSTicks, e.Payload.PID, e.Payload.CID, e.Payload.PName)).Wait();
            Console.WriteLine();

            #endregion

            #region Section 7

            Console.WriteLine("Figure 30: Multicast Version of ClipEventDuration Query Code");
            var clippedCSTicks2Cores2 = infinitecSTicks2Cores.Multicast(
                s => s.ClipEventDuration(s, e => e.CID, e => e.CID));
            clippedCSTicks2Cores2.ToStreamEventObservable(ReshapingPolicy.CoalesceEndEdges()).Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                                                    "Start Time={0}\tEnd Time={1}\tCSTicks={2}\tPID={3}\tCID={4}\tPName={5}",
                                                                                                                                    e.SyncTime, e.OtherTime, e.Payload.CSTicks, e.Payload.PID, e.Payload.CID, e.Payload.PName)).Wait();
            Console.WriteLine();

            #endregion

            #region Section 8

            Console.WriteLine("Figure 32: ShiftEventLifetime Query Code");
            var shiftedClippedCS = clippedCSTicks2Cores.ShiftEventLifetime(startTime => 1);
            shiftedClippedCS.ToStreamEventObservable(ReshapingPolicy.CoalesceEndEdges()).Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                                               "Start Time={0}\tEnd Time={1}\tCSTicks={2}\tPID={3}\tCID={4}\tPName={5}",
                                                                                                                               e.SyncTime, e.OtherTime, e.Payload.CSTicks, e.Payload.PID, e.Payload.CID, e.Payload.PName)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 34: Timeslices Query Code");
            var timeslices = shiftedClippedCS.Join(cSTicks2CoresWithPNames, e => e.CID, e => e.CID,
                                                   (left, right) => new
            {
                left.PID,
                left.CID,
                left.PName,
                Timeslice = right.CSTicks - left.CSTicks
            });
            timeslices.ToStreamEventObservable(ReshapingPolicy.CoalesceEndEdges()).Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                                         "Start Time={0}\tEnd Time={1}\tPID={2}\tCID={3}\tPName={4}\tTimeslice={5}",
                                                                                                                         e.SyncTime, e.OtherTime, e.Payload.PID, e.Payload.CID, e.Payload.PName, e.Payload.Timeslice)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 36: Timeslices Query Code Using Multicast");
            var timeslices2 = cSTicks2CoresWithPNames.Multicast(
                t => t.AlterEventDuration(StreamEvent.InfinitySyncTime).
                Multicast(s => s.ClipEventDuration(s, e => e.CID, e => e.CID)).
                ShiftEventLifetime(startTime => 1).
                Join(t, e => e.CID, e => e.CID, (left, right) => new
            {
                left.PID,
                left.CID,
                left.PName,
                Timeslice = right.CSTicks - left.CSTicks
            }));
            timeslices2.ToStreamEventObservable(ReshapingPolicy.CoalesceEndEdges()).Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                                          "Start Time={0}\tEnd Time={1}\tPID={2}\tCID={3}\tPName={4}\tTimeslice={5}",
                                                                                                                          e.SyncTime, e.OtherTime, e.Payload.PID, e.Payload.CID, e.Payload.PName, e.Payload.Timeslice)).Wait();
            Console.WriteLine();

            #endregion

            #region Section 9

            Console.WriteLine("Figure 40: Rassigning Timeslice Lifetimes with AlterEventLifetime");
            var pID1CID1Timeslices = timeslices.Where(e => e.PID == 1 && e.CID == 1);
            var windowedTimeslices = pID1CID1Timeslices.
                                     AlterEventLifetime(origStartTime => (1 + (origStartTime - 1) / 3600) * 3600, 3600);
            windowedTimeslices.ToStreamEventObservable().Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                               "Start Time={0}\tEnd Time={1}\tPID={2}\tCID={3}\tPName={4}\tTimeslice={5}",
                                                                                               e.SyncTime, e.OtherTime, e.Payload.PID, e.Payload.CID, e.Payload.PName, e.Payload.Timeslice)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 41: Reassigning Lifetimes with HoppingWindowLifetime");
            var windowedTimeslices2 = pID1CID1Timeslices.HoppingWindowLifetime(3600, 3600);
            windowedTimeslices2.ToStreamEventObservable().Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                "Start Time={0}\tEnd Time={1}\tPID={2}\tCID={3}\tPName={4}\tTimeslice={5}",
                                                                                                e.SyncTime, e.OtherTime, e.Payload.PID, e.Payload.CID, e.Payload.PName, e.Payload.Timeslice)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 42: Sum Query Code");
            var totalConsumptionPerPeriod = windowedTimeslices.Sum(e => e.Timeslice);
            totalConsumptionPerPeriod.ToStreamEventObservable(ReshapingPolicy.CoalesceEndEdges()).Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                                                        "Start Time={0}\tEnd Time={1}\tPayload={2}",
                                                                                                                                        e.SyncTime, e.OtherTime, e.Payload)).Wait();
            Console.WriteLine();

            #endregion

            #region Section 10

            Console.WriteLine("Figure 44: Group and Apply Query Code");
            var totalConsumptionPerPeriodAllCoresAllProcesses = timeslices.GroupApply(
                e => new { e.CID, e.PID, e.PName },
                s => s.HoppingWindowLifetime(3600, 3600).Sum(e => e.Timeslice),
                (g, p) => new { g.Key.CID, g.Key.PName, TotalTime = p });
            totalConsumptionPerPeriodAllCoresAllProcesses.ToStreamEventObservable(ReshapingPolicy.CoalesceEndEdges()).Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                                                                            "Start Time={0}\tEnd Time={1}\tCID={2}\tPName={3}\tTotaltime={4}",
                                                                                                                                                            e.SyncTime, e.OtherTime, e.Payload.CID, e.Payload.PName, e.Payload.TotalTime)).Wait();
            Console.WriteLine();

            #endregion

            #region Section 11

            Console.WriteLine("Figure 49: Chop Query Code");
            Console.WriteLine("NB: This query is expected to fail!");
            var altCSTicksObs = new[]
            {
                new ContextSwitch(0, 1, 1, 120),
                new ContextSwitch(0, 3, 2, 121),
                new ContextSwitch(0, 5, 3, 124),
                new ContextSwitch(120, 2, 1, 123),
                new ContextSwitch(300, 1, 1, 122),
                new ContextSwitch(1800, 4, 2, 125),
                new ContextSwitch(3540, 2, 1, 119),
                new ContextSwitch(3600, 1, 1, 120),
                new ContextSwitch(5400, 3, 2, 122),
                new ContextSwitch(7200, 4, 2, 121),
            }.ToObservable();
            var altCSTicksEventObs = altCSTicksObs.Select(
                e => StreamEvent.CreateInterval(e.CSTicks, e.CSTicks + 1, e));
            var altCSTicksStream =
                altCSTicksEventObs.ToStreamable(OnCompletedPolicy.EndOfStream(), DisorderPolicy.Drop());
            var cSTicksWithExtraCS = altCSTicksStream.AlterEventDuration(StreamEvent.InfinitySyncTime).
                                     Multicast(s => s.ClipEventDuration(s, e => e.CID, e => e.CID)).
                                     Chop(0, 3600).
                                     Select((origStartTime, e) =>
                                            new { CSTicks = origStartTime, e.PID, e.CID, e.CPUTemp }).
                                     AlterEventDuration(1);
            try
            {
                cSTicksWithExtraCS.ToStreamEventObservable().Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                   "Start Time={0}\tEnd Time={1}\tCSTicks{2}\tPID={3}\tCID={4}\tCPUTemp{5}",
                                                                                                   e.SyncTime, e.OtherTime, e.Payload.CSTicks, e.Payload.PID, e.Payload.CID, e.Payload.CPUTemp)).Wait();
            }
            catch (AggregateException e)
            {
                foreach (var ex in e.InnerExceptions)
                {
                    Console.WriteLine("{0}", ex.Message);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("{0}", e.Message);
            }
            Console.WriteLine();

            Console.WriteLine("Figure 51: Improved Chop Query Code");
            var cSTicksWithExtraCSImp = altCSTicksStream.
                                        AlterEventDuration(StreamEvent.InfinitySyncTime).
                                        Multicast(s => s.ClipEventDuration(s, e => e.CID, e => e.CID)).
                                        Join(new[] { StreamEvent.CreateInterval(0, 10800, Unit.Default) }.
                                             ToObservable().ToStreamable(OnCompletedPolicy.EndOfStream()),
                                             (left, right) => left).Chop(0, 3600).Select((origStartTime, e) =>
                                                                                         new { e.CID, e.PID, e.CPUTemp, CSTicks = origStartTime }).
                                        AlterEventDuration(1);
            cSTicksWithExtraCSImp.ToStreamEventObservable().Where(e => e.IsData).ForEachAsync(e => Console.WriteLine(
                                                                                                  "Start Time={0}\tEnd Time={1}\tCSTicks{2}\tPID={3}\tCID={4}\tCPUTemp{5}",
                                                                                                  e.SyncTime, e.OtherTime, e.Payload.CSTicks, e.Payload.PID, e.Payload.CID, e.Payload.CPUTemp)).Wait();
            Console.WriteLine();

            #endregion

            #region Section 12

            Console.WriteLine("Figure 53: Out of Order Input (Throw)");
            var ooStreamableThrow = new[]
            {
                StreamEvent.CreateInterval(10, 100, 1),
                StreamEvent.CreateInterval(0, 50, 2),
                StreamEvent.CreateInterval(0, 10, 3),
                StreamEvent.CreateInterval(11, 90, 4)
            }.ToObservable().ToStreamable(OnCompletedPolicy.EndOfStream(), DisorderPolicy.Throw());
            try
            {
                ooStreamableThrow.ToStreamEventObservable().Where(e => e.IsData || e.IsPunctuation).ForEachAsync(e => WriteEvent(e)).Wait();
            }
            catch (Exception e)
            {
                Console.WriteLine("{0}", e.Message);
            }
            Console.WriteLine();

            Console.WriteLine("Figure 54: Out of Order Input (Drop)");
            var ooStreamableDrop = new[]
            {
                StreamEvent.CreateInterval(10, 100, 1),
                StreamEvent.CreateInterval(0, 50, 2),
                StreamEvent.CreateInterval(0, 10, 3),
                StreamEvent.CreateInterval(11, 90, 4)
            }.ToObservable().ToStreamable(OnCompletedPolicy.EndOfStream(), DisorderPolicy.Drop());
            ooStreamableDrop.ToStreamEventObservable().Where(e => e.IsData || e.IsPunctuation).ForEachAsync(e => WriteEvent(e)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 55: Out of Order Input (Adjust)");
            var ooStreamableAdjust = new[]
            {
                StreamEvent.CreateInterval(10, 100, 1),
                StreamEvent.CreateInterval(0, 50, 2),
                StreamEvent.CreateInterval(0, 10, 3),
                StreamEvent.CreateInterval(11, 90, 4)
            }.ToObservable().ToStreamable(OnCompletedPolicy.EndOfStream(), DisorderPolicy.Adjust());
            ooStreamableAdjust.ToStreamEventObservable().Where(e => e.IsData || e.IsPunctuation).ForEachAsync(e => WriteEvent(e)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 57: Creating PNamesStream with Edge Events");
            var pNamesStream2 = processNamesObs.Select(e => StreamEvent.CreateStart(0, e)).
                                Concat(processNamesObs.Select(
                                           e => StreamEvent.CreateEnd(10000, 0, e))).
                                ToStreamable(OnCompletedPolicy.EndOfStream());
            pNamesStream2.ToStreamEventObservable().Where(e => e.IsData || e.IsPunctuation).ForEachAsync(e => WriteEvent(e)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 58: Creating PNameStream using Interval and Edge Events");
            var processNamesObs1 = new[]
            {
                new ProcessName(1, "Word"),
                new ProcessName(2, "Internet Explorer"),
                new ProcessName(3, "Excel"),
            }.ToObservable();
            var processNamesObs2 = new[]
            {
                new ProcessName(4, "Visual Studio"),
                new ProcessName(5, "Outlook"),
            }.ToObservable();
            var pNamesStream3 = processNamesObs1.Select(e => StreamEvent.CreateInterval(0, 10000, e)).
                                Concat(processNamesObs2.Select(e => StreamEvent.CreateStart(0, e))).
                                Concat(processNamesObs2.Select(e => StreamEvent.CreateEnd(10000, 0, e))).
                                ToStreamable(OnCompletedPolicy.EndOfStream());
            pNamesStream3.ToStreamEventObservable().Where(e => e.IsData || e.IsPunctuation).ForEachAsync(e => WriteEvent(e)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 59: Coalescing Matching Edges");
            pNamesStream3.ToStreamEventObservable(ReshapingPolicy.CoalesceEndEdges()).Where(e => e.IsData || e.IsPunctuation).ForEachAsync(e => WriteEvent(e)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 60: Input with Punctuations");
            var streamablePunctuations = new[]
            {
                StreamEvent.CreateInterval(0, 1, 1),
                StreamEvent.CreateInterval(3, 4, 2),
                StreamEvent.CreatePunctuation <int>(10),
                StreamEvent.CreatePunctuation <int>(20),
                StreamEvent.CreatePunctuation <int>(30),
                StreamEvent.CreatePunctuation <int>(40),
                StreamEvent.CreateInterval(40, 41, 3)
            }.ToObservable().ToStreamable(OnCompletedPolicy.None(), DisorderPolicy.Drop());
            streamablePunctuations.ToStreamEventObservable().Where(e => e.IsData || e.IsPunctuation).ForEachAsync(e => WriteEvent(e)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 61: Input with Generated Punctuations After Every Event");
            var streamableIthEventPunctuations = new[]
            {
                StreamEvent.CreateInterval(0, 1, 1),
                StreamEvent.CreateInterval(3, 4, 2),
                StreamEvent.CreateInterval(40, 41, 3)
            }.ToObservable().ToStreamable(OnCompletedPolicy.None(), DisorderPolicy.Drop(),
                                          PeriodicPunctuationPolicy.Count(1));
            streamableIthEventPunctuations.ToStreamEventObservable().Where(e => e.IsData || e.IsPunctuation).ForEachAsync(e => WriteEvent(e)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 62: Input with Generated Punctuations After 10 Tick Periods");
            var streamableTimePeriodEventPunctuations = new[]
            {
                StreamEvent.CreateInterval(0, 1, 1),
                StreamEvent.CreateInterval(10, 4, 2),
                StreamEvent.CreateInterval(19, 4, 3),
                StreamEvent.CreateInterval(40, 41, 4)
            }.ToObservable().ToStreamable(OnCompletedPolicy.None(), DisorderPolicy.Drop(),
                                          PeriodicPunctuationPolicy.Time(10));
            streamableTimePeriodEventPunctuations.ToStreamEventObservable().Where(e => e.IsData || e.IsPunctuation).ForEachAsync(e => WriteEvent(e)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 63: Query with No Output");
            var IncompleteOutputQuery1 = new[]
            {
                StreamEvent.CreateInterval(0, 10, 1),
                StreamEvent.CreateInterval(1, 11, 2)
            }.ToObservable().ToStreamable(OnCompletedPolicy.None()).Count().ToStreamEventObservable();
            IncompleteOutputQuery1.Where(e => e.IsData || e.IsPunctuation).ForEachAsync(e => WriteEvent(e)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 64: Query with Output up to Time 1");
            var IncompleteOutputQuery2 = new[]
            {
                StreamEvent.CreateInterval(0, 10, 1),
                StreamEvent.CreateInterval(1, 11, 2),
                StreamEvent.CreatePunctuation <int>(1)
            }.ToObservable().ToStreamable(OnCompletedPolicy.None()).Count().ToStreamEventObservable();
            IncompleteOutputQuery2.Where(e => e.IsData || e.IsPunctuation).ForEachAsync(e => WriteEvent(e)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 65: Alternate Query with Output up to Time 1");
            var IncompleteOutputQuery3 = new[]
            {
                StreamEvent.CreateInterval(0, 10, 1),
                StreamEvent.CreateInterval(1, 11, 2)
            }.ToObservable().ToStreamable(OnCompletedPolicy.Flush()).Count().ToStreamEventObservable();
            IncompleteOutputQuery3.Where(e => e.IsData || e.IsPunctuation).ForEachAsync(e => WriteEvent(e)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 66: Query with all Output");
            var CompleteOutputQuery1 = new[]
            {
                StreamEvent.CreateInterval(0, 10, 1),
                StreamEvent.CreateInterval(1, 11, 2),
                StreamEvent.CreatePunctuation <int>(StreamEvent.InfinitySyncTime)
            }.ToObservable().ToStreamable(OnCompletedPolicy.None()).Count().ToStreamEventObservable();
            CompleteOutputQuery1.Where(e => e.IsData || e.IsPunctuation).ForEachAsync(e => WriteEvent(e)).Wait();
            Console.WriteLine();

            Console.WriteLine("Figure 67: Alternate Query with all Output");
            var CompleteOutputQuery2 = new[]
            {
                StreamEvent.CreateInterval(0, 10, 1),
                StreamEvent.CreateInterval(1, 11, 2)
            }.ToObservable().ToStreamable(OnCompletedPolicy.EndOfStream()).Count().
            ToStreamEventObservable();
            CompleteOutputQuery2.Where(e => e.IsData || e.IsPunctuation).ForEachAsync(e => WriteEvent(e)).Wait();
            Console.WriteLine();

            #endregion

            Console.ReadLine();
        }