Projection

 

The examples in this topic show how to perform specific computations over individual events as part of their transformation to output events. Such computations are performed by using projection. A projection operates on an IQStreamable<T1> temporal stream and yields a new IQStreamable<T2> stream where IQStreamable<T> is a stream of events with payload of type T. Projections always occur when using the select clause in LINQ. They can create a new type implicitly or refer to a defined event type explicitly, as shown below.

Note


A projection also can operate on a CEPStream<T> stream which is produced and consumed by input and output adapters. For more information on developing with input and output adapters, see Input and Output Adapters (Legacy Model). The discussion in this topic applies to both types of streams.

Examples

In the following example, every event in the stream TestEventStream will be projected into a new event, according to the project expressions defined in the query. In the query, the fields i and f are multiplied by 2. These values are projected into the new events. The new event type here is an anonymous type, implicitly defined through the field assignments created by the project expression.

// Assuming the following input event type:  
public class MyPayload  
{  
    public int i;  
    public float f;  
}  
  
var queryProject = from c in TestEventStream  
                   select new {i = c.i * 2, f = c.f * 2};  

In the following example, every event in the input stream of type MeterReading will be projected into a new event in the stream realValueStream, using the explicitly declared event type MeterWattage. The consumption field for each event in the InputStream stream is converted to a double CLR type and divided by 10 and then assigned to the wattage field of the type MeterWattage.

public class MeterReading  
{  
    public int consumption;  
}  
  
public class MeterWattage  
{  
    public double wattage;  
}  
  
[…]  
  
var realValueStream = from e in InputStream  
                      select new MeterWattage {wattage = (double)e.consumption / 10};  

The project expression cannot use a type's constructor. It must always specify the field assignment to the new (implicit or explicit) type through a MemberInit expression (the assignment of event fields within curly braces). However, this syntax is not required when projecting a single field of a primitive type, as shown in the following example:

public class MeterReading  
{  
    public int consumption;  
}  
  
public class MeterWattage  
{  
    public double wattage;  
}  
  
[…]  
  
var realValueStream = from e in InputStream  
                      select (double)e.consumption / 10;  

Note that this projection implicitly produces a stream of primitive type double.

When an explicit type is used, each of its fields or properties must be initialized in the project expression.

See Also

NIB StreamInsight Server Concepts