@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 10.3 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import{_ as e}from"../chunks/tslib.es6.js";import{fetchAndConvertSerializedKnowledgeIdMap as t,serializeInclusionDefinitionToIdCollectionsMapPbf as i}from"../applications/KnowledgeStudio/resourceSerializationUtils.js";import o from"../core/Collection.js";import s from"../core/Error.js";import a from"../core/Logger.js";import{getOrCreateMapValue as r}from"../core/MapUtils.js";import{MultiOriginJSONMixin as n}from"../core/MultiOriginJSONSupport.js";import{throwIfAbortError as p}from"../core/promiseUtils.js";import{watch as l,sync as d}from"../core/reactiveUtils.js";import{isAbsolute as h,join as y}from"../core/urlUtils.js";import{generateUUID as c}from"../core/uuid.js";import{property as m}from"../core/accessorSupport/decorators/property.js";import"../core/has.js";import"../core/RandomLCG.js";import{reader as u}from"../core/accessorSupport/decorators/reader.js";import{subclass as f}from"../core/accessorSupport/decorators/subclass.js";import{writer as g}from"../core/accessorSupport/decorators/writer.js";import{OriginId as w,idToName as b,nameToId as M}from"../core/accessorSupport/PropertyOrigin.js";import T from"./Layer.js";import{KnowledgeGraphLayerDataManager as S}from"./knowledgeGraph/KnowledgeGraphLayerDataManager.js";import _ from"./knowledgeGraph/KnowledgeGraphSublayer.js";import{initializeLayersFromClientData as L}from"./knowledgeGraph/layerUtils.js";import{ArcGISService as D}from"./mixins/ArcGISService.js";import{BlendLayer as j}from"./mixins/BlendLayer.js";import{CustomParametersMixin as v}from"./mixins/CustomParametersMixin.js";import{OperationalLayer as k}from"./mixins/OperationalLayer.js";import{PortalLayer as A}from"./mixins/PortalLayer.js";import{RefreshableLayer as G}from"./mixins/RefreshableLayer.js";import{ScaleRangeLayer as E}from"./mixins/ScaleRangeLayer.js";import{url as C}from"./support/commonProperties.js";import{fetchKnowledgeGraph as I}from"../rest/knowledgeGraphService.js";import{f as N,t as R}from"../chunks/persistableUrlUtils.js";let U=class extends(j(E(G(D(k(A(n(v(T))))))))){constructor(e){super(e),this._graphTypeLookup=new Map,this._namedTypesModified=!1,this.dataManager=null,this.definitionSetMap=null,this.knowledgeGraph=null,this.layers=new(o.ofType(_)),this.memberEntityTypes=null,this.memberRelationshipTypes=null,this.operationalLayerType="KnowledgeGraphLayer",this.sublayerIdsCache=new Map,this.tables=new(o.ofType(_)),this.type="knowledge-graph",this.url=null,this.addHandles(l((()=>this.layers.concat(this.tables)),((e,t)=>this._handleSublayersChange(e,t)),d))}load(e){return this.addResolvingPromise(this._doLoad(e)),Promise.resolve(this)}async _doLoad(e){try{await this.loadFromPortal({supportedTypes:["Knowledge Graph Layer"]},e)}catch(t){p(t)}await this._fetchMetadata(),await this._initializeLayerProperties(),this.loadLayerAssumingLocalCache(),this._layersLoadedFromAuthoritativeItem()||await L(this)}async _fetchMetadata(){if(!this.url)throw new s("knowledge-graph:missing-url","KnowledgeGraphLayer must be created with a url");const e=await I(this.url);this.knowledgeGraph=e,this._forEachGraphType((e=>{e.name&&this._graphTypeLookup.set(e.name,e)}))}async _initializeLayerProperties(){this.originIdOf("inclusionModeDefinition")===w.USER?this._validateInclusionModeDefinition():await this._initializeInclusionModeDefinition(),this._setMemberTypes(),this.dataManager=new S({knowledgeGraph:this.knowledgeGraph,inclusionModeDefinition:this.inclusionModeDefinition})}async _initializeInclusionModeDefinition(){const e=this.definitionSetMap?await t(this.definitionSetMap,!0):{generateAllSublayers:!0,namedTypeDefinitions:new Map};[...this.layers.toArray(),...this.tables.toArray()].forEach((t=>{const i=this._graphTypeLookup.get(t.graphTypeName);i&&!e.namedTypeDefinitions.has(i.name)&&e.namedTypeDefinitions.set(i.name,{useAllData:!0})})),this.setAtOrigin("inclusionModeDefinition",e,b(this.originIdOf("definitionSetMap")))}_validateInclusionModeDefinition(){const{inclusionModeDefinition:e}=this;if(!e)return;const{namedTypeDefinitions:t}=e;if(t?.size>0)t.forEach(((e,i)=>{const o=this._graphTypeLookup.get(i);if(!o)return a.getLogger(this).warn(`A named type, ${i}, was in the inclusion list that wasn't in the data model and will be removed`),void t.delete(i);"relationship"!==o.type&&"entity"!==o.type&&(a.getLogger(this).warn(`A named type, ${i}, was in the inclusion list that wasn't properly modeled and will be removed`),t.delete(i))}));else if(!e.generateAllSublayers)throw new s("knowledge-graph:composite-layer-constructor","If an explicit inclusion definition is defined, at least one namedTypeDefinition must also be defined")}_setMemberTypes(){let e=[],t=[];const{inclusionModeDefinition:i}=this,o=i?.namedTypeDefinitions;!i||i.generateAllSublayers?(e=this.knowledgeGraph.dataModel?.entityTypes??[],t=this.knowledgeGraph.dataModel?.relationshipTypes??[]):o&&o.size>0&&o.forEach(((i,o)=>{const s=this._graphTypeLookup.get(o);switch(s?.type){case"relationship":t.push(s);break;case"entity":e.push(s)}})),this.memberEntityTypes=e,this.memberRelationshipTypes=t}_forEachGraphType(e){[...this.knowledgeGraph.dataModel?.entityTypes??[],...this.knowledgeGraph.dataModel?.relationshipTypes??[]].forEach((t=>{e(t)}))}_refreshNamedTypes(){this._namedTypesModified=!0;for(const e of this.layers)e.emit("refresh",{dataChanged:!0});for(const e of this.tables)e.emit("refresh",{dataChanged:!0})}async _handleNewRecords(e){const t=[];this.dataManager.addToLayer(e);for(const i of e)this.sublayerIdsCache.has(i.typeName)||(this.sublayerIdsCache.set(i.typeName,new Set),t.push(i.typeName)),this.sublayerIdsCache.get(i.typeName).add(i.id);for(const i of t){const e=this._graphTypeLookup.get(i);e&&(this._addSublayer(e),"entity"===e.type?this.dataManager.entityTypeNames.add(i):this.dataManager.relationshipTypeNames.add(i),this.dataManager.sublayerCaches.set(i,new Map))}await L(this,t),this._refreshNamedTypes()}_createSublayers(e,t,i){e.forEach((e=>{const o=this._createSublayer(e);i(o)&&t.push(o),this._updateSublayerCaches(e)}))}_addSublayer(e){const t=this._createSublayer(e);return t.geometryType?this.layers.push(t):this.tables.push(t),t}_createSublayer(e){return new _({objectType:e,parentCompositeLayer:this,graphType:e.type})}_updateSublayers(e,t){t.forEach((t=>{t.parentCompositeLayer=this;const i=e.find((e=>e.type===t.graphType&&e.name===t.graphTypeName));i&&(t.objectType=i,this._updateSublayerCaches(i))}))}_updateSublayerCaches(e){const t=this.dataManager.sublayerCaches;t.has(e.name)||t.set(e.name,new Map)}_saveUrlAsNewResource(e,t,i,o){e[t]="<pending>",i.pendingOperations.push(x(this.inclusionModeDefinition).then((s=>{const a=P(o);e[t]=a.itemRelativeUrl,i.toAdd.push({resource:a,content:{type:"blob",blob:s},compress:!1,finish:e=>{this.definitionSetMap=e.url}})})))}_displaysAllRecords(e){for(const[,{useAllData:t}]of e.namedTypeDefinitions)if(!t)return!1;return!0}_handleSublayersChange(e,t){t&&(t.forEach((e=>{e.parent=null})),this.removeHandles("sublayers-owner")),e&&(e.forEach((e=>{e.parent=this})),this.addHandles([e.on("after-add",(({item:e})=>{e.parent=this})),e.on("after-remove",(({item:e})=>{e.parent=null}))],"sublayers-owner"))}_layersLoadedFromAuthoritativeItem(){const e=this.originIdOf("layers");return e>=w.PORTAL_ITEM&&e<w.USER}readDefinitionSetMap(e,t,i){return N(e,i)}writeDefinitionSetMap(e,t,i,o){const s=o?.portalItem,a=o?.resources,r=M(o?.origin);if(!s||!a||null==r)return void(e&&(t[i]=R(e,o)));const{inclusionModeDefinition:n}=this;if(!n||this._displaysAllRecords(n))return void(this.definitionSetMap=null);const p=this.originIdOf("inclusionModeDefinition");if(p===w.USER||this._namedTypesModified||r<p)this._saveUrlAsNewResource(t,i,a,s);else if(r===p&&e){const r=R(e,o);h(r)?this._saveUrlAsNewResource(t,i,a,s):t[i]=r}}set inclusionModeDefinition(e){"loaded"!==this.loadStatus&&"failed"!==this.loadStatus?this._set("inclusionModeDefinition",e):a.getLogger(this).error("#inclusionModeDefinition","inclusionModeDefinition cannot be changed after the layer is loaded.")}loadLayerAssumingLocalCache(){const e=[...this.memberEntityTypes,...this.memberRelationshipTypes];this.originIdOf("layers")===w.DEFAULTS?this._createSublayers(e,this.layers,(e=>!!e.geometryType)):this._updateSublayers(e,this.layers),this.originIdOf("tables")===w.DEFAULTS?this._createSublayers(e,this.tables,(e=>!e.geometryType)):this._updateSublayers(e,this.tables),this.dataManager.inclusionModeDefinition?.namedTypeDefinitions?.forEach(((e,t)=>{const i=r(this.sublayerIdsCache,t,(()=>new Set));e.members?.forEach((e=>{i.add(e.id)}))}))}async addRecords(e){await this.load(),await this._handleNewRecords(e)}async removeRecords(e){await this.load();const t=[];for(const i of e)!1===this.dataManager.inclusionModeDefinition?.namedTypeDefinitions?.get(i.typeName)?.useAllData&&this.dataManager.inclusionModeDefinition?.namedTypeDefinitions?.get(i.typeName)?.members?.has(i.id)&&t.push(i);this.dataManager.removeFromLayer(t);for(const i of t)this.sublayerIdsCache.get(i.typeName)?.delete(i.id);return this._refreshNamedTypes(),t}};e([m()],U.prototype,"dataManager",void 0),e([m({json:{write:{ignoreOrigin:!0,writerEnsuresNonNull:!0}}})],U.prototype,"definitionSetMap",void 0),e([u("definitionSetMap")],U.prototype,"readDefinitionSetMap",null),e([g("definitionSetMap")],U.prototype,"writeDefinitionSetMap",null),e([m()],U.prototype,"inclusionModeDefinition",null),e([m()],U.prototype,"knowledgeGraph",void 0),e([m({type:o.ofType(_),json:{write:{ignoreOrigin:!0}}})],U.prototype,"layers",void 0),e([m()],U.prototype,"memberEntityTypes",void 0),e([m()],U.prototype,"memberRelationshipTypes",void 0),e([m({type:["KnowledgeGraphLayer"]})],U.prototype,"operationalLayerType",void 0),e([m()],U.prototype,"sublayerIdsCache",void 0),e([m({type:o.ofType(_),json:{write:{ignoreOrigin:!0}}})],U.prototype,"tables",void 0),e([m({json:{read:!1}})],U.prototype,"type",void 0),e([m(C)],U.prototype,"url",void 0),U=e([f("esri.layers.KnowledgeGraphLayer")],U);const O=U;async function x(e){const t=await i(e);return new Blob([t],{type:"application/x-protobuf"})}function P(e){const t=`definitionSetMap-${c()}.dat`,i=y("knowledgeGraphLayer",t);return e.resourceFromPath(i)}export{O as default};