스트림 - 범위 지정, 전역
스트림 API는 레코드와 같은 항목 스트림과 상호 작용하는 메서드를 제공합니다. 예를 들어 forEach() 메서드를 사용하여 GlideQuery API에서 반환된 스트림에서 각 레코드의 상태를 업데이트할 수 있습니다.
다음과 같은 방법으로 Stream 개체를 가져올 수 있습니다.
- 생성자를 사용하여 Stream 개체를 인스턴스화합니다.
- GlideQuery.select() 메서드에서 Stream 객체를 반환합니다. 자세한 내용은 GlideQuery를 참조하십시오.
이 메서드는 정적이며 클래스의 인스턴스가 필요하지 않습니다: fromArray().
범위가 지정된 스크립트 또는 전역 서버 쪽 스크립트에서 Stream API를 사용합니다. 이 API에는 GlideQuery [com.sn_glidequery] 플러그인이 필요합니다.
구현
이 API는 다음의 GlideQuery 및 선택적 API와 함께 작동할 수 있습니다. 메서드가 함께 체인을 호출하는 빌더 패턴으로, 각 메서드는 이전 메서드의 반환된 결과를 기반으로 빌드됩니다. 메서드를 사용하여 쿼리의 속성을 정의합니다. 메서드는 쿼리 결과를 반환하는 메서드인 터미널 메서드를 호출할 때까지 실행되지 않으므로 쿼리를 실행하기 전에 쿼리의 요구 사항을 정의할 수 있습니다.
쿼리가 단일 레코드를 반환하면 시스템은 결과를 Optional 객체에 래핑합니다. 쿼리가 레코드 스트림을 반환하면 시스템은 결과를 Stream 개체에 래핑합니다. 이러한 개체를 사용하면 각 API의 메서드 집합을 사용하여 결과를 관리할 수 있습니다.
예를 들어, 이 스크립트는 작업 테이블에서 쿼리를 수행하고, 기록을 우선순위별로 그룹화하고, 총 재할당 수가 4 이상인 각 우선순위를 반환합니다.
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 reassignments종료 방법
성능상의 이유로 쿼리는 터미널 메서드를 호출할 때만 데이터를 가져옵니다. 다음은 Stream 클래스의 터미널 메서드입니다.
스트림 - Stream(Function nextFn)
Stream 개체를 인스턴스화합니다.
이 생성자를 사용하는 대신 GlideQuery API를 사용하여 쿼리를 기반으로 Stream 객체를 반환할 수 있습니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 다음Fn | 함수 | 스트림의 다음 항목을 검색하는 함수입니다. |
이 예제에서는 난수 생성기를 기반으로 Stream 객체를 만드는 방법을 보여 줍니다. 무한 루프가 생성되지 않도록 limit() 메서드를 포함해야 합니다.
new Stream(Math.random)
.map(Math.round)
.map(function (num) {
return num === 1 ? 'heads' : 'tails';
})
.limit(10)
.forEach(gs.info)
출력:
*** Script: tails
*** Script: heads
*** Script: tails
*** Script: heads
*** Script: tails
*** Script: heads
*** Script: tails
*** Script: tails
*** Script: tails
*** Script: tails
스트림 - 청크(숫자 수)
각각 메서드에 전달된 레코드 수를 포함하는 배열 배치로 결과를 반환합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 카운트 | 번호 | 스트림에서 반환된 각 배열의 기록 수입니다. |
| 유형 | 설명 |
|---|---|
| 스트림 | 기록과 같은 항목 스트림과 상호작용하는 데 사용되는 객체입니다. |
이 예제에서는 테이블을 쿼리하고 그 결과를 배열 배치로 청크 처리하는 방법을 보여줍니다.
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));
});
출력:
*** 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"
}
]
이 예제에서는 ID 배치를 사용하여 하위 쿼리를 만드는 방법을 보여 줍니다. chunk() 메서드를 사용한 후 flatMap() 메서드를 호출하면 시스템은 각 개별 레코드 대신 레코드 배치를 반복합니다.
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)); 스트림 - every(Function predicate)
Stream 개체의 모든 항목에 조건자 함수를 적용합니다. 조건자가 스트림의 모든 항목에 대해 true를 반환하면 메서드는 true를 반환합니다. 조건자가 스트림의 항목에 대해 false를 반환하면 메서드는 false를 반환합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 술어 | 함수 | Stream 개체 내의 모든 레코드 또는 항목에 적용되는 조건자 함수입니다. 함수는 스트림의 각 항목을 입력으로 사용하고 부울을 반환해야 합니다. |
| 유형 | 설명 |
|---|---|
| 부울 | 조건자 함수가 스트림의 모든 항목에 대해 true를 반환하는지 여부를 나타내는 플래그입니다. 유효한 값은 다음과 같습니다.
|
이 예제에서는 조건자 함수를 스트림의 모든 항목에 적용하는 방법을 보여 줍니다.
var hasOnlyShortDescriptions = new global.GlideQuery('task')
.whereNotNull('description')
.select('description')
.every(function (t) {
return t.description.length < 10;
});
gs.info(hasOnlyShortDescriptions);
출력:
false
스트림 - filter(함수 조건자)
Stream 개체의 각 항목에 조건자 함수를 적용합니다. 조건자가 true를 반환하면 메서드가 스트림을 반환합니다. 조건자가 false를 반환하면 빈 Stream 개체를 반환합니다.
성능을 향상시키려면 가능한 경우 이 메서드 대신 GlideQuery 클래스에서 where(), whereNotNull() 및 whereNull() 메서드를 사용합니다. GlideQuery를 참조하십시오.
| 이름 | 유형 | 설명 |
|---|---|---|
| 술어 | 함수 | Stream 개체 내의 모든 레코드 또는 항목에 적용되는 조건자 함수입니다. 함수는 스트림의 각 항목을 입력으로 사용하고 부울을 반환해야 합니다. |
| 유형 | 설명 |
|---|---|
| 스트림 | 기록과 같은 항목 스트림과 상호작용하는 데 사용되는 객체입니다. |
이 예는 정의된 필터에 대해 작업 테이블의 모든 기록을 검사하는 방법을 보여줍니다. 기록이 필터와 일치하면 시스템이 기록 스트림을 반환합니다. 그렇지 않으면 빈 Stream 개체를 반환합니다.
var shoutingTasks = new global.GlideQuery('task')
.whereNotNull('description')
.select('description')
.filter(function (task) {
return task.description.toUpperCase() === task.description;
})
스트림 - find(함수 조건자)
조건자 함수와 일치하는 Stream 개체의 첫 번째 레코드 또는 항목을 반환합니다. 조건자 함수가 제공되지 않은 경우 메서드는 Stream의 첫 번째 레코드 또는 항목을 반환합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 술어 | 함수 | 옵션입니다. Stream 개체 내의 항목에 적용할 조건자 함수입니다. 함수는 스트림의 각 항목을 입력으로 사용하고 부울을 반환해야 합니다. |
| 유형 | 설명 |
|---|---|
| 옵션 | 반환된 기록을 포함하는 객체입니다. |
이 예제에서는 스트림에서 첫 번째 레코드를 반환하는 방법을 보여 줍니다.
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);
출력:
Optional<{"sys_id":"babb4639b76233004fbc2089ee11a97f"}>
스트림 - flatMap(함수 fn)
스트림의 모든 항목에 함수를 적용합니다. 반복할 수 있는 다른 스트림을 반환합니다.
함수가 두 번째 레코드 스트림을 반환하는 경우 map() 대신 이 메서드를 사용합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 에프엔 | 함수 | Stream 개체를 반환하는 쿼리 결과에 적용할 함수입니다. |
| 유형 | 설명 |
|---|---|
| 스트림 | 함수를 적용한 후 업데이트된 기록 스트림을 포함하는 객체입니다. |
이 예제에서는 User 테이블을 쿼리한 다음 그 결과에서 자식 쿼리를 만드는 방법을 보여 줍니다. 이 예제에서는 성능 문제를 일으킬 수 있는 N+1 쿼리를 실행합니다. 프로덕션 환경에서는 이 사용 사례를 피하십시오.
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));
출력:
[
{
"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"
}
]
스트림 - forEach(함수 fn)
지정된 함수를 스트림의 각 기록 또는 항목에 적용합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 에프엔 | 함수 | 스트림의 각 항목에 적용할 함수입니다. |
| 유형 | 설명 |
|---|---|
| 없음 |
이 예제에서는 스트림에 있는 각 항목의 결과를 인쇄하는 방법을 보여 줍니다.
var firstNames = new global.GlideQuery('sys_user')
.select('first_name')
.forEach(function (u) {
gs.debug(u.first_name);
});
출력:
*** 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
...
스트림 - fromArray(Object arr)
제공된 배열의 값을 포함하는 Stream 객체를 반환합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 도착 | 배열 | 스트림을 작성할 값의 배열입니다. |
| 유형 | 설명 |
|---|---|
| 스트림 | 기록과 같은 항목 스트림과 상호작용하는 데 사용되는 객체입니다. |
이 예제에서는 값 배열이 포함된 Stream 개체를 만드는 방법을 보여 줍니다.
var nameStream = Stream.fromArray(['Bob', 'Sue', 'Sam'])
.map(function (name) {
return name.toUpperCase();
})
.toArray(3);
gs.info(JSON.stringify(nameStream));
출력:
["BOB","SUE","SAM"]
스트림 - limit(Number count)
스트림에서 반환하는 결과 수를 제한합니다.
성능을 향상시키려면 가능한 경우 GlideQuery 클래스에서 limit() 메서드를 사용하십시오. GlideQuery를 참조하십시오. 이 메서드를 사용하여 Stream.flatMap() 메서드의 결과를 제한해야 할 수도 있습니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 카운트 | 번호 | 반환할 기록 수입니다. |
| 유형 | 설명 |
|---|---|
| 스트림 | 기록과 같은 항목 스트림과 상호작용하는 데 사용되는 객체입니다. |
이 예제에서는 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));
});
출력:
*** 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"
}
스트림 - map(함수 fn)
스트림의 각 항목에 함수를 적용하고 업데이트된 Stream 개체를 반환합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 에프엔 | 함수 | 스트림의 각 항목을 입력으로 받는 쿼리 결과에 적용할 함수입니다. |
| 유형 | 설명 |
|---|---|
| 스트림 | 함수를 적용한 후 업데이트된 기록 스트림을 포함하는 객체입니다. |
이 예제에서는 스트림의 모든 항목에 함수를 적용하는 방법을 보여 줍니다.
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));
출력:
[
"SURVEY",
"LUCIUS",
"JIMMIE",
"MELINDA",
"JEWEL",
"SEAN",
"JACINTO",
"KRYSTLE",
"BILLIE",
"CHRISTIAN",
...
]
스트림 - reduce(function reducerFn, Any initialValue)
스트림의 각 항목에 대해 감속기 함수를 실행하여 단일 출력 값을 생성합니다.
이 메서드는 네이티브 JavaScript reduce() 메서드와 유사합니다. 자세한 내용은 w3schools 설명서를 참조하세요.
| 이름 | 유형 | 설명 |
|---|---|---|
| 감속기Fn | 함수 | 스트림을 단일 값으로 줄이는 스트림의 각 항목에 적용하는 함수입니다. 이 함수는 두 개의 인수를 사용해야 합니다.
|
| 이니셜값 | 모두 | 함수에 초기 값으로 전달되는 값입니다. |
| 유형 | 설명 |
|---|---|
| 모두 | 감속기 함수에서 반환된 모든 항목의 누적 합계입니다. |
이 예시에서는 사용자 테이블에서 이름이 가장 긴 기록을 반환하는 방법을 보여줍니다.
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));
출력:
"ATF_TestItilUser1"
스트림 - some(함수 조건자)
단일 값을 사용하고 true 또는 false를 반환하는 함수인 조건자 함수를 스트림의 각 항목에 적용합니다. 조건자가 스트림의 항목에 대해 true를 반환하면 메서드는 true를 반환합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 술어 | 함수 | Stream 개체 내의 항목에 적용할 조건자 함수입니다. 부울 값을 반환해야 합니다. |
| 유형 | 설명 |
|---|---|
| 부울 | 조건자 함수가 스트림의 항목에 대해 true를 반환했는지 여부를 나타내는 플래그입니다. 유효한 값은 다음과 같습니다.
|
이 예제에서는 작업 테이블의 설명이 1,000자를 초과하는지 여부를 확인하는 방법을 보여줍니다.
var hasLongDescriptions = new global.GlideQuery('task')
.whereNotNull('description')
.select('description')
.some(function (t) {
return t.description.length > 1000;
});
gs.info(hasLongDescriptions);
출력:
false
스트림 - toArray(숫자 수)
스트림에서 지정된 항목 수를 포함하는 배열을 반환합니다.
| 이름 | 유형 | 설명 |
|---|---|---|
| 카운트 | 번호 | 배열에서 반환할 스트림의 최대 항목 수입니다. |
| 유형 | 설명 |
|---|---|
| 배열 | 스트림에서 지정된 항목 수를 포함하는 배열입니다. |
이 예시에서는 레코드 스트림을 JavaScript 배열로 변환하는 방법을 보여줍니다.
var users = new global.GlideQuery('sys_user')
.limit(10)
.select('first_name', 'last_name')
.toArray(50);
gs.info(JSON.stringify(users));
출력:
[
{
"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"
}
]