@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 5.9 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import e from"../../Graphic.js";import n from"../../WebLinkChart.js";import o from"../../core/Collection.js";import t from"../../core/Logger.js";import r from"../../geometry/Extent.js";import a from"../../geometry/Point.js";import i from"../../geometry/Polyline.js";import s from"../GraphicsLayer.js";import l from"../LinkChartLayer.js";import{loadRecordsIntoLocalCache as m}from"./supportUtils.js";import p from"../support/LabelClass.js";import y from"../support/LabelExpressionInfo.js";import d from"../../renderers/visualVariables/SizeVariable.js";import c from"../../renderers/visualVariables/support/SizeStop.js";import{executeQueryStreaming as f}from"../../rest/knowledgeGraphService.js";import u from"../../rest/knowledgeGraph/Entity.js";import w from"../../rest/knowledgeGraph/GraphQueryStreaming.js";import h from"../../rest/knowledgeGraph/Relationship.js";import g from"../../symbols/SimpleLineSymbol.js";import b from"../../symbols/SimpleMarkerSymbol.js";import T from"../../symbols/TextSymbol.js";import x from"../../views/LinkChartView.js";const j="ESRI__DM__ENTITY__",E="ESRI__DM__RELATIONSHIP__",S=e=>`${j}${e}`,v=(e,n,o)=>`${E}${n}--${e}--${o}`,I=async(e,n)=>{const o=e.dataModel.entityTypes.map(({name:e})=>`MATCH (n:${e}) RETURN "${S(e)}" as typename LIMIT 1`),r=[];for(const t of e.dataModel.relationshipTypes)for(const{originEntityType:e,destinationEntityType:n}of t.endPoints)r.push(`MATCH (n:${e})-[r:${t.name}]->(m:${n}) RETURN "${v(e,t.name,n)}" as typename LIMIT 1`);const a=new Set,i=o.concat(r).join(" UNION ALL ");let s=!1;try{const{resultRowsStream:o}=await f(e,new w({openCypherQuery:i}),{signal:n}),t=o.getReader();for(;;){const{done:e,value:n}=await t.read();if(e)break;for(const[o]of n)a.add(o)}}catch(l){n.aborted||t.getLogger("esri.layers.knowledgeGraph.dataModelVisualizationUtils.generateDataModelView").error("Failed to fetch entity and relationship counts for data model visualization:",l),s=!0}return s?null:a},L=e=>{const n=[],o={generateAllSublayers:!0,namedTypeDefinitions:new Map},t=[];return e.dataModel.entityTypes.forEach(e=>{n.push(new u({typeName:e.name,id:S(e.name),properties:e.properties.reduce((e,n)=>({...e,[n.name]:null}),{})})),o.namedTypeDefinitions.set(e.name,{useAllData:!1,members:new Map([[S(e.name),{id:S(e.name)}]])})}),e.dataModel.relationshipTypes.forEach(e=>{const r=new Map;o.namedTypeDefinitions.set(e.name,{useAllData:!1,members:r}),e.endPoints.length||t.push(e.name);for(const{originEntityType:o,destinationEntityType:t}of e.endPoints)n.push(new h({typeName:e.name,id:v(o,e.name,t),originId:S(o),destinationId:S(t),properties:e.properties.reduce((e,n)=>({...e,[n.name]:null}),{})})),r.set(v(o,e.name,t),{id:v(o,e.name,t)})}),{records:n,inclusionDefinition:o,unobservedRelationshipTypes:t}},M=(e,n)=>{const o=n?`\n var typeCount = {\n ${Array.from(n).map(e=>`${JSON.stringify(e)}: 1`).join(",\n")}\n };\n\n var countText = "";\n if (!HasKey(typeCount, $feature.ESRI__ID)) {\n countText = " (0)"; \n }\n\n return ${JSON.stringify(e.objectType.name)} + countText;\n `:`${JSON.stringify(e.objectType.name)}`;return"entity"===e.graphType?[new p({labelExpressionInfo:new y({expression:o}),labelPlacement:"above-center",symbol:new T({color:[255,255,255,255],font:{family:"arial-unicode-ms",size:10,weight:"bold"},haloColor:[0,0,0,255],haloSize:.7})})]:[new p({labelExpressionInfo:new y({expression:o}),labelPlacement:"above-along",repeatLabel:!1,symbol:new T({color:[80,80,80],haloColor:[255,255,255],haloSize:.7,font:{size:10,weight:"normal"},yoffset:"2px"}),deconflictionStrategy:"none"})]},$=e=>"entity"===e.graphType?[new d({valueExpression:"$view.scale",stops:[new c({size:30,value:0}),new c({size:6,value:1e3})]})]:[new d({valueExpression:"$view.scale",stops:[new c({size:20,value:0}),new c({size:8,value:1e3})]})],z=(n,o,t)=>{const l=5e-5,m=15e-5,p=8e-6,y=new s,d=new s({minScale:1e3,maxScale:0});let c=t.ymin;const f=t.xmin,u=f+m;for(const r of o){const o=n.layers.find(e=>e.objectType.name===r);c-=l;const t=("simple"===o?.renderer?.type?o.renderer.symbol?.clone():null)||new g({type:"simple-line",color:"gray",width:2}),s=new e({geometry:new i({paths:[[[f,c],[u,c]]]}),symbol:t});y.add(s);for(const n of[f,u]){const o=new e({geometry:new a({x:n,y:c}),symbol:new b({color:"white",outline:{color:"gray",width:1},size:6})});y.add(o)}const m=new e({geometry:new a({x:(f+u)/2,y:c+p}),symbol:new T({text:r+" (0)",color:[80,80,80],haloColor:[255,255,255],haloSize:.7,font:{size:10,weight:"normal"},yoffset:"2px"})});d.add(m)}return{graphicsLayers:[y,d],graphicsExtent:new r({xmin:f,xmax:u,ymin:c,ymax:t.ymin,spatialReference:t.spatialReference})}},C=({container:e,kg:t})=>{const r=new AbortController,{records:a,inclusionDefinition:i,unobservedRelationshipTypes:s}=L(t),p=I(t,r.signal);m(a,t.dataModel);const y=new l({title:"Data Model Visualization Layer",url:t.url,initializationInclusionModeDefinition:i,dataPreloadedInLocalCache:!0}),d=new n({layers:new o([y])}),c=new x({map:d,container:e}),f=new Promise((e,n)=>{c.when(()=>y.load().then(async()=>{if(y.layers.forEach(e=>{e.labelsVisible=!0,e.visible=!0,e.labelingInfo=M(e,null),p.then(n=>{n&&(e.labelingInfo=M(e,n))}),e.renderer&&"heatmap"!==e.renderer.type&&(e.renderer.visualVariables=$(e))}),d.diagramNodesExtent){let n=null;if(s.length>0){const{graphicsExtent:e,graphicsLayers:o}=z(y,s,d.diagramNodesExtent);d.addMany(o),n=e}const o=n?d.diagramNodesExtent.union(n):d.diagramNodesExtent;c.goTo(o.expand(1.4)).finally(()=>e())}},n),n)});return{_view:c,load:()=>f,destroy:()=>{c.destroy(),r.abort()}}};export{S as entityTypeToRecordId,C as generateDataModelView,L as generateRecordsForDataModelView,I as getExistingEntitiesAndRelationshipTriples,M as getLabellingInfoForLayer,z as getUnobservedRelationshipGraphics,$ as getVisualVariablesForLayer,v as relationshipTripleToRecordId};