Compartilhar via


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)
             };

Consulte também

Conceitos

Usando janelas de eventos

Agregações e operadores definidos pelo usuário