UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

3 lines (2 loc) 9.95 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */ import{__decorate as e}from"tslib";import{pickRandom as t}from"../../../core/arrayUtils.js";import a from"../../../core/Error.js";import{assertIsSome as r}from"../../../core/maybe.js";import{throwIfAborted as i}from"../../../core/promiseUtils.js";import{property as s,subclass as o}from"../../../core/accessorSupport/decorators.js";import{kebabDict as n}from"../../../layers/support/fieldType.js";import{isTimeOnlyField as l}from"../../../layers/support/fieldUtils.js";import{getArcadeForPredominantCategory as u}from"../../statistics/support/predominanceUtils.js";import{summaryStatistics as m,uniqueValues as p,histogram as y,classBreaks as d}from"../../statistics/support/statsWorker.js";import{mergeWhereClauses as g}from"../../statistics/support/utils.js";import{WorkerClient as f}from"../../statistics/support/WorkerClient.js";import{getFieldsList as c,fieldDelimiter as h,isAnyDateField as w}from"../utils.js";import F from"./FeatureLayerAdapter.js";import{getMissingFieldsForBinning as S,updateQueryWithFeatureFilter as v,getFeatureReductionFields as q,getViewInfoParams as V,getDomainsForFields as z,getPredominantCategoriesFromUVInfos as N}from"./support/utils.js";let T=class extends F{constructor(){super(...arguments),this.adapterName="feature-layer-binning-adapter"}async _getNormalizationTotalFromMemory(e,t,r){const{featuresJSON:i,graphics:s,layerView:o,query:n}=t,l={include:["sum"]},u=(!i&&!s&&o&&"queryAggregateSummaryStatistics"in o?await o.queryAggregateSummaryStatistics(n,{field:e,outStatisticTypes:l},{signal:r}):i?await this.workerClient.summaryStatistics({field:e},i):await m({attribute:{field:e,outStatisticTypes:l},features:s})).sum;if(null==u)throw new a(`${this.adapterName}:invalid`,"invalid normalizationTotal");return u}async _processStatsFromMemoryParams(e){const{features:t,filter:i}=e;if(t?.length)return this._getFilteredFeatures(t,i);const{view:s,field:o,field2:n,field3:l,normalizationField:u,valueExpression:m,returnGeometry:p,layerViewFunc:y,signal:d}=e;let g=null,f=null,h=null,w=null,F=null;if(s)try{if(g=await s.whenLayerView(this.layer),r(g),f=null!=y&&y in g&&"function"==typeof g[y],f){await this._waitForLayerViewUpdate(g);const e=await c({field:o,field2:n,field3:l,normalizationField:u,valueExpression:m});S(this,e).length?f=!1:(h="createAggregateQuery"in g?g.createAggregateQuery():null,h?(h.outFields=e,h.returnGeometry=!1,v(h,i)):f=!1),g.suspended&&(f=!1)}}catch{f=!1}if(!f&&(F=q(this.layer).map(e=>e.toJSON()),w=await this._fetchFeaturesForStats({field:o,field2:n,field3:l,valueExpression:m,normalizationField:u,returnGeometry:p,filter:i,view:s,signal:d},"json"),!w?.length))throw new a(`${this.adapterName}:insufficient-data`,"No features are available to calculate statistics");return{layerView:g,query:h,featuresJSON:w,fieldInfos:F}}async _summaryStatsFromMemory(e,t){const{view:a,field:r,valueExpression:i,normalizationType:s,signal:o}=e,l={field:r,valueExpression:i,normalizationType:s,normalizationField:e.normalizationField,normalizationTotal:e.normalizationTotal,minValue:e.minValue,maxValue:e.maxValue,outStatisticTypes:e.outStatisticTypes},{featuresJSON:u,graphics:p,layerView:y,query:d,fieldInfos:g}=await this._processStatsFromMemoryParams({...e,layerViewFunc:"queryAggregateSummaryStatistics"});return i&&a&&(u||p)&&(l.fieldType=t?.type?n.toJSON(t.type):null,l.viewInfoParams=V(a),l.timeZone=a.timeZone,l.fieldInfos=g),"percent-of-total"===s&&null==e.normalizationTotal&&(l.normalizationTotal=await this._getNormalizationTotalFromMemory(r,{featuresJSON:u,graphics:p,layerView:y,query:d},o)),!u&&!p&&y&&"queryAggregateSummaryStatistics"in y?y.queryAggregateSummaryStatistics(d,l,{signal:o}):u?this.workerClient.summaryStatistics(l,u):m({attribute:l,features:p})}async _uvFromMemory(e,t){const{view:a,field:r,valueExpression:i,returnAllCodedValues:s,signal:o}=e,{featuresJSON:n,graphics:l,layerView:u,query:m,fieldInfos:y}=await this._processStatsFromMemoryParams({...e,layerViewFunc:"queryAggregateUniqueValues"}),d={field:r,field2:e.field2,field3:e.field3,fieldDelimiter:h,valueExpression:i,domains:t,returnAllCodedValues:s};return i&&a&&(n||l)&&(d.viewInfoParams=V(a),d.timeZone=a.timeZone,d.fieldInfos=y),!n&&!l&&u&&"queryAggregateUniqueValues"in u?u.queryAggregateUniqueValues(m,d,{signal:o}):n?this.workerClient.uniqueValues(d,n):p({attribute:d,features:l})}async _histogramFromMemory(e){const{view:t,field:a,valueExpression:r,signal:i}=e,{featuresJSON:s,graphics:o,layerView:n,query:l,fieldInfos:u}=await this._processStatsFromMemoryParams({...e,layerViewFunc:"queryAggregateHistogram"}),m={field:a,valueExpression:r,normalizationType:e.normalizationType,normalizationField:e.normalizationField,normalizationTotal:e.normalizationTotal,minValue:e.minValue,maxValue:e.maxValue,standardDeviationInterval:e.standardDeviationInterval,classificationMethod:e.classificationMethod,numBins:e.numBins};return r&&t&&(s||o)&&(m.viewInfoParams=V(t),m.timeZone=t.timeZone,m.fieldInfos=u),"percent-of-total"===e.normalizationType&&null==e.normalizationTotal&&(m.normalizationTotal=await this._getNormalizationTotalFromMemory(a,{featuresJSON:s,graphics:o,layerView:n,query:l},i)),!s&&!o&&n&&"queryAggregateHistogram"in n?n.queryAggregateHistogram(l,m,{signal:i}):s?this.workerClient.histogram(m,s):y({attribute:m,features:o})}async _classBreaksFromMemory(e){const{view:t,field:a,valueExpression:r,signal:i}=e,{featuresJSON:s,graphics:o,layerView:n,query:l,fieldInfos:u}=await this._processStatsFromMemoryParams({...e,layerViewFunc:"queryAggregateClassBreaks"}),m={field:a,valueExpression:r,normalizationType:e.normalizationType,normalizationField:e.normalizationField,normalizationTotal:e.normalizationTotal,minValue:e.minValue,maxValue:e.maxValue,standardDeviationInterval:e.standardDeviationInterval,classificationMethod:e.classificationMethod,numClasses:e.numClasses};return r&&t&&(s||o)&&(m.viewInfoParams=V(t),m.timeZone=t.timeZone,m.fieldInfos=u),"percent-of-total"===e.normalizationType&&null==e.normalizationTotal&&(m.normalizationTotal=await this._getNormalizationTotalFromMemory(a,{featuresJSON:s,graphics:o,layerView:n,query:l},i)),!s&&!o&&n&&"queryAggregateClassBreaks"in n?n.queryAggregateClassBreaks(l,m,{signal:i}):s?this.workerClient.classBreaks(m,s):d({attribute:m,features:o})}getField(e=""){const t=q(this.layer);return t?.find(t=>t.name.toLowerCase()===e?.toLowerCase())}getFieldUsageInfo(e){return this.getField(e)?{supportsLabelingInfo:!0,supportsRenderer:!0,supportsPopupTemplate:!0,supportsLayerQuery:!1,supportsStatistics:!0}:null}getFieldDomain(e,t){return null}async summaryStatistics(e){const{field:t}=e,r=t?this.getField(t):null,i=w(r)||l(r),s=e.sqlExpression&&!e.valueExpression&&!t;if(i||s)throw new a(`${this.adapterName}:not-supported`,"Date field and sqlExpression are not supported");return this._summaryStatsFromMemory(e,r)}async uniqueValues(e){const t=await z(e,this);return this._uvFromMemory(e,t)}async histogram(e){const{field:t}=e,r=t?this.getField(t):null,i=w(r)||l(r),s=e.sqlExpression&&!e.valueExpression&&!t;if(i||s)throw new a(`${this.adapterName}:not-supported`,"Date field and sqlExpression are not supported");return this._histogramFromMemory(e)}async classBreaks(e){return(!1!==e.analyzeData?this._classBreaksFromMemory(e):this._classBreaksFromInterpolation(e)).catch(()=>(i(e.signal),this._classBreaksFromMemory(e)))}async queryFeatureCount(e){const t=await(e.view?.whenLayerView(this.layer));if(!t||!("queryAggregateCount"in t)||!t.queryAggregateCount)throw new a(`${this.adapterName}:not-supported`,"LayerView is not supported.");await this._waitForLayerViewUpdate(t);const r=t.createAggregateQuery();return r.where=g(r.where,e.whereClause),v(r,e.filter),t.queryAggregateCount(r,{signal:e.signal})}generateRenderer(e,t){throw new a(`${this.adapterName}:not-supported`,"'generateRenderer' is not supported.")}heatmapStatistics(e){throw new a(`${this.adapterName}:not-supported`,"'heatmapStatistics' is not supported.")}async predominantCategories(e){const{fields:t,view:a,signal:r}=e,i=u(t),s=await this._uvFromMemory({valueExpression:i,view:a,signal:r});return N(s.uniqueValueInfos,t)}async getSampleFeatures(e,r){const{view:i,sampleSize:s,requiredFields:o,returnGeometry:n,filter:l,signal:u}=e;if(!i)throw new a(`${this.adapterName}:not-supported`,"'view' is required to get sample features for binning.");if("3d"===i.type)throw new a(`${this.adapterName}:not-supported`,"3d 'view' is not supported to get sample features for binning.");const m=await i.whenLayerView(this.layer);if(!("queryAggregateJSON"in m&&m.queryAggregateJSON&&"queryAggregates"in m&&m.queryAggregates))throw new a(`${this.adapterName}:not-supported`,"LayerView is not supported.");await this._waitForLayerViewUpdate(m);if(S(this,o).length)throw new a(`${this.adapterName}:insufficient-data`,"Layer does not have required fields");const p=1,y="json"===r,d=m.createAggregateQuery();d.outSpatialReference=i?.spatialReference,d.returnGeometry=!!n,d.outFields=o,v(d,l);const{features:g}=y?await m.queryAggregateJSON(d,{signal:u}):await m.queryAggregates(d,{signal:u});return g.length&&null!=s&&s>0&&s<=g.length?t(g,s,p):g}load(e){const t=this.layer.load(e).then(async t=>{const r="featureReduction"in t?t.featureReduction:null;if("binning"!==r?.type&&"cluster"!==r?.type)throw new a(`${this.adapterName}:invalid-parameters`,`Feature reduction type ${r?.type} is not supported`);this.geometryType="cluster"===r?.type?"point":"polygon",this.objectIdField=null,this.supportsSQLExpression=!1,this._hasLocalSource=!1,this.hasQueryEngine=!0,this.minScale=t.minScale,this.maxScale=t.maxScale,this.fullExtent=t.fullExtent,this.workerClient=f.getInstance(),await this.workerClient.open(e.signal)});return this.addResolvingPromise(t),Promise.resolve(this)}};e([s({readOnly:!0})],T.prototype,"adapterName",void 0),T=e([o("esri.smartMapping.support.adapters.FeatureLayerBinningAdapter")],T);const x=T;export{x as default};