Stream – Scoped, Global

  • Freigeben Version: Washingtondc
  • Aktualisiert 1. Februar 2024
  • 11 Minuten Lesedauer
  • Die Stream -API interagiert mit einem Stream von Elementen wie Datensätzen. Sie können beispielsweise die forEach()- Methode verwenden, um den Status jedes Datensatzes in einem von der GlideQuery- API zurückgegebenen Stream zu aktualisieren.

    Sie können ein Stream-Objekt auf folgende Weise 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 den APIs „ GlideQuery“ und „ Optional “ in einem Generatormuster, bei dem die Methodenaufrufe miteinander verkettet sind und 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.verwendet werden.

    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 jeder API 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 mehr als vier Neuzuweisungen 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");
        });
    Ausgabe:
    Priority 1: 11 reassignments
    Priority 3: 6 reassignments
    Priority 5: 5 reassignments

    Terminal-Methoden

    Aus Leistungsgründen ruft eine Abfrage nur Daten ab, wenn Sie eine Terminal-Methode aufrufen. Dies sind die Terminal-Methoden aus der Stream -Klasse:

    Stream – Stream(Function nextFn)

    Instantiiert ein Stream-Objekt.

    Anstatt diesen Konstruktor zu verwenden, können Sie ein Stream-Objekt basierend auf einer Abfrage mit der GlideQuery- API zurückgeben.

    Tabelle : 1. Parameter
    Name Typ Beschreibung
    nextFn Funktion Eine Funktion, die das nächste Element im Stream abruft.

    Dieses Beispiel zeigt, wie Sie ein Stream-Objekt basierend auf einem Zufallszahlengenerator erstellen. Stellen Sie sicher, dass Sie die limit()- Methode einbeziehen, um die Erstellung einer 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 – Chunk(Number count)

    Gibt Ergebnisse in Batches von Arrays zurück, die jeweils die Anzahl der an die Methode übergebenen Datensätze enthalten.

    Tabelle : 2. Parameter
    Name Typ Beschreibung
    count Nummer Anzahl der Datensätze in jedem vom Stream zurückgegebenen Array.
    Tabelle : 3. Ergebnisse
    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 Array-Batches 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"
      }
    ]

    Dieses Beispiel zeigt, wie eine untergeordnete Abfrage mit ID-Batches erstellt wird. Wenn Sie die FlatMap()- Methode nach der Chunk() -Methode aufrufen, iteriert das System über den Stapel von Datensätzen und nicht ü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 – jeder(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.

    Tabelle : 4. Parameter
    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.
    Tabelle : 5. Ergebnisse
    Typ Beschreibung
    Boolean

    Kennzeichnung, die angibt, ob die Prädikatfunktion für jedes Element im Stream „true“ zurückgibt.

    Gültige Werte:
    • true: Die Prädikatfunktion gibt für jedes Element im Stream „true“ zurück.
    • false: Die Prädikatfunktion gibt nicht für jedes Element im Stream „true“ zurück.

    Dieses Beispiel zeigt, 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(Function predicate)

    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 „false“ zurückgibt, wird ein leeres Stream-Objekt zurückgegeben.

    Um eine bessere Leistung zu erzielen, verwenden Sie in der GlideQuery-Klasse anstelle dieser Methode nach Möglichkeit die Methoden wo(), woNotNull() und woNull(). Siehe GlideQuery.

    Tabelle : 6. Parameter
    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.
    Tabelle : 7. Ergebnisse
    Typ Beschreibung
    Stream Objekt, das für die Interaktion mit einem Stream von Elementen wie Datensätzen verwendet wird.

    Dieses Beispiel zeigt, 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 – find(Function predicate)

    Gibt den ersten Datensatz oder das erste Element im Stream-Objekt zurück, das der Prädikatfunktion entspricht. Wenn keine Prädikatfunktion angegeben ist, gibt die Methode den ersten Datensatz oder das erste Element im Stream zurück.

    Tabelle : 8. Parameter
    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.
    Tabelle : 9. Ergebnisse
    Typ Beschreibung
    Optional Objekt, das den zurückgegebenen Datensatz enthält.

    Dieses Beispiel zeigt, 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, den Sie durchlaufen können.

    Verwenden Sie diese Methode anstelle von map(), wenn die Funktion einen zweiten Stream von Datensätzen zurückgibt.

    Tabelle : 10. Parameter
    Name Typ Beschreibung
    fn Funktion Funktion, die auf das Ergebnis der Abfrage angewendet werden soll, die ein Stream-Objekt zurückgibt.
    Tabelle : 11. Ergebnisse
    Typ Beschreibung
    Stream Objekt, das den Stream der Datensätze enthält, der nach der Anwendung der Funktion aktualisiert wurde.

    Dieses Beispiel zeigt, wie Sie die Benutzertabelle abfragen und dann aus dem Ergebnis eine untergeordnete Abfrage erstellen. In diesem Beispiel wird eine N+1-Abfrage ausgeführt, die 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.

    Tabelle : 12. Parameter
    Name Typ Beschreibung
    fn Funktion Funktion, die auf jedes Element im Stream angewendet werden soll.
    Tabelle : 13. Ergebnisse
    Typ Beschreibung
    Keine

    Dieses Beispiel zeigt, wie Sie das Ergebnis jedes Elements 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.

    Hinweis:
    Diese Methode ist statisch. Sie benötigen keine Instanz der Klasse, um diese Methode zu verwenden.
    Tabelle : 14. Parameter
    Name Typ Beschreibung
    arr Array Array von Werten, aus denen der Stream erstellt werden soll.
    Tabelle : 15. Ergebnisse
    Typ Beschreibung
    Stream Objekt, das für die Interaktion mit einem Stream von Elementen wie Datensätzen verwendet wird.

    Dieses Beispiel zeigt, 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(Number count)

    Begrenzt die Anzahl der vom Stream zurückgegebenen Ergebnisse.

    Um eine bessere Leistung zu erzielen, verwenden Sie nach Möglichkeit die limit()- Methode in der GlideQuery -Klasse. Siehe GlideQuery. Möglicherweise müssen Sie diese Methode verwenden, um die Ergebnisse mit der Stream.latMap()- Methode zu begrenzen.

    Tabelle : 16. Parameter
    Name Typ Beschreibung
    count Nummer Anzahl der zurückzugebenden Datensätze.
    Tabelle : 17. Ergebnisse
    Typ Beschreibung
    Stream Objekt, das für die Interaktion mit einem Stream von Elementen wie Datensätzen verwendet wird.

    Dieses Beispiel zeigt, wie Sie die von der Stream.latMap()- Methode zurückgegebenen Ergebnisse begrenzen.

    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(Function fn)

    Wendet eine Funktion auf jedes Element in einem Stream an und gibt das aktualisierte Stream-Objekt zurück.

    Tabelle : 18. Parameter
    Name Typ Beschreibung
    fn Funktion Funktion, die auf das Ergebnis der Abfrage angewendet werden soll, die jedes Element im Stream als Eingabe verwendet.
    Tabelle : 19. Ergebnisse
    Typ Beschreibung
    Stream Objekt, das den Stream der Datensätze enthält, der nach der Anwendung der Funktion aktualisiert wurde.

    Dieses Beispiel zeigt, 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 – reduziert (functionreduziererFn, Any initialValue)

    Führt eine Reduzierfunktion für jedes Element im Stream aus, was zu einem einzelnen Ausgabewert führt.

    Diese Methode ähnelt der nativen JavaScript-Methode reduzieren(). Weitere Informationen finden Sie in der w3schulen-Dokumentation.

    Tabelle : 20. Parameter
    Name Typ Beschreibung
    reduziererFn Funktion Auf jedes Element im Stream anzuwendende Funktion, die den Stream auf einen einzelnen Wert reduziert. Diese Funktion muss zwei Argumente annehmen:
    • acc: Akkumulator, der alle von der Funktion zurückgegebenen Werte akkumuliert.
    • cur: Aktuelles Element, das im Array akkumuliert wird.
    initialValue Beliebig Wert, der als Anfangswert an die Funktion übergeben wird.
    Tabelle : 21. Ergebnisse
    Typ Beschreibung
    Beliebig Kumulierte Summe aller von der Reduzierfunktion zurückgegebenen Elemente.

    Dieses Beispiel zeigt, 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 eine Prädikatfunktion, eine Funktion, die einen einzelnen Wert annimmt und „true“ oder „false“ zurückgibt, auf jedes Element im Stream an. Wenn das Prädikat für ein Element im Stream „true“ zurückgibt, gibt die Methode „true“ zurück.

    Tabelle : 22. Parameter
    Name Typ Beschreibung
    Prädikat Funktion Prädikatfunktion, die auf die Elemente im Stream-Objekt angewendet werden soll. Muss einen booleschen Wert zurückgeben.
    Tabelle : 23. Ergebnisse
    Typ Beschreibung
    Boolean

    Kennzeichnung, die angibt, ob die Prädikatfunktion für ein Element im Stream „true“ zurückgegeben hat.

    Gültige Werte:
    • true: Die Prädikatfunktion hat für ein Element im Stream „true“ zurückgegeben.
    • false: Die Prädikatfunktion hat für ein Element im Stream nicht „true“ zurückgegeben.

    Dieses Beispiel zeigt, wie Sie überprüfen können, 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(Number count)

    Gibt ein Array zurück, das die angegebene Anzahl von Elementen aus dem Stream enthält.

    Tabelle : 24. Parameter
    Name Typ Beschreibung
    count Nummer Die maximale Anzahl von Elementen aus dem Stream, die im Array zurückgegeben werden sollen.
    Tabelle : 25. Ergebnisse
    Typ Beschreibung
    Array Array, das die angegebene Anzahl von Elementen aus dem Stream enthält.

    Dieses Beispiel zeigt, 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"
       }
    ]