<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblog.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>StreamInsight Team : LINQ</title><link>http://sqlblog.com/blogs/stream_insight/archive/tags/LINQ/default.aspx</link><description>Tags: LINQ</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Using Subjects to Deploy Queries Dynamically</title><link>http://sqlblog.com/blogs/stream_insight/archive/2012/08/30/using-subjects-to-deploy-queries-dynamically.aspx</link><pubDate>Thu, 30 Aug 2012 18:13:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:44945</guid><dc:creator>Roman Schindlauer</dc:creator><slash:comments>0</slash:comments><comments>http://sqlblog.com/blogs/stream_insight/comments/44945.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/stream_insight/commentrss.aspx?PostID=44945</wfw:commentRss><description>&lt;p&gt;In the previous blog posting, we showed how to construct and deploy query fragments to a StreamInsight server, and how to re-use them later. In today&amp;rsquo;s posting we&amp;rsquo;ll integrate this pattern into a method of dynamically composing a new query with an existing one.&lt;/p&gt;
&lt;p&gt;The construct that enables this scenario in StreamInsight V2.1 is a &lt;em&gt;Subject&lt;/em&gt;. A Subject lets me create a junction element in an existing query that I can tap into while the query is running.&lt;/p&gt;
&lt;p&gt;To set this up as an end-to-end example, let&amp;rsquo;s first define a stream simulator as our data source:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; generator = myApp.DefineObservable( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt; t) =&amp;gt; &lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.Interval(t).Select(_ =&amp;gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SourcePayload&lt;/span&gt;()));&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This &amp;lsquo;generator&amp;rsquo; produces a new instance of &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;SourcePayload&lt;/strong&gt;&lt;/span&gt; with a period of &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;t&lt;/strong&gt;&lt;/span&gt; (system time) as an &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;IObservable&lt;/strong&gt;&lt;/span&gt;. &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;SourcePayload&lt;/strong&gt;&lt;/span&gt; happens to have a property of type &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;double&lt;/strong&gt;&lt;/span&gt; as its payload data.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s also define a sink for our example&amp;mdash;an &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;IObserver&lt;/strong&gt;&lt;/span&gt; of double values that writes to the console:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; console = myApp.DefineObserver( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; label) =&amp;gt; &lt;span style="color:#2b91af;"&gt;Observer&lt;/span&gt;.Create&amp;lt;&lt;span style="color:#0000ff;"&gt;double&lt;/span&gt;&amp;gt;(e =&amp;gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;"{0}: {1}"&lt;/span&gt;, label, e))) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Deploy(&lt;span style="color:#a31515;"&gt;"ConsoleSink"&lt;/span&gt;);&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The observer takes a string as parameter which is used as a label on the console, so that we can distinguish the output of different sink instances. Note that we also deploy this observer, so that we can retrieve it later from the server from a different process.&lt;/p&gt;
&lt;p&gt;Remember how we defined the aggregation as an &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;IQStreamable&lt;/strong&gt;&lt;/span&gt; function in the previous article? We will use that as well:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; avg = myApp &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .DefineStreamable((&lt;span style="color:#2b91af;"&gt;IQStreamable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;SourcePayload&lt;/span&gt;&amp;gt; s, &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt; w) =&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; s.TumblingWindow(w) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; win.Avg(e =&amp;gt; e.Value)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Deploy(&lt;span style="color:#a31515;"&gt;"AverageQuery"&lt;/span&gt;);&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Then we define the Subject, which acts as an observable sequence as well as an observer. Thus, we can feed a single source into the Subject and have multiple consumers&amp;mdash;that can come and go at runtime&amp;mdash;on the other side:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; subject = myApp.CreateSubject(&lt;span style="color:#a31515;"&gt;"Subject"&lt;/span&gt;, () =&amp;gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Subject&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;SourcePayload&lt;/span&gt;&amp;gt;());&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Subject are always deployed automatically. Their name is used to retrieve them from a (potentially) different process (see below).&lt;/p&gt;
&lt;p&gt;Note that the Subject as we defined it here doesn&amp;rsquo;t know anything about temporal streams. It is merely a sequence of &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;SourcePayload&lt;/strong&gt;&lt;/span&gt;s, without any notion of StreamInsight point events or CTIs. So in order to compose a temporal query on top of the Subject, we need to 'promote' the sequence of &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;SourcePayload&lt;/strong&gt;&lt;/span&gt;s into an &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;IQStreamable&lt;/strong&gt;&lt;/span&gt; of point events, including CTIs:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; stream = subject.ToPointStreamable( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e =&amp;gt; &lt;span style="color:#2b91af;"&gt;PointEvent&lt;/span&gt;.CreateInsert&amp;lt;&lt;span style="color:#2b91af;"&gt;SourcePayload&lt;/span&gt;&amp;gt;(e.Timestamp, e), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;AdvanceTimeSettings&lt;/span&gt;.StrictlyIncreasingStartTime);&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In a later posting we will show how to use Subjects that have more awareness of time and can be used as a junction between &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;QStreamable&lt;/strong&gt;&lt;/span&gt;s instead of &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;IQbservable&lt;/strong&gt;&lt;/span&gt;s.&lt;/p&gt;
&lt;p&gt;Having turned the Subject into a temporal stream, we can now define the aggregate on this stream. We will use the &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;IQStreamable&lt;/strong&gt;&lt;/span&gt; entity &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;avg&lt;/strong&gt;&lt;/span&gt; that we defined above:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; longAverages = avg(stream, &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(5));&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In order to run the query, we need to bind it to a sink, and bind the subject to the source:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; standardQuery = longAverages &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Bind(console(&lt;span style="color:#a31515;"&gt;"5sec average"&lt;/span&gt;)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .With(generator(&lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromMilliseconds(300)).Bind(subject));&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lastly, we start the process:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;standardQuery.Run(&lt;span style="color:#a31515;"&gt;"StandardProcess"&lt;/span&gt;);&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now we have a simple query running end-to-end, producing results. What follows next is the crucial part of tapping into the Subject and adding another query that runs in parallel, using the same query definition (the &amp;ldquo;AverageQuery&amp;rdquo;) but with a different window length. We are assuming that we connected to the same StreamInsight server from a different process or even client, and thus have to retrieve the previously deployed entities through their names:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;&lt;span style="color:#008000;"&gt;// simulate the addition of a 'fast' query from a separate server connection,&lt;/span&gt; &lt;br /&gt;&lt;span style="color:#008000;"&gt;// by retrieving the aggregation query fragment&lt;/span&gt; &lt;br /&gt;&lt;span style="color:#008000;"&gt;// (instead of simply using the 'avg' object)&lt;/span&gt; &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; averageQuery = myApp &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .GetStreamable&amp;lt;&lt;span style="color:#2b91af;"&gt;IQStreamable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;SourcePayload&lt;/span&gt;&amp;gt;, &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;"AverageQuery"&lt;/span&gt;); &lt;br /&gt; &lt;br /&gt;&lt;span style="color:#008000;"&gt;// retrieve the input sequence as a subject&lt;/span&gt; &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; inputSequence = myApp &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .GetSubject&amp;lt;&lt;span style="color:#2b91af;"&gt;SourcePayload&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;SourcePayload&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;"Subject"&lt;/span&gt;); &lt;br /&gt; &lt;br /&gt;&lt;span style="color:#008000;"&gt;// retrieve the registered sink&lt;/span&gt; &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; sink = myApp.GetObserver&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;"ConsoleSink"&lt;/span&gt;); &lt;br /&gt; &lt;br /&gt;&lt;span style="color:#008000;"&gt;// turn the sequence into a temporal stream&lt;/span&gt; &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; stream2 = inputSequence.ToPointStreamable( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e =&amp;gt; &lt;span style="color:#2b91af;"&gt;PointEvent&lt;/span&gt;.CreateInsert&amp;lt;&lt;span style="color:#2b91af;"&gt;SourcePayload&lt;/span&gt;&amp;gt;(e.Timestamp, e), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;AdvanceTimeSettings&lt;/span&gt;.StrictlyIncreasingStartTime); &lt;br /&gt; &lt;br /&gt;&lt;span style="color:#008000;"&gt;// apply the query, now with a different window length&lt;/span&gt; &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; shortAverages = averageQuery(stream2, &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(1)); &lt;br /&gt; &lt;br /&gt;&lt;span style="color:#008000;"&gt;// bind new sink to query and run it&lt;/span&gt; &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; fastQuery = shortAverages &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Bind(sink(&lt;span style="color:#a31515;"&gt;"1sec average"&lt;/span&gt;)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Run(&lt;span style="color:#a31515;"&gt;"FastProcess"&lt;/span&gt;);&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The attached solution demonstrates the sample end-to-end.&lt;/p&gt;
&lt;p&gt;Regards, &lt;br /&gt;The StreamInsight Team&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=44945" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/stream_insight/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Taming Hopping Windows</title><link>http://sqlblog.com/blogs/stream_insight/archive/2012/07/03/taming-hopping-windows.aspx</link><pubDate>Wed, 04 Jul 2012 00:03:06 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:44192</guid><dc:creator>Roman Schindlauer</dc:creator><slash:comments>0</slash:comments><comments>http://sqlblog.com/blogs/stream_insight/comments/44192.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/stream_insight/commentrss.aspx?PostID=44192</wfw:commentRss><description>&lt;p&gt;At first glance, hopping windows seem fairly innocuous and obvious. They organize events into windows with a simple periodic definition: the windows have some duration &lt;i&gt;d &lt;/i&gt;(e.g. a window covers 5 second time intervals), an interval or period &lt;i&gt;p &lt;/i&gt;(e.g. a new window starts every 2 seconds) and an alignment &lt;i&gt;a &lt;/i&gt;(e.g. one of those windows starts at 12:00 PM on March 15, 2012 UTC).&lt;/p&gt;  &lt;div class="le-pavsc-container"&gt;   &lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;var&lt;/span&gt; wins = xs      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; .HoppingWindow(&lt;span&gt;TimeSpan&lt;/span&gt;.FromSeconds(5),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;TimeSpan&lt;/span&gt;.FromSeconds(2),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;DateTime&lt;/span&gt;(2012, 3, 15, 12, 0, 0, &lt;span&gt;DateTimeKind&lt;/span&gt;.Utc));&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Logically, there is a window with start time &lt;i&gt;a &lt;/i&gt;+ &lt;i&gt;np&lt;/i&gt; and end time &lt;i&gt;a &lt;/i&gt;+ &lt;i&gt;np&lt;/i&gt; + &lt;i&gt;d&lt;/i&gt; for every integer &lt;i&gt;n&lt;/i&gt;. That’s a lot of windows. So why doesn’t the following query (always) blow up? &lt;/p&gt;  &lt;div class="le-pavsc-container"&gt;   &lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;var&lt;/span&gt; query = wins.Select(win =&amp;gt; win.Count());&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;A few users have asked why StreamInsight doesn’t produce output for empty windows. Primarily it’s because there is an infinite number of empty windows! (Actually, StreamInsight uses &lt;b&gt;DateTimeOffset.MaxValue&lt;/b&gt; to approximate “the end of time” and &lt;b&gt;DateTimeOffset.MinValue&lt;/b&gt; to approximate “the beginning of time”, so the number of windows is lower in practice.)&lt;/p&gt;  &lt;p&gt;That was the good news. Now the bad news. Events also have duration. Consider the following simple input:&lt;/p&gt;  &lt;div class="le-pavsc-container"&gt;   &lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;var&lt;/span&gt; xs = &lt;span&gt;this&lt;/span&gt;.Application       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .DefineEnumerable(() =&amp;gt; &lt;span&gt;new&lt;/span&gt;[]       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;span&gt;EdgeEvent&lt;/span&gt;.CreateStart(&lt;span&gt;DateTimeOffset&lt;/span&gt;.UtcNow, 0) })       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .ToStreamable(&lt;span&gt;AdvanceTimeSettings&lt;/span&gt;.IncreasingStartTime);&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Because the event has no explicit end edge, it lasts until the end of time. So there are lots of non-empty windows if we apply a hopping window to that single event! For this reason, we need to be careful with hopping window queries in StreamInsight. Or we can switch to a custom implementation of hopping windows that doesn’t suffer from this shortcoming.&lt;/p&gt;  &lt;p&gt;The alternate window implementation produces output &lt;i&gt;only when the input changes&lt;/i&gt;. We start by breaking up the timeline into non-overlapping intervals assigned to each window. In figure 1, six hopping windows (“Windows”) are assigned to six intervals (“Assignments”) in the timeline. Next we take input events (“Events”) and alter their lifetimes (“Altered Events”) so that they cover the intervals of the windows they intersect. In figure 1, you can see that the first event &lt;i&gt;e&lt;/i&gt;&lt;sub&gt;1&lt;/sub&gt; intersects windows &lt;i&gt;w&lt;/i&gt;&lt;sub&gt;1&lt;/sub&gt; and &lt;i&gt;w&lt;/i&gt;&lt;sub&gt;2&lt;/sub&gt; so it is adjusted to cover assignments &lt;i&gt;a&lt;/i&gt;&lt;sub&gt;1&lt;/sub&gt; and &lt;i&gt;a&lt;/i&gt;&lt;sub&gt;2&lt;/sub&gt;. Finally, we can use snapshot windows (“Snapshots”) to produce output for the hopping windows. Notice however that instead of having six windows generating output, we have only four. The first and second snapshots correspond to the first and second hopping windows. The remaining snapshots however cover two hopping windows each! While in this example we saved only two events, the savings can be more significant when the ratio of event duration to window duration is higher. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-27-92-metablogapi/8713.image4.png"&gt;&lt;img style="border:0px currentcolor;padding-top:0px;padding-right:0px;padding-left:0px;display:inline;background-image:none;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-27-92-metablogapi/2450.image4_5F00_thumb.png" width="550" height="426" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Figure 1: Timeline&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The implementation of this strategy is straightforward. We need to set the start times of events to the start time of the interval assigned to the earliest window including the start time. Similarly, we need to modify the end times of events to the end time of the interval assigned to the latest window including the end time. The following snap-to-boundary function that rounds a timestamp value &lt;i&gt;t&lt;/i&gt; down to the nearest value &lt;i&gt;t' &lt;/i&gt;&amp;lt;= &lt;i&gt;t&lt;/i&gt; such that &lt;i&gt;t' &lt;/i&gt;is &lt;i&gt;a &lt;/i&gt;+&lt;i&gt; np &lt;/i&gt;for some integer &lt;i&gt;n&lt;/i&gt; will be useful. For convenience, we will represent both DateTime and TimeSpan values using long ticks:&lt;/p&gt;  &lt;div class="le-pavsc-container"&gt;   &lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;static&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; SnapToBoundary(&lt;span&gt;long&lt;/span&gt; t, &lt;span&gt;long&lt;/span&gt; a, &lt;span&gt;long&lt;/span&gt; p)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;return&lt;/span&gt; t - ((t - a) % p) - (t &amp;gt; a ? 0L : p);       &lt;br /&gt;}&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;How do we find the earliest window including the start time for an event? It’s the window following the last window that does not include the start time &lt;i&gt;assuming that there are no gaps in the windows (i.e. duration &amp;lt; interval), and limitation of this solution&lt;/i&gt;. To find the end time of that antecedent window, we need to know the alignment of window ends:&lt;/p&gt;  &lt;div class="le-pavsc-container"&gt;   &lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;long&lt;/span&gt; e = a + (d % p);&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Using the window end alignment, we are finally ready to describe the start time selector:&lt;/p&gt;  &lt;div class="le-pavsc-container"&gt;   &lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;static&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; AdjustStartTime(&lt;span&gt;long&lt;/span&gt; t, &lt;span&gt;long&lt;/span&gt; e, &lt;span&gt;long&lt;/span&gt; p)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;return&lt;/span&gt; SnapToBoundary(t, e, p) + p;       &lt;br /&gt;}&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;To find the latest window including the end time for an event, we look for the last window start time (non-inclusive):&lt;/p&gt;  &lt;div class="le-pavsc-container"&gt;   &lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;long&lt;/span&gt; AdjustEndTime(&lt;span&gt;long&lt;/span&gt; t, &lt;span&gt;long&lt;/span&gt; a, &lt;span&gt;long&lt;/span&gt; d, &lt;span&gt;long&lt;/span&gt; p)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;return&lt;/span&gt; SnapToBoundary(t - 1, a, p) + p + d;       &lt;br /&gt;}&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Bringing it together, we can define the translation from events to ‘altered events’ as in Figure 1:&lt;/p&gt;  &lt;div class="le-pavsc-container"&gt;   &lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;IQStreamable&lt;/span&gt;&amp;lt;T&amp;gt; SnapToWindowIntervals&amp;lt;T&amp;gt;(&lt;span&gt;IQStreamable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span&gt;TimeSpan&lt;/span&gt; duration, &lt;span&gt;TimeSpan&lt;/span&gt; interval, &lt;span&gt;DateTime&lt;/span&gt; alignment)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;if&lt;/span&gt; (source == &lt;span&gt;null&lt;/span&gt;) &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;ArgumentNullException&lt;/span&gt;(&lt;span&gt;&amp;quot;source&amp;quot;&lt;/span&gt;);       &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;// reason about DateTime and TimeSpan in ticks &lt;/span&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;long&lt;/span&gt; d = &lt;span&gt;Math&lt;/span&gt;.Min(&lt;span&gt;DateTime&lt;/span&gt;.MaxValue.Ticks, duration.Ticks);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;long&lt;/span&gt; p = &lt;span&gt;Math&lt;/span&gt;.Min(&lt;span&gt;DateTime&lt;/span&gt;.MaxValue.Ticks, &lt;span&gt;Math&lt;/span&gt;.Abs(interval.Ticks));       &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;// set alignment to earliest possible window &lt;/span&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;var&lt;/span&gt; a = alignment.ToUniversalTime().Ticks % p;       &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;// verify constraints of this solution &lt;/span&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;if&lt;/span&gt; (d &amp;lt;= 0L) { &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;ArgumentOutOfRangeException&lt;/span&gt;(&lt;span&gt;&amp;quot;duration&amp;quot;&lt;/span&gt;); }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;if&lt;/span&gt; (p == 0L || p &amp;gt; d) { &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;ArgumentOutOfRangeException&lt;/span&gt;(&lt;span&gt;&amp;quot;interval&amp;quot;&lt;/span&gt;); }       &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;// find the alignment of window ends &lt;/span&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;long&lt;/span&gt; e = a + (d % p);       &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;return&lt;/span&gt; source.AlterEventLifetime(       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; evt =&amp;gt; ToDateTime(AdjustStartTime(evt.StartTime.ToUniversalTime().Ticks, e, p)),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; evt =&amp;gt; ToDateTime(AdjustEndTime(evt.EndTime.ToUniversalTime().Ticks, a, d, p)) -       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ToDateTime(AdjustStartTime(evt.StartTime.ToUniversalTime().Ticks, e, p)));       &lt;br /&gt;}       &lt;br /&gt;      &lt;br /&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;DateTime&lt;/span&gt; ToDateTime(&lt;span&gt;long&lt;/span&gt; ticks)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;// just snap to min or max value rather than under/overflowing &lt;/span&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;return&lt;/span&gt; ticks &amp;lt; &lt;span&gt;DateTime&lt;/span&gt;.MinValue.Ticks       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ? &lt;span&gt;new&lt;/span&gt; &lt;span&gt;DateTime&lt;/span&gt;(&lt;span&gt;DateTime&lt;/span&gt;.MinValue.Ticks, &lt;span&gt;DateTimeKind&lt;/span&gt;.Utc)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : ticks &amp;gt; &lt;span&gt;DateTime&lt;/span&gt;.MaxValue.Ticks       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ? &lt;span&gt;new&lt;/span&gt; &lt;span&gt;DateTime&lt;/span&gt;(&lt;span&gt;DateTime&lt;/span&gt;.MaxValue.Ticks, &lt;span&gt;DateTimeKind&lt;/span&gt;.Utc)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span&gt;new&lt;/span&gt; &lt;span&gt;DateTime&lt;/span&gt;(ticks, &lt;span&gt;DateTimeKind&lt;/span&gt;.Utc);       &lt;br /&gt;}&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Finally, we can describe our custom hopping window operator:&lt;/p&gt;  &lt;div class="le-pavsc-container"&gt;   &lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;IQWindowedStreamable&lt;/span&gt;&amp;lt;T&amp;gt; HoppingWindow2&amp;lt;T&amp;gt;(       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;IQStreamable&lt;/span&gt;&amp;lt;T&amp;gt; source,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;TimeSpan&lt;/span&gt; duration,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;TimeSpan&lt;/span&gt; interval,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;DateTime&lt;/span&gt; alignment)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;if&lt;/span&gt; (source == &lt;span&gt;null&lt;/span&gt;) { &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;ArgumentNullException&lt;/span&gt;(&lt;span&gt;&amp;quot;source&amp;quot;&lt;/span&gt;); }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;return&lt;/span&gt; SnapToWindowIntervals(source, duration, interval, alignment).SnapshotWindow();       &lt;br /&gt;}&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;By switching from HoppingWindow to HoppingWindow2 in the following example, the query returns quickly rather than gobbling resources and ultimately failing!&lt;/p&gt;  &lt;div class="le-pavsc-container"&gt;   &lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Main()       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;var&lt;/span&gt; start = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;DateTimeOffset&lt;/span&gt;(&lt;span&gt;new&lt;/span&gt; &lt;span&gt;DateTime&lt;/span&gt;(2012, 6, 28), &lt;span&gt;TimeSpan&lt;/span&gt;.Zero);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;var&lt;/span&gt; duration = &lt;span&gt;TimeSpan&lt;/span&gt;.FromSeconds(5);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;var&lt;/span&gt; interval = &lt;span&gt;TimeSpan&lt;/span&gt;.FromSeconds(2);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;var&lt;/span&gt; alignment = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;DateTime&lt;/span&gt;(2012, 3, 15, 12, 0, 0, &lt;span&gt;DateTimeKind&lt;/span&gt;.Utc);       &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;var&lt;/span&gt; events = &lt;span&gt;this&lt;/span&gt;.Application.DefineEnumerable(() =&amp;gt; &lt;span&gt;new&lt;/span&gt;[]       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;EdgeEvent&lt;/span&gt;.CreateStart(start.AddSeconds(0), &lt;span&gt;&amp;quot;e0&amp;quot;&lt;/span&gt;),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;EdgeEvent&lt;/span&gt;.CreateStart(start.AddSeconds(1), &lt;span&gt;&amp;quot;e1&amp;quot;&lt;/span&gt;),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;EdgeEvent&lt;/span&gt;.CreateEnd(start.AddSeconds(1), start.AddSeconds(2), &lt;span&gt;&amp;quot;e1&amp;quot;&lt;/span&gt;),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;EdgeEvent&lt;/span&gt;.CreateStart(start.AddSeconds(3), &lt;span&gt;&amp;quot;e2&amp;quot;&lt;/span&gt;),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;EdgeEvent&lt;/span&gt;.CreateStart(start.AddSeconds(9), &lt;span&gt;&amp;quot;e3&amp;quot;&lt;/span&gt;),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;EdgeEvent&lt;/span&gt;.CreateEnd(start.AddSeconds(3), start.AddSeconds(10), &lt;span&gt;&amp;quot;e2&amp;quot;&lt;/span&gt;),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;EdgeEvent&lt;/span&gt;.CreateEnd(start.AddSeconds(9), start.AddSeconds(10), &lt;span&gt;&amp;quot;e3&amp;quot;&lt;/span&gt;),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }).ToStreamable(&lt;span&gt;AdvanceTimeSettings&lt;/span&gt;.IncreasingStartTime);       &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;var&lt;/span&gt; adjustedEvents = SnapToWindowIntervals(events, duration, interval, alignment);       &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;var&lt;/span&gt; query = &lt;span&gt;from&lt;/span&gt; win &lt;span&gt;in&lt;/span&gt; HoppingWindow2(events, duration, interval, alignment)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;select&lt;/span&gt; win.Count();       &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; DisplayResults(adjustedEvents, &lt;span&gt;&amp;quot;Adjusted Events&amp;quot;&lt;/span&gt;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; DisplayResults(query, &lt;span&gt;&amp;quot;Query&amp;quot;&lt;/span&gt;);       &lt;br /&gt;}&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;As you can see, instead of producing a massive number of windows for the open start edge &lt;i&gt;e&lt;/i&gt;&lt;sub&gt;0&lt;/sub&gt;, a single window is emitted from 12:00:15 AM until the end of time:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Adjusted Events &lt;/b&gt;&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="3"&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;&lt;b&gt;StartTime&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;&lt;b&gt;EndTime&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;&lt;b&gt;Payload&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:01 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;12/31/9999 11:59:59 PM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;e0&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:03 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:07 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;e1&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:05 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:15 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;e2&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:11 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:15 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;e3&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;&lt;b&gt;Query &lt;/b&gt;&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="3"&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;&lt;b&gt;StartTime&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;&lt;b&gt;EndTime&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;&lt;b&gt;Payload&lt;/b&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:01 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:03 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;1&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:03 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:05 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;2&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:05 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:07 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;3&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:07 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:11 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;2&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:11 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:15 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;3&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p&gt;6/28/2012 12:00:15 AM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;12/31/9999 11:59:59 PM&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p&gt;1&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;Regards,   &lt;br /&gt;The StreamInsight Team&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=44192" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/stream_insight/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://sqlblog.com/blogs/stream_insight/archive/tags/Time/default.aspx">Time</category></item><item><title>Changes to the LINQ-to-StreamInsight Dialect</title><link>http://sqlblog.com/blogs/stream_insight/archive/2012/06/28/changes-to-the-linq-to-streaminsight-dialect.aspx</link><pubDate>Thu, 28 Jun 2012 17:09:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:44137</guid><dc:creator>Roman Schindlauer</dc:creator><slash:comments>0</slash:comments><comments>http://sqlblog.com/blogs/stream_insight/comments/44137.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/stream_insight/commentrss.aspx?PostID=44137</wfw:commentRss><description>&lt;p&gt;In previous versions of StreamInsight (1.0 through 2.0), &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;CepStream&amp;lt;&amp;gt;&lt;/strong&gt;&lt;/span&gt; represents temporal streams of many varieties:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Streams with &amp;lsquo;open&amp;rsquo; inputs (e.g., those defined and composed over &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;CepStream&amp;lt;T&amp;gt;.Create(string streamName)&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Streams with &amp;lsquo;partially bound&amp;rsquo; inputs (e.g., those defined and composed over &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;CepStream&amp;lt;T&amp;gt;.Create(Type adapterFactory, &amp;hellip;))&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Streams with fully bound inputs (e.g., those defined and composed over To*Stream &amp;ndash; sequences or DQC)&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;The stream may be embedded (where &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;Server.Create&lt;/strong&gt;&lt;/span&gt; is used)&lt;/li&gt;
&lt;li&gt;The stream may be remote (where &lt;strong&gt;Server.Connect&lt;/strong&gt; is used)&lt;/li&gt;
&lt;/ol&gt;&lt;/ol&gt;
&lt;p&gt;When adding support for new programming primitives in StreamInsight 2.1, we faced a choice: Add a fourth variety (use &lt;strong&gt;CepStream&amp;lt;&amp;gt;&lt;/strong&gt; to represent streams that are bound the new programming model constructs), or introduce a separate type that represents temporal streams in the new user model. We opted for the latter. Introducing a new type has the effect of reducing the number of (confusing) runtime failures due to inappropriate uses of &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;CepStream&amp;lt;&amp;gt;&lt;/strong&gt;&lt;/span&gt; instances in the incorrect context. The new types are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;IStreamable&amp;lt;&amp;gt;&lt;/strong&gt;&lt;/span&gt;, which logically represents a temporal stream.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;IQStreamable&amp;lt;&amp;gt; : IStreamable&amp;lt;&amp;gt;&lt;/strong&gt;&lt;/span&gt;, which represents a &lt;i&gt;queryable&lt;/i&gt; temporal stream. Its relationship to &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;IStreamable&amp;lt;&amp;gt;&lt;/strong&gt;&lt;/span&gt; is analogous to the relationship of &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;IQueryable&amp;lt;&amp;gt;&lt;/strong&gt;&lt;/span&gt; to &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;IEnumerable&amp;lt;&amp;gt;&lt;/strong&gt;&lt;/span&gt;. The developer can compose temporal queries over remote stream sources using this type.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The syntax of temporal queries composed over &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;IQStreamable&amp;lt;&amp;gt;&lt;/strong&gt;&lt;/span&gt; is mostly consistent with the syntax of our existing &lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;CepStream&amp;lt;&amp;gt;&lt;/strong&gt;&lt;/span&gt;-based LINQ provider. However, we have taken the opportunity to refine certain aspects of the language surface. Differences are outlined below. Because 2.1 introduces new types to represent temporal queries, the changes outlined in this post do no impact existing StreamInsight applications using the existing types!&lt;/p&gt;
&lt;h1&gt;SelectMany&lt;/h1&gt;
&lt;p&gt;StreamInsight does not support the &lt;b&gt;SelectMany&lt;/b&gt; operator in its usual form (which is analogous to SQL&amp;rsquo;s &amp;ldquo;CROSS APPLY&amp;rdquo; operator):&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;R&amp;gt; SelectMany&amp;lt;T, R&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, Func&amp;lt;T, &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;R&amp;gt;&amp;gt; collectionSelector)&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It instead uses &lt;b&gt;SelectMany&lt;/b&gt; as a convenient syntactic representation of an inner join. The parameter to the selector function is thus unavailable. Because the parameter isn&amp;rsquo;t supported, its type in StreamInsight 1.0 &amp;ndash; 2.0 wasn&amp;rsquo;t carefully scrutinized. Unfortunately, the type chosen for the parameter is nonsensical to LINQ programmers:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CepStream&lt;/span&gt;&amp;lt;R&amp;gt; SelectMany&amp;lt;T, R&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CepStream&lt;/span&gt;&amp;lt;T&amp;gt; source, Expression&amp;lt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;CepStream&lt;/span&gt;&amp;lt;T&amp;gt;, &lt;span style="color:#2b91af;"&gt;CepStream&lt;/span&gt;&amp;lt;R&amp;gt;&amp;gt;&amp;gt; streamSelector)&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Using &lt;b&gt;Unit&lt;/b&gt; as the type for the parameter accurately reflects the StreamInsight&amp;rsquo;s capabilities:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IQStreamable&lt;/span&gt;&amp;lt;R&amp;gt; SelectMany&amp;lt;T, R&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IQStreamable&lt;/span&gt;&amp;lt;T&amp;gt; source, Expression&amp;lt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;Unit, &lt;span style="color:#2b91af;"&gt;IQStreamable&lt;/span&gt;&amp;lt;R&amp;gt;&amp;gt;&amp;gt; streamSelector)&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For queries that succeed &amp;ndash; that is, queries that do not reference the stream selector parameter &amp;ndash; there is no difference between the code written for the two overloads:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;from x &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs &lt;br /&gt;from y &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; ys &lt;br /&gt;select f(x, y)&lt;/div&gt;
&lt;/div&gt;
&lt;h1&gt;Top-K&lt;/h1&gt;
&lt;p&gt;The &lt;b&gt;Take&lt;/b&gt; operator used in StreamInsight causes confusion for LINQ programmers because it is applied to the (unbounded) stream rather than the (bounded) window, suggesting that the query as a whole will return &lt;i&gt;k &lt;/i&gt;rows:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;(&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs.SnapshotWindow() &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; x &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; win &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;orderby&lt;/span&gt; x.A &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; x.B).Take(k)&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The use of &lt;b&gt;SelectMany&lt;/b&gt; is also unfortunate in this context because it implies the availability of the window parameter within the remainder of the comprehension. The following compiles but fails at runtime:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;(&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs.SnapshotWindow() &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; x &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; win &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;orderby&lt;/span&gt; x.A &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; win).Take(k)&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;b&gt;Take &lt;/b&gt;operator in 2.1 is applied to the window rather than the stream:&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Before&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;After&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;(&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs.SnapshotWindow() &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; x &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; win &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;orderby&lt;/span&gt; x.A &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; x.B).Take(k)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;from win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs.SnapshotWindow() &lt;br /&gt;from b &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; x &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; win &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;orderby&lt;/span&gt; x.A &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; x.B).Take(k) &lt;br /&gt;select b&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;h1&gt;Multicast&lt;/h1&gt;
&lt;p&gt;We are introducing an explicit multicast operator in order to preserve expression identity, which is important given the semantics about moving code to and from StreamInsight. This also better matches existing LINQ dialects, such as Reactive. This pattern enables expressing multicasting in two ways:&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Implicit&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Explicit&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; ys = &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; x &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; x.A &amp;gt; 1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; x; &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; zs = &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; y1 &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; ys &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; y2 &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; ys.ShiftEventTime(_ =&amp;gt; &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(1)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; y1 + y2;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; ys = &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; x &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; x.A &amp;gt; 1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; x; &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; zs = ys.Multicast(ys1 =&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; y1 &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; ys1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; y2 &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; ys1.ShiftEventTime(_ =&amp;gt; &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(1)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; y1 + y2;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;p&gt;Notice the product translates an expression using implicit multicast into an expression using the explicit multicast operator. The user does not see this translation.&lt;/p&gt;
&lt;h1&gt;Default window policies&lt;/h1&gt;
&lt;p&gt;Only default window policies are supported in the new surface. Other policies can be simulated by using &lt;b&gt;AlterEventLifetime&lt;/b&gt;.&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Before&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;After&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;xs.SnapshotWindow( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;WindowInputPolicy&lt;/span&gt;.ClipToWindow, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SnapshotWindowInputPolicy.Clip)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;xs.SnapshotWindow()&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;xs.TumblingWindow( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(1), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;HoppingWindowOutputPolicy&lt;/span&gt;.PointAlignToWindowEnd)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;xs.TumblingWindow( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(1))&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;xs.TumblingWindow( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(1), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;HoppingWindowOutputPolicy&lt;/span&gt;.ClipToWindowEnd)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;i&gt;Not supported&lt;/i&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;h1&gt;LeftAntiJoin&lt;/h1&gt;
&lt;p&gt;Representation of LASJ as a correlated sub-query in the LINQ surface is problematic as the StreamInsight engine does not support correlated sub-queries (see discussion of SelectMany). The current syntax requires the introduction of an otherwise unsupported &amp;lsquo;&lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;IsEmpty()&lt;/strong&gt;&lt;/span&gt;&amp;rsquo; operator. As a result, the pattern is not discoverable and implies capabilities not present in the server. The direct representation of LASJ is used instead:&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Before&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;After&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;from x &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs &lt;br /&gt;where &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (from y &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; ys &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where x.A &amp;gt; y.B &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select y).IsEmpty() &lt;br /&gt;select x&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;xs.LeftAntiJoin(ys, (x, y) =&amp;gt; x.A &amp;gt; y.B)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;from x &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs &lt;br /&gt;where &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (from y &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; ys &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where x.A == y.B &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select y).IsEmpty() &lt;br /&gt;select x&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;xs.LeftAntiJoin(ys, x =&amp;gt; x.A, y =&amp;gt; y.B)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;h1&gt;ApplyWithUnion&lt;/h1&gt;
&lt;p&gt;The ApplyWithUnion methods have been deprecated since their signatures are redundant given the standard SelectMany overloads:&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Before&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;After&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;xs.GroupBy(x =&amp;gt; x.A).ApplyWithUnion(gs =&amp;gt; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; gs.SnapshotWindow() &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; win.Count())&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;xs.GroupBy(x =&amp;gt; x.A).SelectMany( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gs =&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; gs.SnapshotWindow() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; win.Count())&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;xs.GroupBy(x =&amp;gt; x.A).ApplyWithUnion(gs =&amp;gt; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; gs.SnapshotWindow() &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; win.Count(), r =&amp;gt; &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { r.Key, Count = r.Payload })&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;from x &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs &lt;br /&gt;group x by x.A into gs &lt;br /&gt;from win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; gs.SnapshotWindow() &lt;br /&gt;select &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { gs.Key, Count = win.Count() }&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;h1&gt;Alternate UDO syntax&lt;/h1&gt;
&lt;p&gt;The representation of UDOs in the StreamInsight LINQ dialect confuses cardinalities. Based on the semantics of user-defined operators in StreamInsight, one would expect to construct queries in the following form:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;from win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs.SnapshotWindow() &lt;br /&gt;from y &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; MyUdo(win) &lt;br /&gt;select y&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Instead, the UDO proxy method is referenced within a projection, and the (many) results returned by the user code are automatically flattened into a stream:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;from win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs.SnapshotWindow() &lt;br /&gt;select MyUdo(win)&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &amp;ldquo;many-or-one&amp;rdquo; confusion is exemplified by the following example that compiles but fails at runtime:&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;from win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs.SnapshotWindow() &lt;br /&gt;select MyUdo(win) + win.Count()&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The above query must fail because the UDO is in fact returning many values per window while the count aggregate is returning one.&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Original syntax&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;New alternate syntax&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;from win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs.SnapshotWindow() &lt;br /&gt;select win.UdoProxy(1)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;from win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs.SnapshotWindow() &lt;br /&gt;from y &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; win.UserDefinedOperator(() =&amp;gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Udo(1)) &lt;br /&gt;select y&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;-&lt;i&gt;or&lt;/i&gt;-&lt;/p&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; win &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; xs.SnapshotWindow() &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; y &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; win.UdoMacro(1) &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; y&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;p&gt;Notice that this formulation also sidesteps the dynamic type pitfalls of the existing &amp;ldquo;proxy method&amp;rdquo; approach to UDOs, in which the type of the UDO implementation (&lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;TInput, TOuput&lt;/strong&gt;&lt;/span&gt;) and the type of its constructor arguments (&lt;span style="font-family:Consolas;"&gt;&lt;strong&gt;TConfig&lt;/strong&gt;&lt;/span&gt;) need to align in a precise and non-obvious way with the argument and return types for the corresponding proxy method.&lt;/p&gt;
&lt;h1&gt;UDSO syntax&lt;/h1&gt;
&lt;p&gt;UDSO currently leverages the DataContractSerializer to clone initial state for logical instances of the user operator. Initial state will instead be described by an expression in the new LINQ surface.&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Before&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;After&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;xs.Scan(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Udso())&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;background-color:#ffffff;"&gt;xs.Scan(() =&amp;gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Udso())&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;h1&gt;Name changes&lt;/h1&gt;
&lt;p&gt;&lt;i&gt;ShiftEventTime =&amp;gt;&lt;/i&gt;&lt;i&gt; AlterEventStartTime&lt;/i&gt;&lt;b&gt;: &lt;/b&gt;The alter event lifetime overload taking a new start time value has been renamed.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;CountByStartTimeWindow =&amp;gt;&lt;/i&gt; &lt;i&gt;CountWindow&lt;/i&gt;&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=44137" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/stream_insight/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>New in V1.2: Default Window Output Policies</title><link>http://sqlblog.com/blogs/stream_insight/archive/2011/08/03/new-in-v1-2-default-window-output-policies.aspx</link><pubDate>Wed, 03 Aug 2011 14:46:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:37466</guid><dc:creator>Roman Schindlauer</dc:creator><slash:comments>0</slash:comments><comments>http://sqlblog.com/blogs/stream_insight/comments/37466.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/stream_insight/commentrss.aspx?PostID=37466</wfw:commentRss><description>&lt;p&gt;Who knows what window output policies in StreamInsight LINQ are? Anyone? Well, you have been using them whenever you have used a window. Output policies specify the timestamps of the result of the aggregation that happens on the window. Even if you didn&amp;rsquo;t really care about that, you had to specify the output policy parameter for the window. In V1.2 we are introducing&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Default policies so that you don&amp;rsquo;t have to specify them for every window, and&lt;/li&gt;
&lt;li&gt;Another output policy for Hopping/Tumbling windows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Importantly, there is no breaking change. Whatever you used in 1.1 is still working in 1.2, with the same behavior. For count- and snapshot-windows, the single existing output policy is becoming the default:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;"&gt;SnapshotWindow()&lt;/span&gt; is equivalent to &lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;SnapshotWindow(SnapshotWindowOutputPolicy.Clip)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;"&gt;CountByStartTimeWindow(num)&lt;/span&gt; is equivalent to &lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;CountByStartTimeWindow(num, CountWindowOutputPolicy.PointAlignToWindowEnd)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Set-based operations on top of snapshot windows always produce an event with the timestamps of the snapshot window itself, while operations on count windows produce a point event at the end of the window.&lt;/p&gt;
&lt;p&gt;The only existing output policy for hopping and tumbling windows in StreamInsight 1.1 was to produce the window size as result event lifetime. Now this turned out to be impractical in many cases, especially with overlapping hopping windows. Have a look at the following diagram:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlblog.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-27-92-metablogapi/4760.image_5F00_6047C36E.png"&gt;&lt;img style="background-image:none;padding-left:0px;padding-right:0px;display:inline;padding-top:0px;border-width:0px;" title="image" border="0" alt="image" src="http://sqlblog.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-27-92-metablogapi/7506.image_5F00_thumb_5F00_11D33104.png" width="640" height="278" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Just like the windows, also the result events overlap. When using this result in a subsequent operation, like a join with another stream, this easily leads to unexpected results. In many cases, only a single aggregation result at each point in time is needed (instead of four concurrently valid payloads in the diagram above). To this end, we have introduced another output policy for hopping (and tumbling) windows, which produces a point event at the end of the window:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlblog.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-27-92-metablogapi/2210.image_5F00_38A14744.png"&gt;&lt;img style="background-image:none;padding-left:0px;padding-right:0px;display:inline;padding-top:0px;border-width:0px;" title="image" border="0" alt="image" src="http://sqlblog.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-27-92-metablogapi/4846.image_5F00_thumb_5F00_37C8E15A.png" width="640" height="273" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This policy is now also the default for hopping windows:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;"&gt;HoppingWindow(size, hop)&lt;/span&gt; is equivalent to &lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;HoppingWindow(size, hop, HoppingWindowOutputPolicy.PointAlignToWindowEnd) &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Consolas;"&gt;TumblingWindow(size)&lt;/span&gt; is equivalent to &lt;br /&gt;&lt;span style="font-family:Consolas;"&gt;TumblingWindow(size, HoppingWindowOutputPolicy.PointAlignToWindowEnd)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This can now easily be converted into a continuous signal, for instance by using the ToSignal() macro that &lt;a href="http://sqlblog.com/b/streaminsight/archive/2011/07/28/new-in-v1-2-linq-macros.aspx"&gt;we discussed earlier&lt;/a&gt;. This signal has a payload at each point in time and hence is suitable to be joined with another stream, which is not necessarily synchronized in time. Typical example: join the result of a hopping aggregation with some reference stream:&lt;/p&gt;
&lt;div style="margin:0px;display:inline;float:none;padding:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ea77c731-814f-4d74-a46d-4fde28e0f3d1" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="background-color:#f5f5f5;max-height:500px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; result = &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; a &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; avg.ToSignal(e =&amp;gt; e.SourceId)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; r &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; reference.ToSignal(e =&amp;gt; e.SourceId)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { alarm = a.Value &amp;lt; r.Threshold };&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Dealing with point events instead of overlapping intervals in the context of windows helps avoiding unexpected side-effects and&amp;mdash;most of the times&amp;mdash;corresponds to the intended semantics.&lt;/p&gt;
&lt;p&gt;Regards, &lt;br /&gt;The StreamInsight Team&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=37466" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/stream_insight/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>New in V1.2: LINQ Macros</title><link>http://sqlblog.com/blogs/stream_insight/archive/2011/07/28/new-in-v1-2-linq-macros.aspx</link><pubDate>Thu, 28 Jul 2011 15:54:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:37383</guid><dc:creator>Roman Schindlauer</dc:creator><slash:comments>2</slash:comments><comments>http://sqlblog.com/blogs/stream_insight/comments/37383.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/stream_insight/commentrss.aspx?PostID=37383</wfw:commentRss><description>&lt;p&gt;StreamInsight LINQ is powerful and expressive. At the same time, the learning curve for a new user can be steep, because the query operators work on a semantically basic level. This means that complex use cases need to be build bottom up, composing the built-in operators to create higher-level query modules, etc. Many such modules are used over and over again, like the conversion of a stream to a signal, or the left-outer join. In StreamInsight V1.1 it was possible to some extent to write your own extension methods over CepStreams, but due to the mechanics and capabilities of the StreamInsight LINQ provider, for many such methods this was often difficult if not impossible. In V1.2 We overhauled the LINQ infrastructure significantly to make the definition of LINQ macros much easier. This enables you to express common building blocks as extension methods just once, and then use and re-use them to compose more sophisticated computations. The user of these macros doesn’t need to think in terms of AlterLifeTime or Left-Anti-Semi-Join anymore.&lt;/p&gt;
&lt;p&gt;Let’s look at the first example, creating an event stream into a series of continuous, non-overlapping interval events. This is a typical preparation to implement a correlation (join) of two streams. In StreamInsight we can easily do this by extending the lifetime of each event and then clipping it right at the beginning of the next event (this is also described in the section “Point to Signal Conversion” &lt;a href="http://msdn.microsoft.com/en-us/library/ee362414.aspx#clipeventduration" target="_blank"&gt;on our MSDN pages&lt;/a&gt;):&lt;/p&gt;
&lt;div style="margin:0px;padding:0px;float:none;display:inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f7ddfcb8-54b3-4a23-98d4-fbafa78cf4ed" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;var&lt;/span&gt; result = source&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.AlterEventDuration(e =&amp;gt; &lt;span&gt;TimeSpan&lt;/span&gt;.MaxValue)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.ClipEventDuration(source, (s, e) =&amp;gt; &lt;span&gt;true&lt;/span&gt;);&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Being a typical query pattern, I can easily convert this into an extension method:&lt;/p&gt;
&lt;div style="margin:0px;padding:0px;float:none;display:inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:aeea575c-c77c-4635-9837-ceb400cd50ef" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;CepStream&lt;/span&gt;&amp;lt;T&amp;gt; ToSignal&amp;lt;T&amp;gt;(&lt;span&gt;this&lt;/span&gt; &lt;span&gt;CepStream&lt;/span&gt;&amp;lt;T&amp;gt; inputstream)&lt;br&gt; {&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;return&lt;/span&gt; inputstream&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.AlterEventDuration(e =&amp;gt; &lt;span&gt;TimeSpan&lt;/span&gt;.MaxValue)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.ClipEventDuration(inputstream, (e1, e2) =&amp;gt; &lt;span&gt;true&lt;/span&gt;);&lt;br&gt; }&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And use it as follows:&lt;/p&gt;
&lt;div style="margin:0px;padding:0px;float:none;display:inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7e1681f7-e612-4aba-8e12-e9d7250da273" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;var&lt;/span&gt; result = source.ToSignal();&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now assume that my input is a multiplexed stream, containing events from different sources, identified by some payload field. Obviously, I want to convert each source into a separate signal, so the matching condition in ClipEventDuration() needs to change:&lt;/p&gt;
&lt;div style="margin:0px;padding:0px;float:none;display:inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c08f6c15-bf79-45cf-8be7-d6396fc2b6ae" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;var&lt;/span&gt; result = source&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.AlterEventDuration(e =&amp;gt; &lt;span&gt;TimeSpan&lt;/span&gt;.MaxValue)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.ClipEventDuration(source, (s, e) =&amp;gt; s.Id == e.Id);&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ideally, I have an according extension method that allows me to pass the matching expression as a parameter:&lt;/p&gt;
&lt;div style="margin:0px;padding:0px;float:none;display:inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9d8e325b-42bc-45e3-a15d-e322daff592a" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;var&lt;/span&gt; result = source.ToSignal((s, e) =&amp;gt; s.Id == e.Id);&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is how I can write such an extension method:&lt;/p&gt;
&lt;div style="margin:0px;padding:0px;float:none;display:inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:45b7db66-0009-4c54-9387-d85cf3e45afc" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;CepStream&lt;/span&gt;&amp;lt;T&amp;gt; ToSignal&amp;lt;T&amp;gt;(&lt;span&gt;this&lt;/span&gt; &lt;span&gt;CepStream&lt;/span&gt;&amp;lt;T&amp;gt; inputstream, &lt;span&gt;Expression&lt;/span&gt;&amp;lt;&lt;span&gt;Func&lt;/span&gt;&amp;lt;T, T, &lt;span&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; matchExpression)&lt;br&gt; {&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;return&lt;/span&gt; inputstream&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.AlterEventDuration(e =&amp;gt; &lt;span&gt;TimeSpan&lt;/span&gt;.MaxValue)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.ClipEventDuration(inputstream, (e1, e2) =&amp;gt; matchExpression.Compile()(e1, e2));&lt;br&gt; }&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The ability to compile expressions into delegates is new in V1.2. It also allows to create the equality predicate inside the macro:&lt;/p&gt;
&lt;div style="margin:0px;padding:0px;float:none;display:inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2cf0d3f5-eea2-4537-a4be-f86cac06cbd8" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;CepStream&lt;/span&gt;&amp;lt;T&amp;gt; ToSignal&amp;lt;T, K&amp;gt;(&lt;span&gt;this&lt;/span&gt; &lt;span&gt;CepStream&lt;/span&gt;&amp;lt;T&amp;gt; inputstream, &lt;span&gt;Expression&lt;/span&gt;&amp;lt;&lt;span&gt;Func&lt;/span&gt;&amp;lt;T, K&amp;gt;&amp;gt; keySelector)&lt;br&gt; {&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;return&lt;/span&gt; inputstream&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.AlterEventDuration(e =&amp;gt; &lt;span&gt;TimeSpan&lt;/span&gt;.MaxValue)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.ClipEventDuration(inputstream, (e1, e2) =&amp;gt; (keySelector.Compile()(e1)).Equals(keySelector.Compile()(e2)));&lt;br&gt; }&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now I can use the macro by just referring to the field that distinguishes my substreams:&lt;/p&gt;
&lt;div style="margin:0px;padding:0px;float:none;display:inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fbd7f5fe-e531-4811-a13f-8bf32504a068" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;var&lt;/span&gt; result = source.ToSignal(s =&amp;gt; s.Id);&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Our favorite example is the left outer join, which is not a native StreamInsight operator. In this operation, we want to join left and right streams, but also keep every event on the left side that does not join with the right side. We can model this as a plain inner join, a left-anti-semi-join (everything left without right), and the union thereof. Since Colin has already blogged about this pattern, I’ll not repeat it here and just &lt;a href="http://blogs.msdn.com/b/meek/archive/2011/07/25/linq-macros-in-streaminsight-1-2-left-outer-join.aspx"&gt;refer to his posting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is another really nice one: De-duplication. The following extension method helps you to get rid of duplicate events (same time, same payload):&lt;/p&gt;
&lt;div style="margin:0px;padding:0px;float:none;display:inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fbdb6200-7d77-41d9-babe-6fc023e6b99c" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;CepStream&lt;/span&gt;&amp;lt;T&amp;gt; Distinct&amp;lt;T&amp;gt;(&lt;span&gt;this&lt;/span&gt; &lt;span&gt;CepStream&lt;/span&gt;&amp;lt;T&amp;gt; source)&lt;br&gt; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;return&lt;/span&gt; &lt;span&gt;from&lt;/span&gt; x &lt;span&gt;in&lt;/span&gt; source&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;group&lt;/span&gt; x &lt;span&gt;by&lt;/span&gt; x &lt;span&gt;into&lt;/span&gt; g&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;from&lt;/span&gt; win &lt;span&gt;in&lt;/span&gt; g.SnapshotWindow()&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;select&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; { g.Key, IgnoreMe = win.Count() } &lt;span&gt;into&lt;/span&gt; x&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;select&lt;/span&gt; x.Key;&lt;br&gt; }&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The usage now becomes very simple:&lt;/p&gt;
&lt;div style="margin:0px;padding:0px;float:none;display:inline;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ad7e953a-6f62-478c-b2c7-b5f9a953a5d7" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="padding:2px 5px;overflow:auto;max-height:500px;"&gt;&lt;span&gt;var&lt;/span&gt; result = input.Distinct();&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Macros make it possible to build a domain-specific set of subqueries on top of the StreamInsight LINQ language, so that defining computations and analytics becomes more accessible and straightforward. The new &lt;a href="http://blogs.msdn.com/b/streaminsight/archive/2011/07/19/updated-linqpad-driver-and-samples.aspx"&gt;V1.2 LINQPad samples&lt;/a&gt; include several other useful macros. Note that LINQPad does not allow true extension methods in the same file – they would have to be compiled and the resulting DLL referenced. This is why in our LINQPad samples the macros are defined as regular old methods.&lt;/p&gt;
&lt;p&gt;Regards, &lt;br&gt;The StreamInsight Team&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=37383" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/stream_insight/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>New in V1.2: Primitive Event Types</title><link>http://sqlblog.com/blogs/stream_insight/archive/2011/07/25/new-in-v1-2-atomic-event-types.aspx</link><pubDate>Mon, 25 Jul 2011 23:34:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:37295</guid><dc:creator>Roman Schindlauer</dc:creator><slash:comments>0</slash:comments><comments>http://sqlblog.com/blogs/stream_insight/comments/37295.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/stream_insight/commentrss.aspx?PostID=37295</wfw:commentRss><description>&lt;p&gt;In a &lt;a href="http://sqlblog.com/b/streaminsight/archive/2011/07/21/new-in-v1-2-nested-types.aspx"&gt;previous posting&lt;/a&gt;, we introduced nested types as one of the new features in StreamInsight V1.2. The second improvement in the type system represents the other end of the complexity spectrum, namely the ability to use "primitive" event types, without any struct or class. Remember the LINQ statement to compute the distances between two vehicles in that posting:&lt;/p&gt;
&lt;div style="margin:0px;display:inline;float:none;padding:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4fcc851e-0bf6-446a-8eb8-b776cae0671a" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="background-color:#f5f5f5;max-height:500px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="color:#000000;"&gt; distance = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt;&lt;span style="color:#000000;"&gt; a &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; vehicleA&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt;&lt;span style="color:#000000;"&gt; b &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; vehicleB&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;distance = Math.Sqrt(&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;Math.Pow(a.Loc.X &amp;ndash; b.Loc.X, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;) +&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;Math.Pow(a.Loc.Y &amp;ndash; b.Loc.Y, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;))&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Wouldn&amp;rsquo;t it be nice to be able to write this as:&lt;/p&gt;
&lt;div style="margin:0px;display:inline;float:none;padding:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ef1696c7-4a31-4093-936d-5b7218905f33" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="background-color:#f5f5f5;max-height:500px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="color:#000000;"&gt; distance = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt;&lt;span style="color:#000000;"&gt; a &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; vehicleA&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt;&lt;span style="color:#000000;"&gt; b &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; vehicleB&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; Math.Sqrt(&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;Math.Pow(a.Loc.X &amp;ndash; b.Loc.X, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;) +&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;Math.Pow(a.Loc.Y &amp;ndash; b.Loc.Y, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;));&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes, it would &amp;ndash; and in V1.2 you can! The type of this is now simply a &lt;span style="font-family:Consolas;"&gt;CepStream&amp;lt;double&amp;gt;,&lt;/span&gt; and you can use it like this:&lt;/p&gt;
&lt;div style="margin:0px;display:inline;float:none;padding:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5f0e3f1c-1606-4fd0-bca4-cfd607946f5b" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="background-color:#f5f5f5;max-height:500px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="color:#000000;"&gt; result = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt;&lt;span style="color:#000000;"&gt; d &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; distance&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;where&lt;/span&gt;&lt;span style="color:#000000;"&gt; d &amp;gt; &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;9&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; d;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Beauty! But wait, there is more: in V1.2, we also enabled the LINQ Let clause. We can consolidate the above statements nicely into a single one:&lt;/p&gt;
&lt;div style="margin:0px;display:inline;float:none;padding:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6a76060b-fa0e-453f-a63a-5c1d9bf25941" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="background-color:#f5f5f5;max-height:500px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="color:#000000;"&gt; withLet = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt;&lt;span style="color:#000000;"&gt; r &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; vehicleA&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt;&lt;span style="color:#000000;"&gt; l &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; vehicleB&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;let&lt;/span&gt;&lt;span style="color:#000000;"&gt; d = Math.Sqrt(&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;Math.Pow(r.Loc.X - l.Loc.X, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;) +&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Math.Pow(r.Loc.Y - l.Loc.Y, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;))&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;where&lt;/span&gt;&lt;span style="color:#000000;"&gt; d &amp;gt; &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;9&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; d;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can find this example attached to run in LINQPad.&lt;/p&gt;
&lt;p&gt;See how we can create a very concise StreamInsight sample over a stream of int in LINQPad:&lt;/p&gt;
&lt;div style="margin:0px;display:inline;float:none;padding:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4da20b01-a14e-4f3b-85b6-e3e6b0aa40ec" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="background-color:#f5f5f5;max-height:500px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="color:#000000;"&gt; source = Enumerable.Range(&lt;/span&gt;&lt;span style="color:#c81efa;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;100&lt;/span&gt;&lt;span style="color:#000000;"&gt;).ToPointStream(&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;Application,&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;ev =&amp;gt; PointEvent.CreateInsert(&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;DateTimeOffset.Now.AddMinutes(ev), ev),&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;AdvanceTimeSettings.StrictlyIncreasingStartTime);&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="color:#000000;"&gt; result = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt;&lt;span style="color:#000000;"&gt; win &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; source.TumblingWindow(TimeSpan.FromMinutes(&lt;/span&gt;&lt;span style="color:#c81efa;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;))&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; win.Avg(e =&amp;gt; e);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="color:#000000;"&gt;result.ToPointEnumerable().Where(e =&amp;gt; e.EventKind == EventKind.Insert).Dump();&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Alright, this query doesn&amp;rsquo;t really make a lot of sense, but you get the idea. This sample is also included in the set of new LINQPad samples &amp;ndash; just &lt;a href="http://sqlblog.com/b/streaminsight/archive/2011/07/19/updated-linqpad-driver-and-samples.aspx"&gt;update your LINQPad&lt;/a&gt; driver to get them.&lt;/p&gt;
&lt;p&gt;Regards, &lt;br /&gt;The StreamInsight Team&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=37295" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/stream_insight/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>New in V1.2: Nested Event Types</title><link>http://sqlblog.com/blogs/stream_insight/archive/2011/07/21/new-in-v1-2-nested-types.aspx</link><pubDate>Thu, 21 Jul 2011 16:50:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:37224</guid><dc:creator>Roman Schindlauer</dc:creator><slash:comments>0</slash:comments><comments>http://sqlblog.com/blogs/stream_insight/comments/37224.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/stream_insight/commentrss.aspx?PostID=37224</wfw:commentRss><description>&lt;p&gt;&lt;span&gt;One of the focus areas for us in V1.2 was the LINQ surface of StreamInsight. We have straightened out many of the kinks people complained about in previous versions and have added new features. Too many improvements for a single blog post, so today we&amp;rsquo;ll start with new features in the event type system.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;One of the big limitations in StreamInsight so far was the requirement to express event types as a &amp;ldquo;flat&amp;rdquo; list of fields. What we are introducing with our current version is the ability to use nested structures as event types. You can now use fields that are instances of another class or struct, and you can define such nestings with arbitrary depth. Let&amp;rsquo;s look at an example:&lt;/span&gt;&lt;/p&gt;
&lt;div style="margin:0px;display:inline;float:none;padding:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:bf621962-cf47-49a5-9a7f-cbe2c06268c3" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="background-color:#f5f5f5;max-height:500px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Location&lt;/span&gt;&lt;br /&gt; &lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; X { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; Y { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }&lt;/span&gt;&lt;br /&gt; &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Vehicle&lt;/span&gt;&lt;br /&gt; &lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Id { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Location Loc { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }&lt;/span&gt;&lt;br /&gt; &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;Here, we are planning to use &lt;span style="font-family:Consolas;"&gt;Vehicle&lt;/span&gt; as our event type, with a field of type &lt;span style="font-family:Consolas;"&gt;Location&lt;/span&gt;. We can create our payloads in the input adapter (or as a .NET sequence item) as expected:&lt;/span&gt;&lt;/p&gt;
&lt;div style="margin:0px;display:inline;float:none;padding:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6c94391a-5f9e-4f5e-b652-5a5fca6f3208" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="background-color:#f5f5f5;max-height:500px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Vehicle { Id = &lt;/span&gt;&lt;span style="color:#dc1414;"&gt;"A"&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Loc = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Location() { X = &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Y = &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt; } }&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;Within LINQ query statements, you can refer to these nested fields:&lt;/span&gt;&lt;/p&gt;
&lt;div style="margin:0px;display:inline;float:none;padding:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f10acab0-628f-436a-903d-55310033a9fe" class="wlWriterEditableSmartContent"&gt;
&lt;div class="le-pavsc-container"&gt;
&lt;div style="background-color:#f5f5f5;max-height:500px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="color:#000000;"&gt; distance = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt;&lt;span style="color:#000000;"&gt; a &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; vehicleA&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt;&lt;span style="color:#000000;"&gt; b &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; vehicleB&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;distance = Math.Sqrt(&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;Math.Pow(a.Loc.X &amp;ndash; b.Loc.X, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;) +&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;Math.Pow(a.Loc.Y &amp;ndash; b.Loc.Y, &lt;/span&gt;&lt;span style="color:#c81efa;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;))&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;(We are assuming that these two input streams actually contain overlapping events, otherwise the join wouldn&amp;rsquo;t produce anything.)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Now we&amp;rsquo;d like to clarify a few things here:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;The atomic fields in the structures still need to be of one of the StreamInsight-supported types. Collections as field types are not supported yet. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Nested structures always need to contain actual instances, they cannot be null. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;How do you deal with nested fields in untyped adapters? Well, no change here. You still use the GetField/SetField methods of the event, passing the ordinal of the desired field. You get the ordinal for a field from its name through the CepEventType dictionary. The name for a nested field is for example &lt;span style="font-family:Consolas;"&gt;Loc.X&lt;/span&gt;, just like in a programmatic reference.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Attached is a LINQPad sample that demonstrates nested types &amp;ndash; you will also find it as part of the samples that come with the plugin. The sample also uses a macro for a common streaming design pattern, more about that in a later post. Don&amp;rsquo;t forget to &lt;a href="http://sqlblog.com/b/streaminsight/archive/2011/07/19/updated-linqpad-driver-and-samples.aspx"&gt;update the plugin&lt;/a&gt;, btw!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Regards, &lt;br /&gt;The StreamInsight Team&lt;/span&gt;&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=37224" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/stream_insight/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Rolling Out 101 Samples</title><link>http://sqlblog.com/blogs/stream_insight/archive/2011/05/10/rolling-out-101-samples.aspx</link><pubDate>Tue, 10 May 2011 22:33:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:35554</guid><dc:creator>Roman Schindlauer</dc:creator><slash:comments>0</slash:comments><comments>http://sqlblog.com/blogs/stream_insight/comments/35554.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/stream_insight/commentrss.aspx?PostID=35554</wfw:commentRss><description>&lt;P&gt;StreamInsight’s LINQ query and analytics language is powerful and versatile. To ease users and developers over the inevitable initial learning curve, we know that high-quality documentation and a variety of examples are absolutely crucial. While we are trying to improve the former with every new release, we have also maintained a set of samples of the &lt;A href="http://streaminsight.codeplex.com/"&gt;StreamInsight CodePlex site&lt;/A&gt;. Since the release of our &lt;A href="http://blogs.msdn.com/b/streaminsight/archive/2010/11/24/streaminsight-linqpad-driver.aspx"&gt;plugin for the popular LINQPad&lt;/A&gt;, publishing query samples and snippets has become much easier and straightforward. We recently started collecting typical streaming computation patterns and expressing them in StreamInsight LINQ as basic building blocks – sort of the “101 StreamInsight Query Patterns”. Today we release the first set of these patterns, downloadable directly through the LINQPad UI:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-27-92-metablogapi/5516.image_5F00_72F52AB4.png"&gt;&lt;IMG style="BACKGROUND-IMAGE:none;BORDER-RIGHT-WIDTH:0px;PADDING-LEFT:0px;WIDTH:312px;PADDING-RIGHT:0px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;HEIGHT:197px;BORDER-LEFT-WIDTH:0px;PADDING-TOP:0px;" title=image alt=image src="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-27-92-metablogapi/5516.image_5F00_72F52AB4.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Clicking on “Download more samples” will bring up a dialog window. Scrolling down you’ll see the StreamInsight sample section with a link to download:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-27-92-metablogapi/6661.image_5F00_7B958340.png"&gt;&lt;IMG style="BACKGROUND-IMAGE:none;BORDER-RIGHT-WIDTH:0px;PADDING-LEFT:0px;WIDTH:646px;PADDING-RIGHT:0px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;HEIGHT:566px;BORDER-LEFT-WIDTH:0px;PADDING-TOP:0px;" title=image border=0 alt=image src="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-27-92-metablogapi/6661.image_5F00_7B958340.png" width=646 height=566&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This download will pick up the new samples, regardless of whether you already had a previous version or not.&lt;/P&gt;
&lt;P&gt;Regards, &lt;BR&gt;The StreamInsight Team&lt;/P&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=35554" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/stream_insight/archive/tags/samples/default.aspx">samples</category><category domain="http://sqlblog.com/blogs/stream_insight/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>StreamInsight LINQPad Driver</title><link>http://sqlblog.com/blogs/stream_insight/archive/2010/11/24/streaminsight-linqpad-driver.aspx</link><pubDate>Thu, 25 Nov 2010 01:03:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:30973</guid><dc:creator>Roman Schindlauer</dc:creator><slash:comments>2</slash:comments><comments>http://sqlblog.com/blogs/stream_insight/comments/30973.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/stream_insight/commentrss.aspx?PostID=30973</wfw:commentRss><description>&lt;div&gt;
&lt;p&gt;Joseph Albahari's &lt;a href="http://linqpad.net/"&gt;LINQPad&lt;/a&gt;&amp;nbsp;has become an indispensable tool for many of us on the StreamInsight team. It allows you to quickly design, test and visualize results for LINQ queries. We've now developed a dedicated LINQPad driver for StreamInsight with Joe's help that you can use to quickly explore temporal data and StreamInsight's temporal LINQ dialect!&lt;/p&gt;
&lt;p&gt;To get started, install &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992"&gt;.NET 4.0&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.linqpadupdates.net/LINQPad4Setup.exe"&gt;LINQPad 4.0&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a2d0e7aa-2a42-4b02-855b-78804110026a"&gt;StreamInsight 1.1&lt;/a&gt;. You'll need the full version of StreamInsight (StreamInsight.msi, not StreamInsightClient.msi) and you'll need to create a server instance during setup. This version of the LINQPad driver evaluates stream queries locally with an embedded StreamInsight &lt;a href="http://blogs.msdn.com/b/meek/archive/2010/10/26/using-and-discovering-streaminsight-instances.aspx"&gt;instance&lt;/a&gt;. I strongly recommend activating auto-completion in LINQPad -- requires the purchase of an activation code but well worth the price!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;After launching LINQPad, you'll first need to register the StreamInsight driver:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click "Add connection"&lt;/li&gt;
&lt;li&gt;Click "View more drivers..."&lt;/li&gt;
&lt;li&gt;Click "Download &amp;amp; Enable Driver" under the "Microsoft StreamInsight Driver" heading&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create a connection to the embedded StreamInsight instance, click "Add connection" and select the "Microsoft StreamInsight" context option. For now, just select the "Default Context" option from the "Context Kind" list. Drag the newly created "StreamInsight: Default Context" connection to the query pane or select it from the "Database" list to write a query against a blank-slate context with no built-in streams. You can introduce a data source inline as in the following example that uses the "C# Statement(s)" language option in LINQPad:&lt;/p&gt;
&lt;pre class="code"&gt;var source = new[]&lt;br&gt;{&lt;br&gt;    PointEvent.CreateInsert(new DateTime(2011, 1, 1, 12, 0, 0),&lt;br&gt;                            new { ID = "Hello" }),&lt;br&gt;    PointEvent.CreateInsert(new DateTime(2011, 1, 1, 13, 0, 0),&lt;br&gt;                            new { ID = "World" }),&lt;br&gt;};&lt;br&gt;&lt;br&gt;var input = source.ToStream(Application,&lt;br&gt;                            AdvanceTimeSettings.IncreasingStartTime);&lt;br&gt;&lt;br&gt;input.Dump();&lt;/pre&gt;
&lt;p&gt;Hit F5 or click "Play" to run!&lt;/p&gt;
&lt;p&gt;In addition to the default context, "Performance Counter" and "Hitchhiker'sGuide" contexts are available. The former context allows you to author queries against live performance counter streams. The latter exposes the data explored in &lt;a href="http://blogs.msdn.com/b/streaminsight/archive/2010/06/08/hitchhiker-s-guide-to-streaminsight-queries.aspx"&gt;A Hitchhiker's Guide to StreamInsight Queries&lt;/a&gt;. In addition, we have created a small set of samples -- this set should expand over the next few months! -- that rely on built-in contexts described above. You can add these samples by clicking "Download more samples..." under the "Samples" tab in LINQPad and choosing “Microsoft StreamInsight Samples”.&amp;nbsp;The samples cover:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Queries from the Hitchhiker's Guide&lt;/li&gt;
&lt;li&gt;Some simple performance counter queries to get you started&lt;/li&gt;
&lt;li&gt;An introduction example using the default context that illustrates various options for displaying StreamInsight query results&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In a future blog post, we'll describe how you can author custom StreamInsight query contexts. As always, let us know if you have any questions or comments!&lt;/p&gt;
&lt;p&gt;Regards,&lt;br&gt;The StreamInsight Team&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=30973" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/stream_insight/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Windows in StreamInsight: The Basics</title><link>http://sqlblog.com/blogs/stream_insight/archive/2010/11/23/windows-in-streaminsight-the-basics.aspx</link><pubDate>Tue, 23 Nov 2010 17:05:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:30901</guid><dc:creator>Roman Schindlauer</dc:creator><slash:comments>0</slash:comments><comments>http://sqlblog.com/blogs/stream_insight/comments/30901.aspx</comments><wfw:commentRss>http://sqlblog.com/blogs/stream_insight/commentrss.aspx?PostID=30901</wfw:commentRss><description>&lt;p&gt;If you start learning how to write StreamInsight queries, most likely one of the first concepts you come across are windows. In this article, we&amp;rsquo;d like to shed some light on the usage of windows, hoping to provide a better understanding for the benefits as well as constraints of using windows. And I will spare you any funny or half-funny puns regarding Microsoft Windows. On a side note, isn&amp;rsquo;t it striking how people always use the phrase &amp;ldquo;no pun intended&amp;rdquo; very intentionally?&lt;/p&gt;
&lt;p&gt;In the event processing world, windows are used to define sets, which are then input to some set-based operation. Such operations are either&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aggregations, like sum, count, min, max, or a user-defined aggregate, computing a single result for the input set, or &lt;/li&gt;
&lt;li&gt;window-based operators, which can return more than one result event for an input set, like TopK or a user-defined operator. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Think of a StreamInsight window as a means to chop up the timeline into finite pieces, each including a number of events. The length of the window can be a fixed time span (hopping &amp;amp; tumbling windows), or determined by the events themselves (count &amp;amp; snapshot windows). Here is an example of a &amp;ldquo;tumbling window&amp;rdquo;, with the aggregate &amp;ldquo;sum&amp;rdquo; applied to one of the payload fields:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlblog.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-92-metablogapi/6862.BlogFigures_5F00_7FA0696B.png"&gt;&lt;img src="http://sqlblog.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-92-metablogapi/2555.BlogFigures_5F00_thumb_5F00_7E5BD08C.png" alt="BlogFigures" title="BlogFigures" style="background-image:none;border-right-width:0px;margin:;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" border="0" width="622" height="215" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It is important to understand that the window and the set-based operations always need to be used together. The window with the set-based operation can be regarded as a single building block in a StreamInsight query. This is also reflected in the way these constructs are written in LINQ:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;&lt;span style="color:black;"&gt;result = &lt;/span&gt;&lt;span style="color:blue;"&gt;from &lt;/span&gt;&lt;span style="color:black;"&gt;window &lt;/span&gt;&lt;span style="color:blue;"&gt;in &lt;/span&gt;&lt;span style="color:black;"&gt;input&lt;br /&gt;                 .TumblingWindow(TimeSpan.FromMinutes(&lt;/span&gt;&lt;span style="color:#c81efa;"&gt;5&lt;/span&gt;&lt;span style="color:black;"&gt;),&lt;br /&gt;                                 HoppingWindowOutputPolicy.ClipToWindowEnd)&lt;br /&gt;             &lt;/span&gt;&lt;span style="color:blue;"&gt;select new &lt;/span&gt;&lt;span style="color:black;"&gt;{ sum = window.Sum(e =&amp;gt; e.Value) };&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;This component &amp;ndash; the window together with the set-based operation on top of it &amp;ndash; receives a CepStream and produces a CepStream. The window extension method returns the type CepWindowStream, but there is nothing else to do with this type than to apply the set-based operation. We will discuss the specific window types in another posting.&lt;/p&gt;
&lt;p&gt;People sometimes ask about different ways to &amp;ldquo;access&amp;rdquo; this window, since it must be &amp;ldquo;just a set of events in memory&amp;rdquo;, which they want to process somehow. Yes, it is a set of events in StreamInsight-controlled memory, and it actually can be accessed programmatically: in the form of user-defined aggregates (UDAs) or operators (UDOs). These extensibility interfaces let you write C# code against the events contained in a window and produce a single scalar aggregation result (in the case of a UDA) or one or more entire events (with a UDO). Both are implemented as subclasses of types provided by the StreamInsight API. The nice thing about these interfaces is that, even though they introduce imperative code into the StreamInsight event processing flow, the APIs encourage a declarative model: I receive a set of events (the window) and I produce some output for it. I don&amp;rsquo;t have to worry about when or in what order the UDA or UDO will be called at runtime. And since I receive the set of events as an IEnumerable in this interface, I can write good old LINQ to Objects against them!&lt;/p&gt;
&lt;p&gt;Although it might be tempting for developers who haven&amp;rsquo;t become really comfortable with high-level, declarative programming paradigms such as LINQ to take the &amp;ldquo;back door&amp;rdquo; into a UDA/UDO, I would advise to first try expressing a query through built-in StreamInsight operators alone and harness the power of the StreamInsight runtime.&lt;/p&gt;
&lt;p&gt;Regards, &lt;br /&gt;Roman&lt;/p&gt;&lt;img src="http://sqlblog.com/aggbug.aspx?PostID=30901" width="1" height="1"&gt;</description><category domain="http://sqlblog.com/blogs/stream_insight/archive/tags/LINQ/default.aspx">LINQ</category></item></channel></rss>