// All material copyright Esri, All Rights Reserved, unless otherwise specified. // See https://js.arcgis.com/4.30/esri/copyright.txt for details. //>>built define("exports ../../chunks/tslib.es6 ../../geometry ../../core/Accessor ../../core/Error ../../core/Logger ../../core/MapUtils ../../core/sql ../../core/accessorSupport/decorators/property ../../core/has ../../core/RandomLCG ../../core/accessorSupport/decorators/subclass ../../geometry/Polygon ../../geometry/projection ../../geometry/support/spatialReferenceUtils ./SessionMemoryStorage ./supportUtils ../../rest/knowledgeGraphService ../../rest/knowledgeGraph/GraphQueryStreaming ../../rest/support/Query ../../geometry/Extent".split(" "), function(t,z,V,P,H,K,C,O,B,W,X,Q,R,L,M,N,S,I,D,T,U){t.KnowledgeGraphLayerDataManager=class extends P{constructor(b){super(b);this._processingCacheUpdatesLookup=new Map;this.knowledgeGraph=null;this.inclusionModeDefinition={generateAllSublayers:!0,namedTypeDefinitions:new Map};this.entityTypeNames=new Set;this.relationshipTypeNames=new Set;this.geographicLookup=new Map;this.sublayerCaches=new Map;this.nodeConnectionsLookup=new Map;this.relationshipConnectionsLookup=new Map;this.memberIdTypeLookup= new Map;const a=new Map;b.knowledgeGraph.dataModel.entityTypes?.forEach(e=>{e.name&&(a.set(e.name,"entity"),this._processingCacheUpdatesLookup.set(e.name,[]),b.inclusionModeDefinition&&!b.inclusionModeDefinition?.generateAllSublayers||this.entityTypeNames.add(e.name),e.properties?.forEach(c=>{c.geometryType&&"esriGeometryNull"!==c.geometryType&&this.geographicLookup.set(e.name,{name:c.name??"",geometryType:c.geometryType})}))});b.knowledgeGraph.dataModel.relationshipTypes?.forEach(e=>{e.name&&(a.set(e.name, "relationship"),this._processingCacheUpdatesLookup.set(e.name,[]),b.inclusionModeDefinition&&!b.inclusionModeDefinition?.generateAllSublayers||this.relationshipTypeNames.add(e.name),e.properties?.forEach(c=>{c.geometryType&&"esriGeometryNull"!==c.geometryType&&this.geographicLookup.set(e.name,{name:c.name??"",geometryType:c.geometryType})}))});b.inclusionModeDefinition?.namedTypeDefinitions.forEach((e,c)=>{if("entity"===a.get(c))this.entityTypeNames.add(c);else if("relationship"===a.get(c))this.relationshipTypeNames.add(c); else{K.getLogger(this).warn(`A named type, ${c}, was in the inclusion list that wasn't in the data model and will be removed`);b.inclusionModeDefinition?.namedTypeDefinitions.delete(c);return}const n=new Map;e.members?.forEach(p=>{C.getOrCreateMapValue(this.memberIdTypeLookup,p.id,()=>new Set).add(c);const l=this.getById(p.id);l&&n.set(p.id,l)});this.sublayerCaches.set(c,n)})}addToLayer(b){b.forEach(({typeName:a,id:e})=>{if(!this.inclusionModeDefinition)throw new H("knowledge-graph:layer-data-manager", "You cannot add to a layer's exclusion list if it was not created with an exclusion list originally");if(this.inclusionModeDefinition.namedTypeDefinitions.has(a))this.inclusionModeDefinition.namedTypeDefinitions.has(a)&&(c=this.inclusionModeDefinition.namedTypeDefinitions.get(a),c.members||(c.members=new Map),c.members.set(e,{id:e}),C.getOrCreateMapValue(this.memberIdTypeLookup,e,()=>new Set).add(a));else{var c=new Map;c.set(e,{id:e});this.inclusionModeDefinition.namedTypeDefinitions.set(a,{useAllData:!1, members:c});C.getOrCreateMapValue(this.memberIdTypeLookup,e,()=>new Set).add(a)}})}getById(b){return N.getInstance().readFromStoreById(b)}async getData(b,a,e){if(a.objectType.name&&this.inclusionModeDefinition?.namedTypeDefinitions&&0{this.relationshipTypeNames.has(a.objectType.name)?l.geometry=c.relationshipLinkChartDiagramLookup.get(l.attributes[a.objectIdField]):l.geometry=c.entityLinkChartDiagramLookup.get(l.attributes[a.objectIdField]);l.attributes.ESRI__LAYOUT_GEOMETRY=l.geometry; p.push(l)});return p}return this.retrieveDataFromService(b,a,e)}async getConnectedRecordIds(b,a){const e=[];let c="";const n=[],p=new Map;b.forEach(l=>{if(this.memberIdTypeLookup.has(l))for(const u of this.memberIdTypeLookup.get(l)){if(!this.entityTypeNames.has(u))break;p.has(u)?p.get(u)?.push(l):p.set(u,[l])}});if(a&&0!==a?.length){for(const l of a)c=c+l+"|";c=c.slice(0,-1)}p.forEach((l,u)=>{let d;d=a&&0!==a?.length?`MATCH (n:${u})-[r:${c}]-(m) WHERE id(n) IN $ids RETURN id(r), type(r), id(m), labels(m)[0]`: `MATCH (n:${u})-[r]-(m) WHERE id(n) IN $ids RETURN id(r), type(r), id(m), labels(m)[0]`;u=new Promise(f=>{(async()=>{const m=(await I.executeQueryStreaming(this.knowledgeGraph,new D({openCypherQuery:d,bindParameters:{ids:l}}))).resultRowsStream.getReader();try{for(;;){const {done:h,value:r}=await m.read();if(h)break;for(let g=0;g{f()})});n.push(u)});this.refreshCacheContent();await Promise.all(n);return e}async getAttachedRelationships(b,a){const e=[];b=(await I.executeQueryStreaming(this.knowledgeGraph,new D({openCypherQuery:"MATCH (n)-[r]-\x3e(m) WHERE id(n) IN $nodeIds AND id(m) in $nodeIds AND NOT id(r) IN $relationshipExclusionIds return id(r), type(r)",bindParameters:{nodeIds:b,relationshipExclusionIds:a}}))).resultRowsStream.getReader();try{for(;;){const {done:c,value:n}=await b.read(); if(c)break;for(a=0;a{d.name&&u.set(d.name,d)});this.knowledgeGraph.dataModel.relationshipTypes?.forEach(d=>{d.name&&u.set(d.name,d)});b||this.inclusionModeDefinition?b?b.forEach(d=>{if(this.memberIdTypeLookup.has(d))for(const f of this.memberIdTypeLookup.get(d))l.has(f)? l.get(f)?.push(d):l.set(f,[d])}):this.inclusionModeDefinition?.namedTypeDefinitions?.forEach((d,f)=>{d.useAllData?l.set(f,null):d.members&&d.members.forEach(m=>{l.has(f)&&null!==l.get(f)?l.get(f)?.push(m.id):l.set(f,[m.id])})}):(this.knowledgeGraph.dataModel.entityTypes?.forEach(d=>{d.name&&l.set(d.name,null)}),this.knowledgeGraph.dataModel.entityTypes?.forEach(d=>{d.name&&l.set(d.name,null)}));for(const [d,f]of l)b=new Promise(m=>{(async()=>{const h=new Set,r=[];let g="",q=!1;a||u.get(d)?.properties?.forEach(w=> {w.name&&h.add(w.name)});if(e&&this.geographicLookup.has(d)){var x=this.geographicLookup.get(d)?.name;x&&h.add(x)}if(this.entityTypeNames.has(d))g=`MATCH (n:${d}) ${f?"WHERE id(n) IN $ids ":""}return ID(n)`,h.forEach(w=>{g+=`, n.${w}`;r.push(w)});else if(this.relationshipTypeNames.has(d))q=!0,g=`MATCH ()-[n:${d}]->() ${f?"WHERE id(n) IN $ids ":""}return ID(n), id(startNode(n)), id(endNode(n))`,h.forEach(w=>{g+=`, n.${w}`;r.push(w)});else throw new H("knowledge-graph:layer-data-manager",`The graph type of ${d} could not be determined. Was this type set in the KG data model and inclusion definition?`); x=f?new D({openCypherQuery:g,bindParameters:{ids:f}}):new D({openCypherQuery:g});for(x=(await I.executeQueryStreaming(this.knowledgeGraph,x)).resultRowsStream.getReader();;){const {done:w,value:E}=await x.read();if(w)break;var F=[];for(let v=0;vnew Set).add(y.id),C.getOrCreateMapValue(this.nodeConnectionsLookup, y.destinationId,()=>new Set).add(y.id),C.getOrCreateMapValue(this.relationshipConnectionsLookup,y.id,()=>[y.originId,y.destinationId]));for(;A{k?.set(v.attributes.ESRI__ID,v);c&&!this.inclusionModeDefinition?.namedTypeDefinitions.get(d).members.has(v.attributes.ESRI__ID)&&(this.inclusionModeDefinition?.namedTypeDefinitions.get(d).members.set(v.attributes.ESRI__ID,{id:v.attributes.ESRI__ID}),C.getOrCreateMapValue(this.memberIdTypeLookup,v.attributes.ESRI__ID,()=>new Set).add(d))})}})().then(()=>{m(null)})}),p.push(b), this._processingCacheUpdatesLookup.get(d)?.push(b);await Promise.all(p)}removeFromLayer(b){const a=new Set,e=new Set(b.map(c=>c.id));for(const c of b)a.add(c.typeName),1===this.memberIdTypeLookup.get(c.id)?.size?this.memberIdTypeLookup.delete(c.id):this.memberIdTypeLookup.get(c.id)?.delete(c.typeName),this.inclusionModeDefinition?.namedTypeDefinitions.forEach((n,p)=>{p===c.typeName&&n.members?.has(c.id)&&n.members.delete(c.id)});a.forEach(c=>{this.sublayerCaches.get(c)?.forEach((n,p)=>{e.has(p)&& this.sublayerCaches.get(c)?.delete(p)})})}async retrieveDataFromService(b,a,e){const c=N.getInstance(),n=new Set,p=[];let l="",u=[];const d="relationship"===a.graphType;var f=this.inclusionModeDefinition?.namedTypeDefinitions?.get(a.objectType.name)?.useAllData,m=a.parentCompositeLayer.sublayerIdsCache.get(a.objectType.name);f=!f&&m?Array.from(m).sort():null;if(this.inclusionModeDefinition?.namedTypeDefinitions?.get(a.objectType.name)?.useAllData)this.inclusionModeDefinition?.namedTypeDefinitions?.get(a.objectType.name)?.useAllData&& null!=b.objectIds&&(f=b.objectIds);else if(null!=b.objectIds&&f&&0g.includes(q))}else if(null!=b.objectIds)f=b.objectIds;else{if(this.inclusionModeDefinition?.namedTypeDefinitions.has(a.objectType.name)&&(!this.inclusionModeDefinition.namedTypeDefinitions.get(a.objectType.name)?.members||1>this.inclusionModeDefinition.namedTypeDefinitions.get(a.objectType.name)?.members?.size))return b.objectIds=[],[];b.objectIds=f}null!=b.outFields&&(m=b.outFields, m.includes("*")?a.fields.forEach(g=>{n.add(g.name)}):m.forEach(g=>{"ESRI__ID"!==g&&g!==a.geometryFieldName&&n.add(g)}));if(null!=b.geometry){var h=b.geometry;m=a.parentCompositeLayer.dataManager.knowledgeGraph.serviceDefinition;f=m?.spatialReference;var r=m?.serviceCapabilities?.geometryCapabilities;m=r?.geometryMaxBoundingRectangleSizeX;r=r?.geometryMaxBoundingRectangleSizeY;h?.extent?.spatialReference&&!h.spatialReference?.isWGS84?(await L.initializeProjection(h.extent.spatialReference,M.wgs84), h=L.project(h.extent,M.wgs84)):h=h.extent;if(m&&r&&f){4326!==f.wkid&&(f=new U({spatialReference:f,xmax:m,ymax:r}),f=L.project(f,M.wgs84),m=f.xmax,r=f.ymax);if(h.xmax-h.xmin>m)throw new H("knowledge-graph:layer-data-manager",`Extent x bounds should be within ${m}\u00b0 latitude, limit exceeded`);if(h.ymax-h.ymin>r)throw new H("knowledge-graph:layer-data-manager",`Extent y bounds should be within ${r}\u00b0 longitude, limit exceeded`);}if(null!=b.where&&"1\x3d1"!==b.where){const g=await O.parseWhereClause(b.where.toUpperCase(), a.fieldsIndex);a.fields.forEach(q=>{g.fieldNames.includes(q.name)&&n.add(q.name)})}l=d?`Match ()-[n:${a.objectType.name}]->() WHERE esri.graph.ST_Intersects($param_filter_geom, n.${a.geometryFieldName}) return ID(n), id(startNode(r)), id(endNode(r))`:`Match (n:${a.objectType.name}) WHERE esri.graph.ST_Intersects($param_filter_geom, n.${a.geometryFieldName}) return ID(n)`;a.geometryFieldName&&n.add(a.geometryFieldName);n.forEach(g=>{l+=`, n.${g}`;p.push(g)});b=new D({openCypherQuery:l,bindParameters:{param_filter_geom:new R({rings:S.extentToInBoundsRings(h)})}})}else{m= "";if(null!=b.where&&"1\x3d1"!==b.where){const q=await O.parseWhereClause(b.where,a.fieldsIndex);a.fields.forEach(k=>{q.fieldNames.includes(k.name)&&n.add(k.name)});const x=new Set(["column-reference","string","number","binary-expression"]),F=new Set("\x3d \x3c \x3c\x3d \x3c\x3e \x3e \x3e\x3d AND OR LIKE".split(" "));let w=!1;const E=k=>{if("column-reference"===k.type)return`n.${k.column}`;if("string"===k.type)return`'${k.value}'`;if("number"===k.type)return`${k.value}`;if("binary-expression"===k.type&& x.has(k.left.type)&&x.has(k.right.type)&&F.has(k.operator))return`${E(k.left)} ${k.operator} ${E(k.right)}`;if("binary-expression"===k.type&&"LIKE"===k.operator){let v="";if("function"===k.left.type&&"column-reference"===k.left.args.value[0].type)v+=`lower(n.${k.left.args.value[0].column})`;else if("column-reference"===k.left.type)v+=`lower(n.${k.left.column})`;else return w=!0,"";v+=" CONTAINS (";if("string"===k.right.type)k=k.right.value,"%"===k.charAt(0)&&(k=k.slice(1)),"%"===k.charAt(k.length- 1)&&(k=k.slice(0,-1)),v+=`'${k.toLowerCase()}')`;else return w=!0,"";return v}w=!0;return""};m=E(q.parseTree);w&&(m="")}let g="";g=d?`Match ()-[n:${a.objectType.name}]->()`:`Match (n:${a.objectType.name})`;h=!1;f&&(h=!0,g+=" WHERE ID(n) IN $ids");m&&(g=h?g+" AND":g+" WHERE",g+=` ${m}`);g+=" return ID(n)";d&&(g+=", id(startNode(n)), id(endNode(n))");b.returnGeometry&&a.geometryFieldName&&n.add(a.geometryFieldName);n.forEach(q=>{g+=`, n.${q}`;p.push(q)});b=f?new D({openCypherQuery:g,bindParameters:{ids:f}}): new D({openCypherQuery:g})}for(e=(await I.executeQueryStreaming(a.parentCompositeLayer.dataManager.knowledgeGraph,b,e)).resultRowsStream.getReader();;){const {done:g,value:q}=await e.read();if(g)break;b=[];for(f=0;f