Stream: Bereichsbezogen, global
Die Stream API bietet Methoden für die Interaktion mit einem Stream von Elementen wie Datensätzen. Beispielsweise können Sie mit der Methode forEach() den Status jedes Datensatzes in einem von der GlideQuery- API zurückgegebenen Stream aktualisieren.
Sie können ein Stream-Objekt wie folgt abrufen:
- Instanziieren Sie ein Stream-Objekt mit dem Konstruktor.
- Gibt ein Stream-Objekt aus der GlideQuery.select()- Methode zurück. Weitere Informationen finden Sie unter GlideQuery.
Diese Methode ist statisch und erfordert keine Instanz der Klasse: fromArray().
Verwenden Sie die Stream API in bereichsbezogenen oder globalen serverseitigen Skripts. Diese API erfordert das Plugin „GlideQuery“ [com.sn_glidequery].
Implementierung
Diese API kann mit der GlideQuery- API und der optionalen API in einem Builder-Muster, bei dem die Methodenaufrufe verkettet sind, wobei jede Methode auf dem zurückgegebenen Ergebnis der vorherigen Methode aufbaut. Verwenden Sie Methoden, um die Attribute der Abfrage zu definieren. Die Methoden werden erst ausgeführt, wenn Sie eine Terminalmethode aufrufen, eine Methode, die ein Abfrageergebnis zurückgibt, sodass Sie die Anforderungen der Abfrage definieren können, bevor Sie sie ausführen.arbeiten.
Wenn die Abfrage einen einzelnen Datensatz zurückgibt, umschließt das System das Ergebnis in ein optionales Objekt. Wenn die Abfrage einen Stream von Datensätzen zurückgibt, umschließt das System das Ergebnis in einem Stream-Objekt. Mit diesen Objekten können Sie das Ergebnis mithilfe einer Reihe von Methoden in den einzelnen APIs verwalten.
Dieses Skript führt beispielsweise eine Abfrage in der Aufgabentabelle aus, gruppiert die Datensätze nach Priorität und gibt jede Priorität zurück, die insgesamt Neuzuweisungen von mehr als vier aufweist.
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 reassignmentsTerminalmethoden
Aus Leistungsgründen ruft eine Abfrage Daten nur ab, wenn Sie eine Terminal-Methode aufrufen. Dies sind die Terminalmethoden der Stream -Klasse:
Stream: Stream (Funktion NextFn)
Instanziiert ein Stream-Objekt.
Anstatt diesen Konstruktor zu verwenden, können Sie auch ein Stream-Objekt basierend auf einer Abfrage mit der GlideQuery- API zurückgeben.
| Name | Typ | Beschreibung |
|---|---|---|
| NextFn | Funktion | Eine Funktion, die das nächste Element im Stream abruft. |
In diesem Beispiel wird gezeigt, wie Sie ein Stream-Objekt basierend auf einem Zufallszahlengenerator erstellen. Achten Sie darauf, die limit()- Methode einzubeziehen, um eine Endlosschleife zu vermeiden.
new Stream(Math.random)
.map(Math.round)
.map(function (num) {
return num === 1 ? 'heads' : 'tails';
})
.limit(10)
.forEach(gs.info)
Ausgabe:
*** Script: tails
*** Script: heads
*** Script: tails
*** Script: heads
*** Script: tails
*** Script: heads
*** Script: tails
*** Script: tails
*** Script: tails
*** Script: tails
Stream – Block (Anzahl Anzahl)
gibt Ergebnisse in Array-Batches zurück, die jeweils die Anzahl der an die Methode übergebenen Datensätze enthalten.
| Name | Typ | Beschreibung |
|---|---|---|
| count | Nummer | Anzahl der Datensätze in jedem vom Stream zurückgegebenen Array. |
| Typ | Beschreibung |
|---|---|
| Stream | Objekt, das für die Interaktion mit einem Stream von Elementen wie Datensätzen verwendet wird. |
Dieses Beispiel zeigt, wie eine Tabelle abgefragt und das Ergebnis in Batches von Arrays aufgeteilt wird.
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));
});
Ausgabe:
*** 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"
}
]
In diesem Beispiel wird gezeigt, wie eine untergeordnete Abfrage mit Batches von IDs erstellt wird. Wenn Sie die FlatMap()- Methode aufrufen, nachdem Sie die Chunk() -Methode verwendet haben, iteriert das System über den Batch der Datensätze anstatt über jeden einzelnen Datensatz.
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)); Stream – jeden (Funktionsprädikat)
Wendet eine Prädikatfunktion auf jedes Element im Stream-Objekt an. Wenn das Prädikat für jedes Element im Stream „true“ zurückgibt, gibt die Methode „true“ zurück. Wenn das Prädikat für ein Element im Stream „false“ zurückgibt, gibt die Methode „false“ zurück.
| Name | Typ | Beschreibung |
|---|---|---|
| Prädikat | Funktion | Prädikatfunktion, die auf jeden Datensatz oder jedes Element im Stream-Objekt angewendet werden soll. Die Funktion muss jedes Element im Stream als Eingabe verwenden und einen booleschen Wert zurückgeben. |
| Typ | Beschreibung |
|---|---|
| Boolean | Kennzeichnung, die angibt, ob die Prädikatfunktion für jedes Element im Stream „wahr“ zurückgibt. Gültige Werte:
|
In diesem Beispiel wird gezeigt, wie eine Prädikatfunktion auf jedes Element in einem Stream angewendet wird.
var hasOnlyShortDescriptions = new global.GlideQuery('task')
.whereNotNull('description')
.select('description')
.every(function (t) {
return t.description.length < 10;
});
gs.info(hasOnlyShortDescriptions);
Ausgabe:
false
Stream – Filter (Funktionsprädikat)
Wendet eine Prädikatfunktion auf jedes Element im Stream-Objekt an. Wenn das Prädikat „true“ zurückgibt, gibt die Methode den Stream zurück. Wenn das Prädikat „falsch“ zurückgibt, gibt es ein leeres Stream-Objekt zurück.
Um eine bessere Leistung zu erzielen, sollten Sie in der GlideQuery-Klasse nach Möglichkeit die Methoden wo(), woNotNull() und woNull() anstelle dieser Methode verwenden. Siehe GlideQuery.
| Name | Typ | Beschreibung |
|---|---|---|
| Prädikat | Funktion | Prädikatfunktion, die auf jeden Datensatz oder jedes Element im Stream-Objekt angewendet werden soll. Die Funktion muss jedes Element im Stream als Eingabe verwenden und einen booleschen Wert zurückgeben. |
| Typ | Beschreibung |
|---|---|
| Stream | Objekt, das für die Interaktion mit einem Stream von Elementen wie Datensätzen verwendet wird. |
In diesem Beispiel wird gezeigt, wie alle Datensätze in der Aufgabentabelle anhand eines definierten Filters überprüft werden. Wenn die Datensätze dem Filter entsprechen, gibt das System den Stream der Datensätze zurück. Andernfalls wird ein leeres Stream-Objekt zurückgegeben.
var shoutingTasks = new global.GlideQuery('task')
.whereNotNull('description')
.select('description')
.filter(function (task) {
return task.description.toUpperCase() === task.description;
})
Stream – finden (Funktionsprädikat)
Gibt den ersten Datensatz oder das erste Element im Stream-Objekt zurück, der der Prädikatfunktion entspricht. Wenn keine Prädikatfunktion angegeben ist, gibt die Methode den ersten Datensatz oder das erste Element im Stream zurück.
| Name | Typ | Beschreibung |
|---|---|---|
| Prädikat | Funktion | Optional. Prädikatfunktion, die auf die Elemente im Stream-Objekt angewendet werden soll. Die Funktion muss jedes Element im Stream als Eingabe verwenden und einen booleschen Wert zurückgeben. |
| Typ | Beschreibung |
|---|---|
| Optional | Objekt mit dem zurückgegebenen Datensatz. |
In diesem Beispiel wird gezeigt, wie der erste Datensatz aus dem Stream zurückgegeben wird.
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);
Ausgabe:
Optional<{"sys_id":"babb4639b76233004fbc2089ee11a97f"}>
Stream – FlatMap(function fn)
Wendet eine Funktion auf jedes Element in einem Stream an. Gibt einen anderen Stream zurück, über den Sie iterieren können.
Verwenden Sie diese Methode anstelle von map(), wenn die Funktion einen zweiten Stream von Datensätzen zurückgibt.
| Name | Typ | Beschreibung |
|---|---|---|
| Fn | Funktion | Funktion, die auf das Ergebnis der Abfrage angewendet werden soll, die ein Stream-Objekt zurückgibt. |
| Typ | Beschreibung |
|---|---|
| Stream | Objekt, das den Stream der Datensätze enthält, die nach der Anwendung der Funktion aktualisiert werden. |
Dieses Beispiel zeigt, wie Sie die Benutzertabelle abfragen und dann eine untergeordnete Abfrage aus dem Ergebnis erstellen. In diesem Beispiel wird eine N+1-Abfrage ausgeführt, was zu Leistungsproblemen führen kann. Vermeiden Sie diesen Anwendungsfall in einer Produktionsumgebung.
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));
Ausgabe:
[
{
"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"
}
]
Stream – forEach(Function fn)
Wendet die angegebene Funktion auf jeden Datensatz oder jedes Element im Stream an.
| Name | Typ | Beschreibung |
|---|---|---|
| Fn | Funktion | Funktion, die auf jedes Element im Stream angewendet werden soll. |
| Typ | Beschreibung |
|---|---|
| Keine |
In diesem Beispiel wird gezeigt, wie Sie das Ergebnis für jedes Element im Stream drucken.
var firstNames = new global.GlideQuery('sys_user')
.select('first_name')
.forEach(function (u) {
gs.debug(u.first_name);
});
Ausgabe:
*** 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
...
Stream – fromArray(Object arr)
Gibt ein Stream-Objekt zurück, das die Werte aus dem angegebenen Array enthält.
| Name | Typ | Beschreibung |
|---|---|---|
| arr | Array | Array von Werten, aus denen der Stream erstellt werden soll. |
| Typ | Beschreibung |
|---|---|
| Stream | Objekt, das für die Interaktion mit einem Stream von Elementen wie Datensätzen verwendet wird. |
In diesem Beispiel wird gezeigt, wie ein Stream-Objekt erstellt wird, das ein Array von Werten enthält.
var nameStream = Stream.fromArray(['Bob', 'Sue', 'Sam'])
.map(function (name) {
return name.toUpperCase();
})
.toArray(3);
gs.info(JSON.stringify(nameStream));
Ausgabe:
["BOB","SUE","SAM"]
Stream – limit(Anzahl Anzahl)
Begrenzt die Anzahl der vom Stream zurückgegebenen Ergebnisse.
Um eine bessere Leistung zu erzielen, sollten Sie in der GlideQuery -Klasse nach Möglichkeit die limit()- Methode verwenden. Siehe GlideQuery. Möglicherweise müssen Sie diese Methode verwenden, um die Ergebnisse mit der Stream.platMap()- Methode einzuschränken.
| Name | Typ | Beschreibung |
|---|---|---|
| count | Nummer | Anzahl der zurückzugebenden Datensätze. |
| Typ | Beschreibung |
|---|---|
| Stream | Objekt, das für die Interaktion mit einem Stream von Elementen wie Datensätzen verwendet wird. |
In diesem Beispiel erfahren Sie, wie Sie die von der Stream.platMap()- Methode zurückgegebenen Ergebnisse einschränken.
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));
});
Ausgabe:
*** 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"
}
Stream – map(Funktion fn)
Wendet eine Funktion auf jedes Element in einem Stream an und gibt das aktualisierte Stream-Objekt zurück.
| Name | Typ | Beschreibung |
|---|---|---|
| Fn | Funktion | Funktion, die auf das Ergebnis der Abfrage angewendet werden soll, die jedes Element im Stream als Eingabe verwendet. |
| Typ | Beschreibung |
|---|---|
| Stream | Objekt, das den Stream der Datensätze enthält, die nach der Anwendung der Funktion aktualisiert werden. |
In diesem Beispiel wird gezeigt, wie Sie eine Funktion auf jedes Element im Stream anwenden.
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));
Ausgabe:
[
"SURVEY",
"LUCIUS",
"JIMMIE",
"MELINDA",
"JEWEL",
"SEAN",
"JACINTO",
"KRYSTLE",
"BILLIE",
"CHRISTIAN",
...
]
Stream –reduzieren (FunktionreduziererFn, Beliebiger Anfangswert)
Führt eine Reduziererfunktion für jedes Element im Stream aus, was zu einem einzelnen Ausgabewert führt.
Diese Methode ähnelt der nativen JavaScript- reduzierten Methode (). Weitere Informationen finden Sie in der w3schuls-Dokumentation.
| Name | Typ | Beschreibung |
|---|---|---|
| reduziererFn | Funktion | Funktion, die auf jedes Element im Stream angewendet werden soll und den Stream auf einen einzelnen Wert reduziert. Diese Funktion muss zwei Argumente annehmen:
|
| initialValue | Beliebig | Wert, der als Anfangswert an die Funktion übergeben wurde. |
| Typ | Beschreibung |
|---|---|
| Beliebig | Kumulierte Summe aller von der Reduziererfunktion zurückgegebenen Elemente. |
In diesem Beispiel wird gezeigt, wie Sie den Datensatz mit dem längsten Namen aus der Benutzertabelle zurückgeben.
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));
Ausgabe:
"ATF_TestItilUser1"
Stream – einige (Funktionsprädikat)
Wendet auf jedes Element im Stream eine Prädikatfunktion an, eine Funktion, die einen einzelnen Wert annimmt und „wahr“ oder „falsch“ zurückgibt. Wenn das Prädikat für ein Element im Stream „true“ zurückgibt, gibt die Methode „true“ zurück.
| Name | Typ | Beschreibung |
|---|---|---|
| Prädikat | Funktion | Prädikatfunktion, die auf die Elemente im Stream-Objekt angewendet werden soll. Muss einen booleschen Wert zurückgeben. |
| Typ | Beschreibung |
|---|---|
| Boolean | Kennzeichnung, die angibt, ob die Prädikatfunktion für ein Element im Stream „wahr“ zurückgegeben hat. Gültige Werte:
|
In diesem Beispiel wird gezeigt, wie überprüft wird, ob Beschreibungen in der Aufgabentabelle länger als 1.000 Zeichen sind.
var hasLongDescriptions = new global.GlideQuery('task')
.whereNotNull('description')
.select('description')
.some(function (t) {
return t.description.length > 1000;
});
gs.info(hasLongDescriptions);
Ausgabe:
false
Stream – toArray(Anzahl Anzahl)
Gibt ein Array zurück, das die angegebene Anzahl von Elementen aus dem Stream enthält.
| Name | Typ | Beschreibung |
|---|---|---|
| count | Nummer | Die maximale Anzahl von Elementen aus dem Stream, die im Array zurückgegeben werden sollen. |
| Typ | Beschreibung |
|---|---|
| Array | Array, das die angegebene Anzahl von Elementen aus dem Stream enthält. |
In diesem Beispiel wird gezeigt, wie Sie einen Stream von Datensätzen in ein JavaScript-Array umwandeln.
var users = new global.GlideQuery('sys_user')
.limit(10)
.select('first_name', 'last_name')
.toArray(50);
gs.info(JSON.stringify(users));
Ausgabe:
[
{
"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"
}
]