Funções definidas pelo usuário
Os exemplos deste tópico demonstram como estender as expressões possíveis em operadores LINQ do StreamInsight usando chamadas de método para funções .NET existentes ou UDFs (funções definidas pelo usuário).
Usando UDFs, são possíveis expressões de qualquer complexidade. Elas podem ser usadas sempre que ocorrem expressões ordinárias: predicados de filtro, projeções, predicados de junção etc. Porém, lembre-se de que essa chamada de método é avaliada para cada evento. Uma função definida pelo usuário deve ser compilada em um assembly acessível pelo servidor StreamInsight da mesma forma que adaptadores são fornecidos e usados no tempo de execução.
Os parâmetros e o valor de retorno de uma UDF devem ser de um dos tipos primitivos do StreamInsight. Adicionalmente, são aceitados parâmetros relacionados à cultura para UDFs.
Casos de uso
Os casos de uso a seguir ilustram formas como as funções definidas pelo usuário podem ser usadas para estender a funcionalidade de consultas do StreamInsight.
Filtros definidos pelo usuário
É possível criar um operador de filtro definido pelo usuário que justifique o evento de entrada e passe o evento para a saída ou filtre-o. Esse filtro definido pelo usuário pode justificar dados definidos pelo usuário e incluir lógica complexa ou especializada no processo de filtragem do evento.
Projetos definidos pelo usuário
Semelhante a filtros definidos pelo usuário, uma expressão de projeto definida pelo usuário pode gerar um novo valor de carga, cuja computação está além dos meios da funcionalidade de expressão fornecida no StreamInsight.
Exemplos
O exemplo a seguir usa um cálculo definido pelo usuário em uma expressão de filtro aplicando a função MyFunc nos 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;
O exemplo a seguir especifica a função definida pelo usuário MyFunctions.valThreshold no predicado de filtro.
var filteredStream = from e in stream
where e.value < MyFunctions.valThreshold(e.id)
select e;
O exemplo a seguir usa a função definida pelo usuário valThreshold, que assume um único parâmetro e retorna um 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;
}
}
}
Uma função de projeto definida pelo usuário pode ser usada como qualquer outra expressão em uma projeção, conforme mostrado no exemplo a seguir.
var result = from e in stream
select new { location = MyFunctions.Lookup(e.id) };
Além de assumir tipos primitivos internos como parâmetros, as funções definidas pelo usuário podem usar informações relacionadas à cultura como parâmetros. Os tipos aceitos são:
CultureInfo
StringComparison
CompareOptions
O exemplo a seguir mostra como fornecer informações específicas de cultura a um 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)
};
As informações de cultura também podem ser obtidas de um campo de evento no fluxo de entrada, usando a função auxiliar CepUtility.GetEventFieldCulture, conforme mostrado no exemplo a seguir.
var result = from e in stream
select new { location = MyFunctions.Lookup2(
e.name,
CepUtility.GetEventFieldCulture(e.name),
CompareOptions.IgnoreCase)
};