Fluxo - com escopo, global

  • Versão de lançamento: Xanadu
  • Atualizado 1 de ago. de 2024
  • 11 min. de leitura
  • A API Stream fornece métodos para interagir com um fluxo de itens, como registros. Por exemplo, você pode usar o método forEach() para atualizar o estado de cada registro em um fluxo retornado pela API GlideQuery.

    Você pode obter um objeto de fluxo destas maneiras:

    • Instanciar um objeto de fluxo usando o construtor.
    • Retornar um objeto de fluxo do método GlideQuery.select(). Para obter mais informações, consulte GlideQuery.

    Este método é estático e não requer uma instância da classe: fromArray().

    Use a API Stream em scripts do lado do servidor com escopo ou globais. Esta API requer o plug-in GlideQuery [com.sn_glidequery].

    Implementação

    Esta API pode funcionar com as APIs GlideQuery e opcionais em um padrão de construtor em que o método chama a cadeia, cada método se baseia no resultado retornado do método anterior. Use métodos para definir os atributos da consulta. Os métodos não são executados até que você chame um método de terminal, um método que retorna um resultado de consulta, permitindo que você defina os requisitos da consulta antes de executá-la.

    Se a consulta retornar um único registro, o sistema agrupará o resultado em um objeto opcional. Se a consulta retornar um fluxo de registros, o sistema agrupará o resultado em um objeto Stream. Esses objetos permitem gerenciar o resultado usando um conjunto de métodos em cada API.

    Por exemplo, este script executa uma consulta na Tabela de tarefas, agrupa os registros por prioridade e retorna cada prioridade que tem um total de reatribuições maior que quatro.

    var query = new global.GlideQuery('task')
        .where('active', true) //Returns new GlideQuery object with a "where" clause.
        .groupBy('priority') //Returns new GlideQuery object with a "group by" clause.
        .aggregate('sum', 'reassignment_count') //Returns new GlideQuery object with a "sum(reassignment_count)" clause.
        .having('sum', 'reassignment_count', '>', 4) //Returns new GlideQuery object with a "having reassignment_count > 4" clause.
        .select() //Returns a stream of records wrapped in a Stream object.  
        .forEach(function (priority){ //Terminal method in the Stream class that executes the query and returns the result. 
          gs.info("Priority " + priority.group.priority + ": " + priority.sum.reassignment_count + " reassignments");
        });
    Saída:
    Priority 1: 11 reassignments
    Priority 3: 6 reassignments
    Priority 5: 5 reassignments

    Métodos de terminal

    Por motivos de desempenho, uma consulta só busca dados quando você chama um método de terminal. Estes são os métodos de terminal da classe Stream :

    Fluxo - Fluxo (função nextFn)

    Instancia um objeto de fluxo.

    Em vez de usar este construtor, você pode retornar um objeto de fluxo com base em uma consulta usando a API GlideQuery.

    Tabela 1. Parâmetros
    Nome Tipo Descrição
    nextFn Função Uma função que recupera o próximo item no fluxo.

    Este exemplo mostra como criar um objeto de fluxo com base em um gerador de números aleatórios. Certifique-se de incluir o método limit() para evitar a criação de um loop infinito.

    new Stream(Math.random)
       .map(Math.round)
       .map(function (num) { 
          return num === 1 ? 'heads' : 'tails'; 
       })
       .limit(10)
       .forEach(gs.info)
    

    Saída:

    *** Script: tails
    *** Script: heads
    *** Script: tails
    *** Script: heads
    *** Script: tails
    *** Script: heads
    *** Script: tails
    *** Script: tails
    *** Script: tails
    *** Script: tails

    Fluxo - bloco (contagem de números)

    Retorna resultados em lotes de matrizes, cada uma contendo o número de registros passados para o método.

    Tabela 2. Parâmetros
    Nome Tipo Descrição
    contagem Número Número de registros em cada matriz retornada do fluxo.
    Tabela 3. Retorna
    Tipo Descrição
    Fluxo Objeto usado para interagir com um fluxo de itens, como registros.

    Este exemplo mostra como consultar uma tabela e dividir o resultado em lotes de matrizes.

    var chunkResult = new GlideQuery('cmdb_ci_hardware')
        .select('asset', 'purchase_date')
        .limit(10)
        .chunk(5) //Returns arrays of 5 sys_ids at a time
        .forEach(function (chunk){ 
            gs.info(JSON.stringify(chunk, null, 2)); 
        });

    Saída:

    *** Script: [
      {
        "asset": "2fa9680d3790200044e0bfc8bcbe5dfb",
        "purchase_date": "2022-02-28",
        "sys_id": "2ba9680d3790200044e0bfc8bcbe5dfc"
      },
      {
        "asset": "73c1fa8837f3100044e0bfc8bcbe5ded",
        "purchase_date": "2017-12-05",
        "sys_id": "b4fd7c8437201000deeabfc8bcbe5dc1"
      },
      {
        "asset": "cbc1ba8837f3100044e0bfc8bcbe5dad",
        "purchase_date": "2017-12-05",
        "sys_id": "25fd3c8437201000deeabfc8bcbe5dea"
      },
      {
        "asset": "8fc1ba8837f3100044e0bfc8bcbe5da9",
        "purchase_date": null,
        "sys_id": "108a9205c611227500786e160f9d343e"
      },
      {
        "asset": "27c1fa8837f3100044e0bfc8bcbe5dd8",
        "purchase_date": "2017-06-06",
        "sys_id": "a9a2d111c611227601fb37542399caa8"
      }
    ]
    *** Script: [
      {
        "asset": "93c1fa8837f3100044e0bfc8bcbe5d30",
        "purchase_date": "2017-12-05",
        "sys_id": "6b43105c37301000deeabfc8bcbe5db2"
      },
      {
        "asset": "a2c0b1213784200044e0bfc8bcbe5de3",
        "purchase_date": "2017-12-05",
        "sys_id": "aac0b1213784200044e0bfc8bcbe5de3"
      },
      {
        "asset": "33c1fa8837f3100044e0bfc8bcbe5def",
        "purchase_date": "2017-12-05",
        "sys_id": "d0e8761137201000deeabfc8bcbe5da7"
      },
      {
        "asset": "53c1fa8837f3100044e0bfc8bcbe5d1f",
        "purchase_date": "2017-12-05",
        "sys_id": "53fdbc8437201000deeabfc8bcbe5d10"
      },
      {
        "asset": "f1c031213784200044e0bfc8bcbe5de0",
        "purchase_date": "2017-12-05",
        "sys_id": "71c031213784200044e0bfc8bcbe5de1"
      }
    ]

    Este exemplo mostra como criar uma consulta secundária usando lotes de IDs. Quando você chama o método planoMap() depois de usar o método bloco(), o sistema itera sobre o lote de registros em vez de cada registro individual.

    var chunkResult = new global.GlideQuery('cmdb_ci_hardware')
        .select('sys_id')
        .map(function (device) { return device.sys_id; })
        .chunk(5) //Returns arrays of 5 sys_ids at a time
        .flatMap(function (deviceIds) {
            return new GlideQuery('cmdb_sam_sw_install')
                .where('installed_on', 'IN', deviceIds)
                .select('software_model', 'installed_on');
        })
    
    gs.info(JSON.stringify(chunkResult));

    Fluxo - a cada (predicado da função)

    Aplica uma função de predicado a cada item no objeto Stream. Se o predicado retornar verdadeiro para cada item no fluxo, o método retornará verdadeiro. Se o predicado retornar falso para qualquer item no fluxo, o método retornará falso.

    Tabela 4. Parâmetros
    Nome Tipo Descrição
    predicado Função Função de predicado a ser aplicada a cada registro ou item dentro do objeto Stream. A função deve usar cada item no fluxo como entrada e retornar um booliano.
    Tabela 5. Retorna
    Tipo Descrição
    Booliano

    Sinalizador que indica se a função de predicado retorna verdadeiro para cada item no fluxo.

    Valores válidos:
    • verdadeiro: a função de predicado retorna verdadeiro para cada item no fluxo.
    • falso: a função de predicado não retorna verdadeiro para todos os itens no fluxo.

    Este exemplo mostra como aplicar uma função de predicado a cada item em um fluxo.

    var hasOnlyShortDescriptions = new global.GlideQuery('task')
       .whereNotNull('description')
       .select('description')
       .every(function (t) { 
           return t.description.length < 10; 
           });
    
    gs.info(hasOnlyShortDescriptions);

    Saída:

    false

    Fluxo - filter (predicado da função)

    Aplica uma função de predicado a cada item no objeto Stream. Se o predicado retornar verdadeiro, o método retornará o fluxo. Se o predicado retornar falso, ele retornará um objeto de fluxo vazio.

    Para obter melhor desempenho, use os métodos Where( ), WhereNotNull()e WhereNull() na classe GlideQuery em vez deste método sempre que possível. Consulte GlideQuery.

    Tabela 6. Parâmetros
    Nome Tipo Descrição
    predicado Função Função de predicado a ser aplicada a cada registro ou item dentro do objeto Stream. A função deve usar cada item no fluxo como entrada e retornar um booliano.
    Tabela 7. Retorna
    Tipo Descrição
    Fluxo Objeto usado para interagir com um fluxo de itens, como registros.

    Este exemplo mostra como verificar todos os registros na tabela de tarefas em relação a um filtro definido. Se os registros corresponderem ao filtro, o sistema retornará o fluxo de registros. Caso contrário, ele retornará um objeto de fluxo vazio.

    var shoutingTasks = new global.GlideQuery('task')
       .whereNotNull('description')
       .select('description')
       .filter(function (task) { 
           return task.description.toUpperCase() === task.description; 
       })

    Fluxo - encontrar (predicado da função)

    Retorna o primeiro registro ou item no objeto de fluxo que corresponde à função de predicado. Se nenhuma função de predicado for fornecida, o método retornará o primeiro registro ou item no fluxo.

    Tabela 8. Parâmetros
    Nome Tipo Descrição
    predicado Função Opcional. Função de predicado a ser aplicada aos itens dentro do objeto Stream. A função deve usar cada item no fluxo como entrada e retornar um booliano.
    Tabela 9. Retorna
    Tipo Descrição
    Opcional Objeto que contém o registro retornado.

    Este exemplo mostra como retornar o primeiro registro do fluxo.

    var UserOptional = new global.GlideQuery('sys_user')
       .where('active', true)
       .where('company.name', 'ServiceNow')
       .select()
       .find()
       .map(function (user) { 
          return JSON.stringify(user); 
       })
    
    gs.info(UserOptional);

    Saída:

    Optional<{"sys_id":"babb4639b76233004fbc2089ee11a97f"}>

    Fluxo - planoMap(function fn)

    Aplica uma função a cada item em um fluxo. Retorna outro fluxo sobre o qual você pode iterar.

    Use este método em vez de map() se a função retornar um segundo fluxo de registros.

    Tabela 10. Parâmetros
    Nome Tipo Descrição
    fn Função Função a ser aplicada ao resultado da consulta que retorna um objeto de fluxo.
    Tabela 11. Retorna
    Tipo Descrição
    Fluxo Objeto que contém o fluxo de registros atualizados após a aplicação da função.

    Este exemplo mostra como consultar a tabela Usuário e criar uma consulta secundária a partir do resultado. Este exemplo executa uma consulta N+1, o que pode causar problemas de desempenho. Evite este caso de uso em um ambiente de produção.

    var records = new global.GlideQuery('sys_user')
       .where('last_login', '>', '2015-12-31')
       .select('first_name', 'last_name')
       .flatMap(function (u) {
          return new global.GlideQuery('task')
               .where('closed_by', u.sys_id)
               .select('closed_at', 'description')
               .map(function (t) {
                    return {
                        first_name: u.first_name,
                        last_name: u.last_name,
                        description: t.description,
                        closed_at: t.closed_at
                     };
               });
          })
       .limit(5)
       .toArray(100);
    
    gs.info(JSON.stringify(records));

    Saída:

    [
       {
          "first_name":"System",
          "last_name":"Administrator",
          "description":null,
          "closed_at":"2020-08-23 13:14:56"
       },
       {
          "first_name":"System",
          "last_name":"Administrator",
          "description":null,
          "closed_at":"2020-08-23 13:07:43"
       },
       {
          "first_name":"System",
          "last_name":"Administrator",
          "description":null,
          "closed_at":"2020-06-15 06:59:05"
       },
       {
          "first_name":"System",
          "last_name":"Administrator",
          "description":null,
          "closed_at":"2020-08-23 13:07:33"
       },
       {
          "first_name":"System",
          "last_name":"Administrator",
          "description":null,
          "closed_at":"2020-08-23 13:07:14"
       }
    ]

    Fluxo - forEach(Function fn)

    Aplica a função especificada a cada registro ou item no fluxo.

    Tabela 12. Parâmetros
    Nome Tipo Descrição
    fn Função Função a ser aplicada a cada item no fluxo.
    Tabela 13. Retorna
    Tipo Descrição
    Nenhum(a)

    Este exemplo mostra como imprimir o resultado de cada item no fluxo.

    var firstNames = new global.GlideQuery('sys_user')
       .select('first_name')
       .forEach(function (u) { 
          gs.debug(u.first_name); 
       });

    Saída:

    *** Script: [DEBUG] survey
    *** Script: [DEBUG] Lucius
    *** Script: [DEBUG] Jimmie
    *** Script: [DEBUG] Melinda
    *** Script: [DEBUG] Jewel
    *** Script: [DEBUG] Sean
    *** Script: [DEBUG] Jacinto
    *** Script: [DEBUG] Krystle
    *** Script: [DEBUG] Billie
    *** Script: [DEBUG] Christian
    *** Script: [DEBUG] Naomi
    ...

    Fluxo - fromArray(Object arr)

    Retorna um objeto de fluxo que contém os valores da matriz fornecida.

    Nota:
    Este método é estático. Você não precisa de uma instância da classe para usar este método.
    Tabela 14. Parâmetros
    Nome Tipo Descrição
    arr Matriz Matriz de valores a partir da qual o fluxo será criado.
    Tabela 15. Retorna
    Tipo Descrição
    Fluxo Objeto usado para interagir com um fluxo de itens, como registros.

    Este exemplo mostra como criar um objeto Stream que contém uma matriz de valores.

    var nameStream = Stream.fromArray(['Bob', 'Sue', 'Sam'])
       .map(function (name) { 
          return name.toUpperCase(); 
       })
       .toArray(3);
    
    gs.info(JSON.stringify(nameStream));

    Saída:

    ["BOB","SUE","SAM"]

    Fluxo - limite (contagem de números)

    Limita o número de resultados retornados pelo fluxo.

    Para obter melhor desempenho, use o método limit() na classe GlideQuery sempre que possível. Consulte GlideQuery. Pode ser necessário usar este método para limitar os resultados com o método Stream.flatMap().

    Tabela 16. Parâmetros
    Nome Tipo Descrição
    contagem Número Número de registros a serem retornados.
    Tabela 17. Retorna
    Tipo Descrição
    Fluxo Objeto usado para interagir com um fluxo de itens, como registros.

    Este exemplo mostra como limitar os resultados retornados do método Stream.flatMap().

    var records = new global.GlideQuery('sys_user')
       .where('last_login', '>', '2015-12-31')
       .select('first_name', 'last_name')
       .flatMap(function (u) {
          return new GlideQuery('task')
               .where('closed_by', u.sys_id)
               .select('closed_at', 'description')
               .map(function (t) {
                    return {
                        first_name: u.first_name,
                        last_name: u.last_name,
                        description: t.description,
                        closed_at: t.closed_at
                     };
               });
          })
       .limit(5)
       .forEach(function (task){
          gs.info(JSON.stringify(task, null, 2));
       });

    Saída:

    *** Script: {
      "first_name": "System",
      "last_name": "Administrator",
      "description": null,
      "closed_at": "2021-10-04 13:40:16"
    }
    *** Script: {
      "first_name": "System",
      "last_name": "Administrator",
      "description": null,
      "closed_at": "2021-10-04 13:40:22"
    }
    *** Script: {
      "first_name": "System",
      "last_name": "Administrator",
      "description": null,
      "closed_at": "2021-10-04 13:40:27"
    }
    *** Script: {
      "first_name": "System",
      "last_name": "Administrator",
      "description": null,
      "closed_at": "2021-10-04 13:40:31"
    }
    *** Script: {
      "first_name": "System",
      "last_name": "Administrator",
      "description": null,
      "closed_at": "2021-10-04 13:40:54"
    }

    Fluxo - map (Função fn)

    Aplica uma função a cada item em um fluxo e retorna o objeto Stream atualizado.

    Tabela 18. Parâmetros
    Nome Tipo Descrição
    fn Função Função a ser aplicada ao resultado da consulta que usa cada item no fluxo como entrada.
    Tabela 19. Retorna
    Tipo Descrição
    Fluxo Objeto que contém o fluxo de registros atualizados após a aplicação da função.

    Este exemplo mostra como aplicar uma função a cada item no fluxo.

    var users = new global.GlideQuery('sys_user')
       .whereNotNull('first_name')
       .select('first_name')
       .map(function (u) { 
          return u.first_name.toUpperCase(); 
       })
       .toArray(100);
    
    gs.info(JSON.stringify(users));

    Saída:

    [
       "SURVEY",
       "LUCIUS",
       "JIMMIE",
       "MELINDA",
       "JEWEL",
       "SEAN",
       "JACINTO",
       "KRYSTLE",
       "BILLIE",
       "CHRISTIAN",
       ...
    ]

    Fluxo - reduza (função redutorFn, qualquer valorinicial)

    Executa uma função de redutor em cada item no fluxo, resultando em um único valor de saída.

    Este método é semelhante ao método de redução () do JavaScript nativo. Para obter mais informações, consulte a documentação do w3chools.

    Tabela 20. Parâmetros
    Nome Tipo Descrição
    RedutorFn Função Função a ser aplicada a cada item no fluxo que reduz o fluxo a um único valor. Esta função deve ter dois argumentos:
    • acc: acumulador que acumula todos os valores retornados pela função.
    • cur: item atual que está sendo acumulado na matriz.
    valorInicial Qualquer Valor passado para a função como o valor inicial.
    Tabela 21. Retorna
    Tipo Descrição
    Qualquer Total acumulado de todos os itens retornados pela função de redutor.

    Este exemplo mostra como retornar o registro com o nome mais longo da tabela Usuário.

    var longestName = new global.GlideQuery('sys_user')
       .whereNotNull('first_name')
       .select('first_name')
       .reduce(function (acc, cur) {
           return cur.first_name.length > acc.length
               ? cur.first_name
               : acc;
           }, '');
    
    gs.info(JSON.stringify(longestName));

    Saída:

    "ATF_TestItilUser1"

    Fluxo - some (predicado da função)

    Aplica uma função de predicado, uma função que usa um único valor e retorna verdadeiro ou falso, a cada item no fluxo. Se o predicado retornar verdadeiro para qualquer item no fluxo, o método retornará verdadeiro.

    Tabela 22. Parâmetros
    Nome Tipo Descrição
    predicado Função Função de predicado a ser aplicada aos itens dentro do objeto Stream. Deve retornar um valor booliano.
    Tabela 23. Retorna
    Tipo Descrição
    Booliano

    Sinalizador que indica se a função de predicado retornou verdadeiro para um item no fluxo.

    Valores válidos:
    • verdadeiro: a função de predicado retornou verdadeiro para um item no fluxo.
    • falso: a função de predicado não retornou verdadeiro para um item no fluxo.

    Este exemplo mostra como verificar se alguma descrição na tabela de tarefas tem mais de 1.000 caracteres.

    var hasLongDescriptions = new global.GlideQuery('task')
       .whereNotNull('description')
       .select('description')
       .some(function (t) { 
          return t.description.length > 1000; 
       });
    
    
    gs.info(hasLongDescriptions);

    Saída:

    false

    Fluxo - toArray(Number count)

    Retorna uma matriz que contém o número fornecido de itens do fluxo.

    Tabela 24. Parâmetros
    Nome Tipo Descrição
    contagem Número O número máximo de itens do fluxo a serem retornados na matriz.
    Tabela 25. Retorna
    Tipo Descrição
    Matriz Matriz que contém o número fornecido de itens do fluxo.

    Este exemplo mostra como transformar um fluxo de registros em uma matriz JavaScript.

    var users = new global.GlideQuery('sys_user')
        .limit(10)
        .select('first_name', 'last_name')
        .toArray(50);
    
    gs.info(JSON.stringify(users));

    Saída:

    [
       {
          "first_name":"Jewel",
          "last_name":"Agresta",
          "sys_id":"02826bf03710200044e0bfc8bcbe5d64"
       },
       {
          "first_name":"Sean",
          "last_name":"Bonnet",
          "sys_id":"02826bf03710200044e0bfc8bcbe5d6d"
       },
       {
          "first_name":"Jacinto",
          "last_name":"Gawron",
          "sys_id":"02826bf03710200044e0bfc8bcbe5d76"
       },
       {
          "first_name":"Krystle",
          "last_name":"Stika",
          "sys_id":"02826bf03710200044e0bfc8bcbe5d7f"
       },
       {
          "first_name":"Billie",
          "last_name":"Cowley",
          "sys_id":"02826bf03710200044e0bfc8bcbe5d88"
       },
       {
          "first_name":"Christian",
          "last_name":"Marnell",
          "sys_id":"02826bf03710200044e0bfc8bcbe5d91"
       }
    ]