主题
版本管理服务
字数统计: 2.6k 字
阅读时长: 约 5 分钟
当前版本: 4.29
版本管理简介
VersionManagementService 的目标是充分利用版本化功能。
它允许用户管理和控制地理空间数据的不同版本,从而确保地理数据库中的数据完整性和同步性。在协作环境中,当多个用户需要处理同一数据集而不发生冲突时,此功能特别有用。它提供了用于创建、编辑和协调版本的工具,以及撤消和重做编辑、协调冲突以及将更改应用到默认版本的工具。
列出可用版本
列出版本对于了解版本管理服务中的可用版本非常重要。利用 getVersionInfos 可以列出可用版本。该方法需要 ownerFilter
和 includeHidden
参数。此方法可根据所有者名称查询版本,如果查询为空,则返回所有版本。以下代码示例演示了如何使用 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);
这些方法返回 versionInfoExtended 和 versionInfo 对象。versionInfos 对象包含版本的基本信息,而 versionInfoExtended 包含版本的更多详细信息。查找默认版本信息很简单,在 VersionManagementService 类上使用 defaultVersionIdentifier 属性即可返回该信息。以下代码示例演示了如何获取 defaultVersionIdentifier。
js
const defaultVersionIdentifier = versionManagementService.defaultVersionIdentifier;
更改 UtilityNetwork 或 FeatureLayer 的版本
changeVersion 方法用于更改图层或网络的版本或时刻。此方法可将数据指定到某一个版本或者某个历史时刻。如果版本具有读或写锁定,则用户无法更改版本。更改版本的目的是查看/编辑特定版本。更改版本会遍历图层数组,将每个图层的fromVersion
更改为toVersion
。如果 web 地图包含公共设施网络,则也会对其进行相应更改。该方法的两个参数fromVersion
和toVersion
,分别代表要修改的版本和预期目标版本。这些参数的值可以是 Date
或VersionIdentifier
对象。 如果目标版本具有本地锁,则用户必须通过调用 stopEditing或stopReading 来清除锁定。当版本上存在锁时,必须在切换版本之前执行此操作。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 版本创建命名版本。该方法需要 versionName
、description
和 access
三个参数。access
访问权限的值可以是 private
、protected
、hidden
或 public
。创建版本的目的是为编辑者提供他们自己唯一的独立视图,以便同时处理相同的数据。以下代码示例演示了如何使用此方法创建新版本。
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 调用 startReading 和 startEditing 来获取。锁分别通过 REST 调用 stopReading 和 stopEditing 来释放。这些例程和其他例程 (包括 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
提供了一套全面的方法来管理版本和简化版本控制工作流。