Flux : délimité, global
L’API de flux fournit des méthodes permettant d’interagir avec un flux d’éléments tels que des enregistrements. Par exemple, vous pouvez utiliser la méthode forEach() pour mettre à jour l’état de chaque enregistrement d’un flux renvoyé par l’API GlideQuery .
Vous pouvez obtenir un objet Stream des manières suivantes :
- Instanciez un objet Stream à l’aide du constructeur.
- Renvoyer un objet Stream à partir de la méthode GlideQuery.select(). Pour plus d’informations, consultez GlideQuery.
Cette méthode est statique et ne nécessite pas d’instance de la classe : fromArray().
Utilisez l’API de flux dans des scripts côté serveur inclus dans le périmètre ou globaux. Cette API nécessite le module d’extension GlideQuery [com.sn_glidequery].
Implémentation
Cette API peut fonctionner avec les APIGlideQuery et facultatives dans undans lequel la méthode appelle en chaîne, chaque méthode s’appuyant sur le résultat renvoyé de la méthode précédente. Utilisez des méthodes pour définir les attributs de la requête. Les méthodes ne s’exécutent pas tant que vous n’appelez pas une méthode terminale, une méthode qui renvoie un résultat de requête, vous permettant de définir les exigences de la requête avant de l’exécuter.
Si la requête renvoie un seul enregistrement, le système enveloppe le résultat dans un objet facultatif. Si la requête renvoie un flux d’enregistrements, le système enveloppe le résultat dans un objet Stream. Ces objets vous permettent de gérer le résultat à l’aide d’un ensemble de méthodes dans chaque API.
Par exemple, ce script exécute une requête sur la table Tâche, regroupe les enregistrements par priorité et renvoie chaque priorité ayant un nombre total de réaffectations supérieur à quatre.
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éthodes de terminal
Pour des raisons de performances, une requête extrait uniquement les données lorsque vous appelez une méthode terminale. Voici les méthodes terminales de la classe Stream :
Flux : Flux(Fonction nextFn)
Instancie un objet Stream.
Au lieu d’utiliser ce constructeur, vous pouvez renvoyer un objet Stream basé sur une requête à l’aide de l’API GlideQuery .
| Nom | Type | Description |
|---|---|---|
| nextFn | Fonction | Fonction qui récupère l’élément suivant dans le flux. |
Cet exemple vous montre comment créer un objet Stream basé sur un générateur de nombres aléatoires. Assurez-vous d’inclure la méthode limit() pour éviter de créer une boucle infinie.
new Stream(Math.random)
.map(Math.round)
.map(function (num) {
return num === 1 ? 'heads' : 'tails';
})
.limit(10)
.forEach(gs.info)
Sortie :
*** Script: tails
*** Script: heads
*** Script: tails
*** Script: heads
*** Script: tails
*** Script: heads
*** Script: tails
*** Script: tails
*** Script: tails
*** Script: tails
Flux : bloc (nombre de numéros)
Renvoie les résultats sous forme de lots de tableaux, chacun contenant le nombre d’enregistrements transmis à la méthode.
| Nom | Type | Description |
|---|---|---|
| compter | Numéro | Nombre d’enregistrements dans chaque tableau renvoyés par le flux. |
| Type | Description |
|---|---|
| Flux | Objet utilisé pour interagir avec un flux d’éléments tels que des enregistrements. |
Cet exemple montre comment interroger une table et découper le résultat en lots de tableaux.
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));
});
Sortie :
*** 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"
}
]
Cet exemple montre comment créer une requête enfant à l’aide de lots d’ID. Lorsque vous appelez la méthode flatMap() après avoir utilisé la méthode chunk(), le système itère sur le lot d’enregistrements au lieu de chaque enregistrement individuel.
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)); Flux : tous les (prédicat de fonction)
Applique une fonction de prédicat à chaque élément de l’objet Stream. Si le prédicat renvoie la valeur true pour chaque élément du flux, la méthode renvoie la valeur true. Si le prédicat renvoie la valeur false pour un élément du flux, la méthode renvoie la valeur false.
| Nom | Type | Description |
|---|---|---|
| prédicat | Fonction | Fonction de prédicat à appliquer à chaque enregistrement ou élément à l’intérieur de l’objet Stream. La fonction doit prendre chaque élément du flux comme entrée et renvoyer un booléen. |
| Type | Description |
|---|---|
| Booléen | Marqueur indiquant si la fonction de prédicat renvoie la valeur vrai pour chaque élément du flux. Valeurs valides :
|
Cet exemple montre comment appliquer une fonction de prédicat à chaque élément d’un flux.
var hasOnlyShortDescriptions = new global.GlideQuery('task')
.whereNotNull('description')
.select('description')
.every(function (t) {
return t.description.length < 10;
});
gs.info(hasOnlyShortDescriptions);
Sortie :
false
Flux : filter(prédicat de fonction)
Applique une fonction de prédicat à chaque élément de l’objet Flux. Si le prédicat renvoie true, la méthode renvoie le flux. Si le prédicat renvoie la valeur faux, il renvoie un objet Stream vide.
Pour de meilleures performances, utilisez les méthodes where(),whereNotNull() et whereNull() dans la classe GlideQuery au lieu de cette méthode lorsque cela est possible. Consultez GlideQuery.
| Nom | Type | Description |
|---|---|---|
| prédicat | Fonction | Fonction de prédicat à appliquer à chaque enregistrement ou élément à l’intérieur de l’objet Stream. La fonction doit prendre chaque élément du flux comme entrée et renvoyer un booléen. |
| Type | Description |
|---|---|
| Flux | Objet utilisé pour interagir avec un flux d’éléments tels que des enregistrements. |
Cet exemple montre comment vérifier tous les enregistrements de la table Tâche par rapport à un filtre défini. Si les enregistrements correspondent au filtre, le système renvoie le flux d’enregistrements. Sinon, il renvoie un objet Stream vide.
var shoutingTasks = new global.GlideQuery('task')
.whereNotNull('description')
.select('description')
.filter(function (task) {
return task.description.toUpperCase() === task.description;
})
Stream : find(prédicat de fonction)
Renvoie le premier enregistrement ou élément dans l’objet de flux qui correspond à la fonction de prédicat. Si aucune fonction de prédicat n’est fournie, la méthode renvoie le premier enregistrement ou élément dans le flux.
| Nom | Type | Description |
|---|---|---|
| prédicat | Fonction | Facultatif. Fonction de prédicat à appliquer aux éléments à l’intérieur de l’objet Stream. La fonction doit prendre chaque élément du flux comme entrée et renvoyer un booléen. |
| Type | Description |
|---|---|
| Facultatif | Objet contenant l’enregistrement renvoyé. |
Cet exemple montre comment renvoyer le premier enregistrement du flux.
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);
Sortie :
Optional<{"sys_id":"babb4639b76233004fbc2089ee11a97f"}>
Flux : flatMap(fonction fn)
Applique une fonction à chaque élément d’un flux. Renvoie un autre flux que vous pouvez itérer.
Utilisez cette méthode au lieu de map() si la fonction renvoie un deuxième flux d’enregistrements.
| Nom | Type | Description |
|---|---|---|
| Fn | Fonction | Fonction à appliquer au résultat de la requête qui renvoie un objet Stream. |
| Type | Description |
|---|---|
| Flux | Objet contenant le flux d’enregistrements mis à jour après l’application de la fonction. |
Cet exemple vous montre comment interroger la table User, puis créer une requête enfant à partir des résultats. Cet exemple exécute une requête N+1, ce qui peut entraîner des problèmes de performances. Évitez ce cas d’utilisation dans un environnement de production.
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));
Sortie :
[
{
"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"
}
]
Flux : forEach(fonction fn)
Applique la fonction spécifiée à chaque enregistrement ou élément du flux.
| Nom | Type | Description |
|---|---|---|
| Fn | Fonction | Fonction à appliquer à chaque élément du flux. |
| Type | Description |
|---|---|
| Néant |
Cet exemple vous montre comment imprimer le résultat de chaque élément du flux.
var firstNames = new global.GlideQuery('sys_user')
.select('first_name')
.forEach(function (u) {
gs.debug(u.first_name);
});
Sortie :
*** 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
...
Flux : fromArray(Objet arr)
Renvoie un objet Stream qui contient les valeurs du tableau fourni.
| Nom | Type | Description |
|---|---|---|
| arr | Tableau | Tableau de valeurs à partir duquel créer le flux. |
| Type | Description |
|---|---|
| Flux | Objet utilisé pour interagir avec un flux d’éléments tels que des enregistrements. |
Cet exemple montre comment créer un objet Stream contenant un tableau de valeurs.
var nameStream = Stream.fromArray(['Bob', 'Sue', 'Sam'])
.map(function (name) {
return name.toUpperCase();
})
.toArray(3);
gs.info(JSON.stringify(nameStream));
Sortie :
["BOB","SUE","SAM"]
Flux : limit(nombre de nombres)
Limite le nombre de résultats renvoyés par le flux.
Pour de meilleures performances, utilisez la méthode limit() dans la classe GlideQuery lorsque cela est possible. Consultez GlideQuery. Vous devrez peut-être utiliser cette méthode pour limiter les résultats avec la méthode Stream.flatMap().
| Nom | Type | Description |
|---|---|---|
| compter | Numéro | Nombre d’enregistrements à renvoyer. |
| Type | Description |
|---|---|
| Flux | Objet utilisé pour interagir avec un flux d’éléments tels que des enregistrements. |
Cet exemple vous montre comment limiter les résultats renvoyés par la méthode 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));
});
Sortie :
*** 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"
}
Flux : map(fonction fn)
Applique une fonction à chaque élément d’un flux et renvoie l’objet de flux mis à jour.
| Nom | Type | Description |
|---|---|---|
| Fn | Fonction | Fonction à appliquer au résultat de la requête qui prend chaque élément du flux comme entrée. |
| Type | Description |
|---|---|
| Flux | Objet contenant le flux d’enregistrements mis à jour après l’application de la fonction. |
Cet exemple vous montre comment appliquer une fonction à chaque élément du flux.
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));
Sortie :
[
"SURVEY",
"LUCIUS",
"JIMMIE",
"MELINDA",
"JEWEL",
"SEAN",
"JACINTO",
"KRYSTLE",
"BILLIE",
"CHRISTIAN",
...
]
Stream : reduce(function reducerFn, Any initialValue)
Exécute une fonction de réducteur sur chaque élément du flux, ce qui génère une valeur de sortie unique.
Cette méthode est similaire à la méthode native JavaScript reduce(). Pour plus d’informations, consultez la documentation w3schools.
| Nom | Type | Description |
|---|---|---|
| réducteurFn | Fonction | Fonction à appliquer à chaque élément du flux qui réduit le flux à une seule valeur. Cette fonction doit prendre deux arguments :
|
| initialValue | N'importe lequel | Valeur transmise à la fonction en tant que valeur initiale. |
| Type | Description |
|---|---|
| N'importe lequel | Total cumulé de tous les éléments renvoyés par la fonction de réducteur. |
Cet exemple vous montre comment renvoyer l’enregistrement avec le nom le plus long à partir de la table Utilisateur.
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));
Sortie :
"ATF_TestItilUser1"
Flux : some(prédicat de fonction)
Applique une fonction de prédicat, une fonction qui prend une seule valeur et renvoie vrai ou faux, à chaque élément du flux. Si le prédicat renvoie la valeur vrai pour n’importe quel élément du flux, la méthode renvoie la valeur vrai.
| Nom | Type | Description |
|---|---|---|
| prédicat | Fonction | Fonction de prédicat à appliquer aux éléments à l’intérieur de l’objet Stream. Doit renvoyer une valeur booléenne. |
| Type | Description |
|---|---|
| Booléen | Marqueur indiquant si la fonction de prédicat a renvoyé la valeur vrai pour un élément du flux. Valeurs valides :
|
Cet exemple montre comment vérifier si les descriptions de la table Tâches font plus de 1 000 caractères.
var hasLongDescriptions = new global.GlideQuery('task')
.whereNotNull('description')
.select('description')
.some(function (t) {
return t.description.length > 1000;
});
gs.info(hasLongDescriptions);
Sortie :
false
Flux : toArray(Nombre de nombres)
Renvoie un tableau contenant le nombre donné d’éléments du flux.
| Nom | Type | Description |
|---|---|---|
| compter | Numéro | Nombre maximal d’éléments du flux à renvoyer dans le tableau. |
| Type | Description |
|---|---|
| Tableau | Tableau contenant le nombre donné d’éléments du flux. |
Cet exemple vous montre comment transformer un flux d’enregistrements en tableau JavaScript.
var users = new global.GlideQuery('sys_user')
.limit(10)
.select('first_name', 'last_name')
.toArray(50);
gs.info(JSON.stringify(users));
Sortie :
[
{
"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"
}
]