[ServiceNow] GlideQueryを使ってみる

## GlideQueryとは
ITAMに含まれるServer APIですが、独立したPluginとしてインストール可能です。
たまたま見つけたのですが、GlideRecordよりも便利そうな気がしたので調べてみました。

### プラットフォーム
Paris

## GlideQueryの良い点

### コードがシンプルになる

コードをシンプルにして可読性が上がります。
C#のLINQに似ています。

```userquery.js
var gq = new GlideQuery('sys_user')
  .where('company.name',  '!=', '')
  .select('name', 'company$DISPLAY')
  .limit(5)
  .forEach(function (user) {
    gs.info(user.name + '@' + user.company$DISPLAY);
  });

/* 実行結果
*** Script: Lucius Bagnoli@ACME Japan
*** Script: Jimmie Barninger@ACME South America
*** Script: Melinda Carleton@ACME UK
*** Script: Jewel Agresta@ACME UK
*** Script: Sean Bonnet@ACME North America
*/

```

### Fail Fast
GlideRecordではクエリが間違っていても実行されますが、GlideQueryはエラーがあったらそこで止まります。

```gliderecord.js
var gr = new GlideRecord('sys_user');
gr.addQuery('activate', false); //正しくは'active'
gr.query();
while(gr.next()){
  gs.info(gr.name);
}
```
![GlideRecordError.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/a246ab4d-293d-f05f-4eb4-59ec2107708f.jpeg)
GlideRecordもエラーは出るのですが、、
そのまま誤ったクエリを実行してしまいます。
![GlideRecordError2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/3d26100b-ec9a-96dc-d73a-dbdec0aa1fee.jpeg)

GlideQueryの場合、エラーを返して止まります。
誤った更新や削除が避けられそうです。

```glidequery.js
var gq = new GlideQuery('sys_user')
  .where('activate',  false)
  .select('name')
  .forEach(function (user) {
    gs.info(user.name);
  });
```
![QlideQueryError.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/c3d4d5b9-edbb-86db-f1d9-dee8aa988f50.jpeg)


## 使い方

ScriptインクルードにGlideQueryがあるか確認します。
現在はPlatformの機能ではないため、ITAMを使用していない場合はないと思います。

![ScriptIncludes.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/beb02dba-d33e-4656-ae5e-d7bfc2eaa6f6.jpeg)

GlideQueryが存在しなければ、プラグインをインストールします。

![GlideQueryPlugin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/be049421-f16c-224c-6ba9-d6901a41940c.jpeg)

## 参考
https://developer.servicenow.com/dev.do#!/reference/api/paris/server/no-namespace/GlideQueryAPI

https://www.snow-adventures.com/blog/2020-06-10-overview-of-glidequery/

## おまけ
いくつか試して見たサンプル

### レコードの存在チェック
```checkexist.js
var isExist = new GlideQuery('sys_user')
  .where('first_name', 'Lucius')
  .selectOne()
  .isPresent();
gs.info(isExist);
```

### レコードの挿入
```insertuser.js
var hoge = new GlideQuery('sys_user')
  .insert({
    first_name: 'First',
    last_name: 'Last',
    email: 'hoge@example.com'
  })
  .get();
gs.info(JSON.stringify(hoge));
```
![InsertLog.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/193189e4-1d24-fc26-e203-f6e7cbdebefa.jpeg)

![InsertedUser.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/bdd07cfc-9cfe-f08d-3dd3-6e77915cc6d2.jpeg)

### レコードの一括更新

```updatemultiple.js
var gq = new GlideQuery('sys_user')
  .where('company.name',  '!=', '')
  .limit(3)
  .updateMultiple({ active: false });
```
![DeactivateLog.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/5e9c70e1-26ce-cfd7-c4cc-54beab459bac.jpeg)

![DeactivatedUsers.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/783e3125-d4c0-e150-8e55-c0bce7dfd817.jpeg)