版本管理服务

字数统计: 2.6k
阅读时长: 约 5 分钟
当前版本: 4.29

版本管理简介

VersionManagementService 的目标是充分利用版本化功能。

它允许用户管理和控制地理空间数据的不同版本,从而确保地理数据库中的数据完整性和同步性。在协作环境中,当多个用户需要处理同一数据集而不发生冲突时,此功能特别有用。它提供了用于创建、编辑和协调版本的工具,以及撤消和重做编辑、协调冲突以及将更改应用到默认版本的工具。

列出可用版本

列出版本对于了解版本管理服务中的可用版本非常重要。利用 getVersionInfos 可以列出可用版本。该方法需要 ownerFilterincludeHidden 参数。此方法可根据所有者名称查询版本,如果查询为空,则返回所有版本。以下代码示例演示了如何使用 getVersionInfos 列出版本。

js
    // Will get versions owned by publisher1.
    const versionInfos = await versionManagementService.getVersionInfos({
        ownerFilter: "publisher1",
        includeHidden: true
    });

要获取所有可用版本,只需调用 getVersionInfos 方法而无需传递参数。以下代码示例演示了如何使用 getVersionInfos 获取版本信息。

js
    const versions = await versionManagementService.getVersionInfos(); // Will list all available versions in service.

调用 getVersionInfos 只返回每个版本的基本信息。要获取有关版本的扩展信息,例如当前服务器锁或冲突,则应使用 getVersionInfosExtended 方法。以下代码示例演示了如何使用 getVersionInfosExtended 获取版本信息。

js
    versionIdentifier = {
        guid: "{422D1B63-D795-4478-A4B1-AD6109377075}",
        name: "versionOwner.versionName"
    }
    const versionInfoExtended = await versionManagementService.getVersionInfoExtended(versionIdentifier);

这些方法返回 versionInfoExtendedversionInfo 对象。versionInfos 对象包含版本的基本信息,而 versionInfoExtended 包含版本的更多详细信息。查找默认版本信息很简单,在 VersionManagementService 类上使用 defaultVersionIdentifier 属性即可返回该信息。以下代码示例演示了如何获取 defaultVersionIdentifier。

js
    const defaultVersionIdentifier = versionManagementService.defaultVersionIdentifier;

更改 UtilityNetwork 或 FeatureLayer 的版本

changeVersion 方法用于更改图层或网络的版本时刻。此方法可将数据指定到某一个版本或者某个历史时刻。如果版本具有读或写锁定,则用户无法更改版本。更改版本的目的是查看/编辑特定版本。更改版本会遍历图层数组,将每个图层的fromVersion更改为toVersion。如果 web 地图包含公共设施网络,则也会对其进行相应更改。该方法的两个参数fromVersiontoVersion,分别代表要修改的版本和预期目标版本。这些参数的值可以是 DateVersionIdentifier对象。 如果目标版本具有本地锁,则用户必须通过调用 stopEditingstopReading 来清除锁定。当版本上存在锁时,必须在切换版本之前执行此操作。getLockType 方法可用于确认版本是否具有本地 read/edit 锁。

以下代码示例演示了如何更改两个 FeatureLayers 的版本。

js
    const layer0 = new FeatureLayer({url: `https://sampleserver6.myhost.cn/geoscene/rest/services/servicename/FeatureServer/0`});
    const layer1 = new FeatureLayer({url: `https://sampleserver6.myhost.cn/geoscene/rest/services/servicename/FeatureServer/1`});
    const layers = [layer0, layer1];
    await versionManagementService.changeVersion(
        layers, // a webmap can also be passed here or a UtilityNetwork
        { name: layer0.gdbVersion, guid: "{BD3F4817-9A00-41AC-B0CC-58F78DBAE0A1}"}, // pass current layer gdbVersion and current guid of version
        { name: version.name, guid: version.guid } // pass an incoming version name and incomming version guid.
    );

创建和删除版本

createVersion 方法用于根据 DEFAULT 版本创建命名版本。该方法需要 versionNamedescriptionaccess三个参数。access访问权限的值可以是 privateprotectedhiddenpublic。创建版本的目的是为编辑者提供他们自己唯一的独立视图,以便同时处理相同的数据。以下代码示例演示了如何使用此方法创建新版本。

js
    await versionManagementService.createVersion({
        versionName: "versionOwner.versionName",
        description: "my New Version",
        access: "public"
    });

deleteVersion 方法用于删除已命名版本。删除版本的目的是移除不再需要或不再使用的版本。删除不必要的版本有助于清理和组织数据,使其更高效、更易于管理。这通常是在用户完成编辑并将其更改发布到默认版本后完成的。删除未使用的版本有助于保持系统井然有序。它还能确保仅保留相关的最新版本。该方法需要一个 versionIdentifier,这是一个包含版本名称和 guid 的对象。以下代码示例演示了如何删除现有版本。

js
    await versionManagementService.deleteVersion({
        name: "versionOwner.versionName",
        guid: "{BD3F4817-9A00-41AC-B0CC-58F78DBAE0A1}"
    });

更改版本

alterVersion 方法允许用户更改版本的名称、描述和访问权限。以下代码示例演示了如何将版本的所有权传递给另一个用户,并修改版本名称和访问权限、描述。

js
    await versionManagementService.alterVersion({
        name: "versionOwner.versionName", // current version name
        guid: "{49C6AC87-CDA8-46D4-A79B-449105981209}"
    }, // versionIdentifier
    {
        versionName: "newVersionName", // parameter to alter version name
        ownerName: "newOwner",
        description: "newDescription",
        access: "public"
    });

编辑版本

在没有编辑会话的情况下编辑版本

用户可以在没有编辑会话的情况下编辑版本,但这样做,编辑内容会立即提交到数据库,无法还原更改,缺乏读取一致性。一旦在没有编辑会话的情况下执行编辑,就无法恢复。恢复编辑的唯一方法是执行新的编辑,覆盖初始编辑。此类编辑可通过调用 applyEdits 来完成,而无需先调用开始编辑

使用“保存”和“还原”编辑版本

在会话中进行编辑时,可以使用共享锁和独占锁。这些锁分别通过 REST 调用 startReadingstartEditing 来获取。锁分别通过 REST 调用 stopReadingstopEditing 来释放。这些例程和其他例程 (包括 applyEdits) 都需要会话 ID 参数,该参数需要在客户端生成,并在持有锁时使用。当持有共享锁时,其他用户无法获取独占锁,反之,独占锁也会阻止共享锁。简单地说,读取会阻止书写,书写也会阻止读取。在编辑会话期间,用户可以在调用 stopEditing 后保存编辑内容,或者也可选择不保存编辑内容。此功能非常重要,因为它允许用户在改变主意并决定不保留更改时轻松放弃编辑。通过调用带有不保存编辑选项的 stopEditing 方法,用户可以方便地恢复到原始版本,而无需永久更改内容。开始会话和结束会话的方法需要 versionIdentifier 参数,用于指定启动或结束编辑会话的版本。

js
    await versionManagementService.startReading(version);
    await versionManagementService.startEditing(version);
    featureService.applyEdits(...); // now perform an applyEdits call
    await versionManagementService.stopEditing(version, true); // if false edits will be discarded
    await versionManagementService.stopReading(version); // all locks will be cleared

使用“撤消”和“恢复”编辑版本

撤消恢复功能允许用户轻松恢复或重做所做的更改。在处理可能发生错误的复杂项目或尝试不同配置时,此功能特别有用。使用撤消选项,用户可以回溯编辑历史记录并将更改恢复到以前的状态,从而有效地撤消所做的任何修改。相反,恢复选项允许用户重新应用以前撤消的更改。此功能为用户提供了灵活性,确保他们可以轻松纠正错误或探索不同的操作,而不必担心丢失数据。编辑操作堆栈可保存每个操作的编辑时刻。撤消在堆栈中向后移动。恢复在堆栈中向前移动

js
    await versionManagementService.startReading(version);
    await versionManagementService.startEditing(version);
    featureService.applyEdits(...); // now perform an applyEdits call
    await versionManagementService.undo(version); // undos edits
    await versionManagementService.redo(version); // redos edits

协调和提交

reconcile方法可比较编辑版本 (例如命名版本) 和目标版本 (默认版本),以查找两者之间的冲突。reconcile方法要求您是当前编辑版本的唯一用户,并且在整个协调过程中一直保持这种状态,直到保存或发布编辑内容。您必需对在要编辑的版本中修改的所有要素类具有完全权限。此方法将检测命名版本和默认版本之间的差异,并将这些差异标记为冲突。这将使用自上次协调 (或版本创建) 以来对默认版本所做的编辑来更新版本。协调有助于检测在多个用户编辑相同要素或属性时可能出现的冲突。它通过以受控和系统的方式应用更改来确保数据的完整性和一致性。以下代码示例演示了如何对版本执行协调。

js
    const reconcileResult = await versionManagementService.reconcile(
        versionIdentifier,
        {
            abortIfConflicts: true,
            conflictDetection: "by-object",
            withPost: false
        }
    );

post方法用于将对命名版本所做的编辑应用于默认版本。该方法在协调和解决冲突后使用。必须在发布前执行协调操作。通过发布编辑内容,在版本中所做的更改将永久应用于默认版本,从而确保地理数据库中的数据一致性和同步性。以下代码示例演示了如何对版本执行post操作。

js
const postResult = await versionManagementService.post(versionIdentifier);

结束语

VersionManagementService 类是一个功能强大的工具,用于管理使用命名版本化数据集的要素服务。它提供了一系列功能来创建、删除、更改和变更版本,以及启动/停止读取和编辑、协调、发布和获取版本信息。VersionManagementService 提供了一套全面的方法来管理版本和简化版本控制工作流。