Name

sn_aisearch_global.AisMigrationCommitter

Description

Commits all staged records under an AI Search migration record

Script

var AisMigrationCommitter = Class.create();
AisMigrationCommitter.prototype = {

  initialize: function(migrationSysID) {
      this.logger = new sn_aisearch_global.AisMigrationLogger(migrationSysID, 'Committer');
      this.sysIDLookup = {};
      this.migrationSysID = migrationSysID;
  },

  commitAll: function() {
      this.logger.info("Start committing staged records");
      this._commitStagedRecords();
  },

  _commitStagedRecords: function() {
      var migrationStagingGr = new GlideRecord('sn_aisearch_global_job_staging');
      migrationStagingGr.addQuery('state', 'accept');
      migrationStagingGr.addQuery('migration_orchestration', this.migrationSysID);
      migrationStagingGr.orderBy('sequence');
      migrationStagingGr.query();

      while (migrationStagingGr.next()) {
          var destinationTable = migrationStagingGr.getValue('table_name');
          var operation = migrationStagingGr.getValue('operation');

          this.logger.info("Commit staged records for table: " + destinationTable);

          var migrationStagingChangeGr = new GlideRecord('sn_aisearch_global_job_staging_change');
          migrationStagingChangeGr.addQuery('migration_staging_record', migrationStagingGr.getUniqueValue());
          migrationStagingChangeGr.query();

          if (operation == 'insert') {
              var sysIDOfDestinationRecord = this._insertChanges(migrationStagingChangeGr, destinationTable);
              this.sysIDLookup['sn_aisearch_global_job_staging_' + migrationStagingGr.getUniqueValue()] = sysIDOfDestinationRecord;

              migrationStagingGr.table_sys_id = sysIDOfDestinationRecord;
              migrationStagingGr.update();

              this._updateMigrationCompletionRecords(migrationStagingGr.getUniqueValue(), sysIDOfDestinationRecord);
          } else
              this._updateChanges(migrationStagingChangeGr, destinationTable, migrationStagingGr.getValue('table_sys_id'));
      }

  },

  _insertChanges: function(migrationStagingChangeGr, destinationTable) {
      var msg = "Insert record into table : " + destinationTable + " : ";
      var destinationGr = new GlideRecord(destinationTable);
      destinationGr.initialize();
      msg = 'Values: ' + this._populateRecord(migrationStagingChangeGr, destinationGr);
      this.logger.info(msg);

      //Handle dot_walk_fields type index source attributes
      if (destinationTable == 'ais_datasource_field_attribute' && destinationGr.attribute == '2d45349173101010170b56b80ff6a7c8') {
          var fieldAttr = new GlideRecord(destinationTable);
          fieldAttr.addQuery('datasource', destinationGr.datasource);
          fieldAttr.addQuery('attribute', destinationGr.attribute);
          fieldAttr.addQuery('field', destinationGr.field);
          fieldAttr.query();
          if (fieldAttr.next()) {
              var arr = fieldAttr.getValue('value').toString().split(',');
              if (arr.indexOf(destinationGr.getValue('value')) < 0) {
                  fieldAttr.value = fieldAttr.value + ',' + destinationGr.value;
                  fieldAttr.update();
              }
              return fieldAttr.sys_id;
          }
          return destinationGr.insert();
      }
      return destinationGr.insert();
  },

  _updateChanges: function(migrationStagingChangeGr, destinationTable, destinationSysID) {
      var msg = "Update record table : " + destinationTable + " sys_id : " + destinationSysID + " : ";
      var destinationGr = new GlideRecord(destinationTable);

      if (destinationSysID != null && destinationSysID.startsWith('sn_aisearch_global_job_staging_')) {

          if (this.sysIDLookup[destinationSysID] == null) {
              this.logger.info(msg);
              this.logger.error("Error in update. Expected to find a lookup for " + destinationSysID);
              return;
          }

          destinationSysID = this.sysIDLookup[destinationSysID];
      }
      if (!destinationGr.get(destinationSysID)) {
          this.logger.error("Update failed. Unable to find record with sys_id: " + destinationSysID + " in table: " + destinationTable);
          return;
      }

      msg = 'Values: ' + this._populateRecord(migrationStagingChangeGr, destinationGr);
      this.logger.info(msg);
      destinationGr.update();
  },

  _populateRecord: function(migrationStagingChangeGr, destinationGr) {
      var msg = "";

      while (migrationStagingChangeGr.next()) {
          var fieldName = migrationStagingChangeGr.getValue('field');
          var fieldValue = migrationStagingChangeGr.getValue('new_value');

          if (fieldValue != null && fieldValue.startsWith('sn_aisearch_global_job_staging_')) {
              fieldValue = this.sysIDLookup[fieldValue];

              if (fieldValue == null) {
                  this.logger.error("Error in insert. Expected to find a lookup for " + migrationStagingChangeGr.getValue('new_value'));
                  return;
              }

          }

          destinationGr.setValue(fieldName, fieldValue);
          msg = msg + " field: " + fieldName + " value: " + fieldValue + "\n";
      }
      return msg;
  },

  _updateMigrationCompletionRecords: function(stagingRecordSysID, destinationRecordID) {
      var completionGr = new GlideRecord('sn_aisearch_global_job_completion');
      completionGr.addQuery('destination_sys_id', 'sn_aisearch_global_job_staging_' + stagingRecordSysID);
      completionGr.query();

      while (completionGr.next()) {
          completionGr.setValue('destination_sys_id', destinationRecordID);
          completionGr.update();
      }
  },

  type: 'AisMigrationCommitter'
};

Sys ID

d5811e87b71101107f033307fe11a9e0

Offical Documentation

Official Docs: