You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
33 lines
15 KiB
33 lines
15 KiB
// 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.inclusionModeDefinition.namedTypeDefinitions.size&&!this.inclusionModeDefinition.namedTypeDefinitions.has(a.objectType.name))return[];b=b?b:new T({where:"1\x3d1",outFields:["*"]});if("link-chart"===a.parentCompositeLayer.type){const c=a.parentCompositeLayer;e=this._processingCacheUpdatesLookup.get(a.objectType.name?? |
|
"");const n=b.outFields;n&&1===n.length&&"ESRI__ID"===n[0]&&"1\x3d1"===b.where||await Promise.all(e??[]);const p=[];(this.sublayerCaches.has(a.objectType.name??"")?Array.from(this.sublayerCaches.get(a.objectType.name)?.values()):[]).forEach(l=>{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<r.length;g++){const q=r[g];e.push({id:q[0],typeName:q[1]});e.push({id:q[2],typeName:q[3]})}}}catch(h){if("AbortError"===h.name)K.getLogger(this).info("Request aborted as expected"); |
|
else throw h;}})().then(()=>{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<n.length;a++){const p=n[a];e.push({id:p[0],typeName:p[1]})}}}catch(c){if("AbortError"===c.name)K.getLogger(this).info("Request aborted as expected");else throw c;}return e}async refreshCacheContent(b,a,e,c=!0){const n=N.getInstance(),p=[],l=new Map,u=new Map;this.knowledgeGraph.dataModel.entityTypes?.forEach(d=>{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;v<E.length;v++){const G=E[v];let A=0,J=0;const y={properties:{}};y.id=G[A];A++;J++;q&&(y.originId=G[A],A++,J++,y.destinationId=G[A],A++,J++,C.getOrCreateMapValue(this.nodeConnectionsLookup,y.originId,()=>new 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<G.length;A++)y.properties[r[A-J]]=G[A];F.push(y)}F=n.writeToStore(F,"ESRI__ID",this.geographicLookup.get(d)?.name);this.sublayerCaches.has(d)||this.sublayerCaches.set(d,new Map);c&&!this.inclusionModeDefinition?.namedTypeDefinitions.has(d)&&this.inclusionModeDefinition?.namedTypeDefinitions.set(d,{useAllData:!1,members:new Map});c&&!this.inclusionModeDefinition?.namedTypeDefinitions.get(d).members&& |
|
(this.inclusionModeDefinition.namedTypeDefinitions.get(d).members=new Map);const k=this.sublayerCaches.get(d);F.forEach(v=>{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&&0<f.length){const g=b.objectIds;b.objectIds=f.filter(q=>g.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<q.length;f++){m=q[f];r=h=0;const x={properties:{}};x.id=m[h];h++;r++;d&&(x.originId=m[h],h++,r++,x.destinationId=m[h],h++,r++);for(;h<m.length;h++)x.properties[p[h-r]]=m[h];b.push(x)}u=u.concat(c.writeToStore(b,"ESRI__ID",a.parentCompositeLayer.dataManager.geographicLookup.get(a.objectType.name)?.name))}return u}}; |
|
z.__decorate([B.property()],t.KnowledgeGraphLayerDataManager.prototype,"knowledgeGraph",void 0);z.__decorate([B.property()],t.KnowledgeGraphLayerDataManager.prototype,"inclusionModeDefinition",void 0);z.__decorate([B.property()],t.KnowledgeGraphLayerDataManager.prototype,"entityTypeNames",void 0);z.__decorate([B.property()],t.KnowledgeGraphLayerDataManager.prototype,"relationshipTypeNames",void 0);z.__decorate([B.property()],t.KnowledgeGraphLayerDataManager.prototype,"geographicLookup",void 0);z.__decorate([B.property()], |
|
t.KnowledgeGraphLayerDataManager.prototype,"sublayerCaches",void 0);z.__decorate([B.property()],t.KnowledgeGraphLayerDataManager.prototype,"nodeConnectionsLookup",void 0);z.__decorate([B.property()],t.KnowledgeGraphLayerDataManager.prototype,"relationshipConnectionsLookup",void 0);z.__decorate([B.property()],t.KnowledgeGraphLayerDataManager.prototype,"memberIdTypeLookup",void 0);t.KnowledgeGraphLayerDataManager=z.__decorate([Q.subclass("esri.layers.knowledgeGraph.KnowledgeGraphLayerDataManager")], |
|
t.KnowledgeGraphLayerDataManager);t.mockAggregationCountFieldName="ESRI__AGGREGATION_COUNT";t.mockDestinationIdFieldName="ESRI__DESTINATION_ID";t.mockLayoutGeometryFieldName="ESRI__LAYOUT_GEOMETRY";t.mockOidFieldName="ESRI__ID";t.mockOriginIdFieldName="ESRI__ORIGIN_ID";Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})}); |