@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 10.1 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import{_ as e}from"../../../chunks/tslib.es6.js";import{pickRandom as t}from"../../../core/arrayUtils.js";import a from"../../../core/Error.js";import{throwIfAborted as r}from"../../../core/promiseUtils.js";import{property as i}from"../../../core/accessorSupport/decorators/property.js";import"../../../core/has.js";import"../../../core/Logger.js";import{subclass as s}from"../../../core/accessorSupport/decorators/subclass.js";import{kebabDict as o}from"../../../layers/support/fieldType.js";import{isTimeOnlyField as n}from"../../../layers/support/fieldUtils.js";import{getArcadeForPredominantCategory as l}from"../../statistics/support/predominanceUtils.js";import{summaryStatistics as u,uniqueValues as m,histogram as p,classBreaks as g}from"../../statistics/support/statsWorker.js";import{mergeWhereClauses as d}from"../../statistics/support/utils.js";import{WorkerClient as y}from"../../statistics/support/WorkerClient.js";import{getFieldsList as c,fieldDelimiter as f,isAnyDateField as h}from"../utils.js";import w from"./FeatureLayerAdapter.js";import{getMissingFieldsForBinning as F,updateQueryWithFeatureFilter as S,getFeatureReductionFields as v,getViewInfoParams as q,getDomainsForFields as V,getPredominantCategoriesFromUVInfos as z}from"./support/utils.js";let N=class extends w{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"]},m=(!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 u({attribute:{field:e,outStatisticTypes:l},features:s})).sum;if(null==m)throw new a(`${this.adapterName}:invalid`,"invalid normalizationTotal");return m}async _processStatsFromMemoryParams(e){const{features:t,filter:r}=e;if(t?.length)return this._getFilteredFeatures(t,r);const{view:i,field:s,field2:o,field3:n,normalizationField:l,valueExpression:u,returnGeometry:m,layerViewFunc:p,signal:g}=e;let d=null,y=null,f=null,h=null,w=null;if(i)try{if(d=await i.whenLayerView(this.layer),y=null!=p&&p in d&&"function"==typeof d[p],y){await this._waitForLayerViewUpdate(d);const e=await c({field:s,field2:o,field3:n,normalizationField:l,valueExpression:u});F(this,e).length?y=!1:(f="createAggregateQuery"in d?d.createAggregateQuery():null,f?(f.outFields=e,f.returnGeometry=!1,S(f,r)):y=!1),d.suspended&&(y=!1)}}catch{y=!1}if(!y&&(w=v(this.layer).map((e=>e.toJSON())),h=await this._fetchFeaturesForStats({field:s,field2:o,field3:n,valueExpression:u,normalizationField:l,returnGeometry:m,filter:r,view:i,signal:g},"json"),!h?.length))throw new a(`${this.adapterName}:insufficient-data`,"No features are available to calculate statistics");return{layerView:d,query:f,featuresJSON:h,fieldInfos:w}}async _summaryStatsFromMemory(e,t){const{view:a,field:r,valueExpression:i,normalizationType:s,signal:n}=e,l={field:r,valueExpression:i,normalizationType:s,normalizationField:e.normalizationField,normalizationTotal:e.normalizationTotal,minValue:e.minValue,maxValue:e.maxValue,outStatisticTypes:e.outStatisticTypes},{featuresJSON:m,graphics:p,layerView:g,query:d,fieldInfos:y}=await this._processStatsFromMemoryParams({...e,layerViewFunc:"queryAggregateSummaryStatistics"});return i&&a&&(m||p)&&(l.fieldType=t?.type?o.toJSON(t.type):null,l.viewInfoParams=q(a),l.timeZone=a.timeZone,l.fieldInfos=y),"percent-of-total"===s&&null==e.normalizationTotal&&(l.normalizationTotal=await this._getNormalizationTotalFromMemory(r,{featuresJSON:m,graphics:p,layerView:g,query:d},n)),!m&&!p&&g&&"queryAggregateSummaryStatistics"in g?g.queryAggregateSummaryStatistics(d,l,{signal:n}):m?this.workerClient.summaryStatistics(l,m):u({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:p,fieldInfos:g}=await this._processStatsFromMemoryParams({...e,layerViewFunc:"queryAggregateUniqueValues"}),d={field:r,field2:e.field2,field3:e.field3,fieldDelimiter:f,valueExpression:i,domains:t,returnAllCodedValues:s};return i&&a&&(n||l)&&(d.viewInfoParams=q(a),d.timeZone=a.timeZone,d.fieldInfos=g),!n&&!l&&u&&"queryAggregateUniqueValues"in u?u.queryAggregateUniqueValues(p,d,{signal:o}):n?this.workerClient.uniqueValues(d,n):m({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=q(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):p({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=q(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):g({attribute:m,features:o})}getField(e=""){const t=v(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=h(r)||n(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 V(e,this);return this._uvFromMemory(e,t)}async histogram(e){const{field:t}=e,r=t?this.getField(t):null,i=h(r)||n(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((()=>(r(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=d(r.where,e.whereClause),S(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=l(t),s=await this._uvFromMemory({valueExpression:i,view:a,signal:r});return z(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(F(this,o).length)throw new a(`${this.adapterName}:insufficient-data`,"Layer does not have required fields");const p=1,g="json"===r,d=m.createAggregateQuery();d.outSpatialReference=i?.spatialReference,d.returnGeometry=!!n,d.outFields=o,S(d,l);const{features:y}=g?await m.queryAggregateJSON(d,{signal:u}):await m.queryAggregates(d,{signal:u});return y.length&&null!=s&&s>0&&s<=y.length?t(y,s,p):y}load(e){const t=this.layer.load(e).then((async t=>{this.geometryType="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;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.workerClient=y.getInstance(),await this.workerClient.open(e.signal)}));return this.addResolvingPromise(t),Promise.resolve(this)}};e([i({readOnly:!0})],N.prototype,"adapterName",void 0),N=e([s("esri.smartMapping.support.adapters.FeatureLayerBinningAdapter")],N);const T=N;export{T as default};