THE SQL Server Blog Spot on the Web

Welcome to - The SQL Server blog spot on the web Sign in | |
in Search

StreamInsight Team

New in V1.2: Nested Event Types

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’ll start with new features in the event type system.

One of the big limitations in StreamInsight so far was the requirement to express event types as a “flat” 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’s look at an example:

public class Location
   public double X { get; set; }
   public double Y { get; set; }

public class Vehicle
   public string Id { get; set; }
   public Location Loc { get; set; }

Here, we are planning to use Vehicle as our event type, with a field of type Location. We can create our payloads in the input adapter (or as a .NET sequence item) as expected:

new Vehicle { Id = "A", Loc = new Location() { X = 2, Y = 3 } }

Within LINQ query statements, you can refer to these nested fields:

var distance = from a in vehicleA
              from b in vehicleB
              select new
                  distance = Math.Sqrt(
                      Math.Pow(a.Loc.X – b.Loc.X, 2) +
                      Math.Pow(a.Loc.Y – b.Loc.Y, 2))

(We are assuming that these two input streams actually contain overlapping events, otherwise the join wouldn’t produce anything.)

Now we’d like to clarify a few things here:

  • 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.
  • Nested structures always need to contain actual instances, they cannot be null.

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 Loc.X, just like in a programmatic reference.

Attached is a LINQPad sample that demonstrates nested types – 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’t forget to update the plugin, btw!

The StreamInsight Team

Published Thursday, July 21, 2011 10:50 AM by Roman Schindlauer
Filed under:

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS


No Comments

Leave a Comment


About Roman Schindlauer

Program Manager in the StreamInsight team.
Privacy Statement