Funciones definidas por el usuario
En los ejemplos de este tema se muestra cómo extender las posibles expresiones de los operadores LINQ de StreamInsight mediante llamadas de métodos a funciones .NET existentes o funciones definidas por el usuario (UDF).
Utilizando UDF, se pueden crear expresiones de cualquier grado de complejidad. Se pueden utilizar en cualquier lugar donde aparecen expresiones ordinarias: predicados de filtro, proyecciones, predicados de combinación, etc. Sin embargo, debe tener en cuenta que este tipo de llamada a método se evalúa para cada evento. Una función definida por el usuario se debe compilar en un ensamblado al que pueda tener acceso el servidor de StreamInsight, del mismo modo que los adaptadores se proporcionan y utilizan en tiempo de ejecución.
Los parámetros y el valor devuelto de una UDF deben ser de uno de los tipos primitivos de StreamInsight. Además, los parámetros relacionados con referencia cultural se aceptan en las UDF.
Casos de uso
Los siguientes casos de uso muestran usos de las funciones definidas por el usuario para extender la funcionalidad de las consultas de StreamInsight.
Filtros definidos por el usuario
Puede crear a un operador de filtro definido por el usuario para analizar el evento de entrada y pasar el evento al resultado o dejarlo fuera. Este tipo de filtro definido por el usuario puede analizar datos definidos por el usuario e incluir lógica compleja o especializada en el proceso de filtrado de eventos.
Proyectos definidos por el usuario
Similar a los filtros definidos por el usuario, una expresión de proyecto definida por el usuario puede generar un nuevo valor de carga, cuyo cálculo va más allá de los recursos de la funcionalidad de expresión proporcionada en StreamInsight.
Ejemplos
En el siguiente ejemplo se utiliza un cálculo definido por el usuario en una expresión de filtro mediante la aplicación de la función MyFunc en los campos de carga.
// Assuming the following input event type:
public class MyPayload
{
public int id;
public int a;
public int b;
public double value;
}
var filteredStream = from e in stream
where e.value > MyFunc(e.a * e.b)
select e;
En el siguiente ejemplo se especifica la función definida por el usuario MyFunctions.valThreshold en el predicado del filtro.
var filteredStream = from e in stream
where e.value < MyFunctions.valThreshold(e.id)
select e;
En el siguiente ejemplo se usa la función definida por el usuario valThreshold, que toma un parámetro único y devuelve un valor.
public class MyFunctions
{
public static int valThreshold(int id)
{
switch (id)
{
case 1:
return 15;
case 2:
return 11;
case 3:
return 18;
default:
return 0;
}
}
}
Una función de proyecto definida por el usuario se puede utilizar como cualquier otra expresión en una proyección, tal como se muestra en el siguiente ejemplo.
var result = from e in stream
select new { location = MyFunctions.Lookup(e.id) };
Además de tomar los tipos primitivos integrados como parámetros, las funciones definidas por el usuario pueden tomar información relacionada con la referencia cultural como parámetro. A continuación se indican los tipos aceptados:
CultureInfo
StringComparison
CompareOptions
En el siguiente ejemplo se muestra cómo proporcionar información específica de la referencia cultural a una UDF.
// Assuming the following input event type:
public class MyPayload
{
public int id;
public string name;
}
var result = from e in stream
select new { location = MyFunctions.Lookup2(
e.name,
new CultureInfo("en-US"),
CompareOptions.IgnoreCase)
};
La información de referencia cultural también se puede tomar de un campo de evento en el flujo de entrada, mediante la función auxiliar CepUtility.GetEventFieldCulture, tal como se muestra en el siguiente ejemplo.
var result = from e in stream
select new { location = MyFunctions.Lookup2(
e.name,
CepUtility.GetEventFieldCulture(e.name),
CompareOptions.IgnoreCase)
};