Fluxo - com escopo, global
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");
});Priority 1: 11 reassignments
Priority 3: 6 reassignments
Priority 5: 5 reassignmentsMé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.
| 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.
| Nome | Tipo | Descrição |
|---|---|---|
| contagem | Número | Número de registros em cada matriz retornada do fluxo. |
| 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.
| 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. |
| Tipo | Descrição |
|---|---|
| Booliano | Sinalizador que indica se a função de predicado retorna verdadeiro para cada item no fluxo. Valores válidos:
|
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.
| 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. |
| 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.
| 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. |
| 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.
| Nome | Tipo | Descrição |
|---|---|---|
| fn | Função | Função a ser aplicada ao resultado da consulta que retorna um objeto de fluxo. |
| 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.
| Nome | Tipo | Descrição |
|---|---|---|
| fn | Função | Função a ser aplicada a cada item no fluxo. |
| 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.
| Nome | Tipo | Descrição |
|---|---|---|
| arr | Matriz | Matriz de valores a partir da qual o fluxo será criado. |
| 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().
| Nome | Tipo | Descrição |
|---|---|---|
| contagem | Número | Número de registros a serem retornados. |
| 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.
| Nome | Tipo | Descrição |
|---|---|---|
| fn | Função | Função a ser aplicada ao resultado da consulta que usa cada item no fluxo como entrada. |
| 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.
| 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:
|
| valorInicial | Qualquer | Valor passado para a função como o valor inicial. |
| 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.
| 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. |
| Tipo | Descrição |
|---|---|
| Booliano | Sinalizador que indica se a função de predicado retornou verdadeiro para um item no fluxo. Valores válidos:
|
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.
| Nome | Tipo | Descrição |
|---|---|---|
| contagem | Número | O número máximo de itens do fluxo a serem retornados na matriz. |
| 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"
}
]