/* COPYRIGHT Esri - https://js.arcgis.com/5.0.18/LICENSE.txt */
import{__decorate as t}from"tslib";import e from"../../../../core/Accessor.js";import i from"../../../../core/Logger.js";import{removeMaybe as r,destroyMaybe as s}from"../../../../core/maybe.js";import{throwIfNotAbortError as l,throwIfAborted as o,throwIfAbortError as n}from"../../../../core/promiseUtils.js";import{initial as a}from"../../../../core/reactiveUtils.js";import{sqlAnd as u}from"../../../../core/sql.js";import{property as h,subclass as p}from"../../../../core/accessorSupport/decorators.js";import{UpdatingHandles as c}from"../../../../core/support/UpdatingHandles.js";import g from"../../../../layers/support/FeatureFilter.js";import{getFloorFilterClause as _}from"../../../../layers/support/floorFilterUtils.js";import{QueryEngine as d}from"../graphics/QueryEngine.js";import{QueryEngineContext as f}from"../graphics/QueryEngineContext.js";import{TaskPriority as y}from"../../../support/Scheduler.js";let m=class extends e{constructor(t){super(t),this._frameTask=null,this._queryEngine=null,this._updateRequested=!0,this._updatingHandles=new c,this._abortController=new AbortController}initialize(){const t=y.FILTER_VISIBILITY,{layer:e,view:i}=this._configuration,{featureStore:r}=this.context,{spatialReference:s,resourceController:o}=i,n=this._configuration.hasZ??!1,u=this._configuration.hasM??!1,h=new f(s,e,o,()=>r,n,u);this._queryEngine=new d({context:h,priority:t}),this._frameTask=i.resourceController.scheduler.registerTask(t),this._updatingHandles.add(()=>[this._compositedFeatureFilter,this._sceneFilter,this._displayFilterHighlightIds],()=>this.reapply(),a),this._updatingHandles.addWhen(()=>!this._frameTask.updating&&this._updateRequested,()=>{this._frameTask.scheduleGenerator(()=>this._updateVisibility(),this._abortController.signal).catch(l)},a)}destroy(){this._abortController.abort(),this._updatingHandles.destroy(),this.clear(),this._frameTask=r(this._frameTask),this._queryEngine=s(this._queryEngine),this._set("context",null)}get updating(){return this._updateRequested||this._updatingHandles.updating||this._frameTask.updating}get defaultVisibility(){return null==this._compositedFeatureFilter&&null==this._sceneFilter}get _featureFilter(){return"filter"in this._configuration?this._configuration.filter:null}get _effectiveDisplayFilter(){return"effectiveDisplayFilter"in this._configuration?this._configuration.effectiveDisplayFilter:null}get _highlightIds(){return"highlightIds"in this._configuration?this._configuration.highlightIds:null}get _displayFilterHighlightIds(){return this._effectiveDisplayFilter&&this._highlightIds?.length?new Set(this._highlightIds):null}get _sceneFilter(){return"layerFilter"in this._configuration?this._configuration.layerFilter:null}get _floorFilter(){return _(this._configuration)}get _timeExtent(){return"timeExtent"in this._configuration?this._configuration.timeExtent:null}get _compositedFeatureFilter(){const{_featureFilter:t,_effectiveDisplayFilter:e,_timeExtent:i,_floorFilter:r}=this;let s=t?.clone();if(null!=e&&(s??=new g,s.where=u(s.where,e.where)),null!=i&&(s??=new g,s.timeExtent=s.timeExtent?.intersection(i)??i),null!=r){s??=new g;const t=null==s.where||""===s.where;s.where=t?r:u(s.where,r)}return s}get _configuration(){return this.context.configuration}reapply(){this._updateRequested=!0}clear(){this._queryEngine.clear(),this.context.clearFeaturesVisibility()}async*_updateVisibility(){this._updateRequested=!1;const{context:t,_sceneFilter:e,_compositedFeatureFilter:r,_displayFilterHighlightIds:s,_abortController:{signal:l}}=this;if(o(l),null==r&&null==e||0===t.getFeatureCount())return this.clear();try{let i=await this._queryEngine.executeQueryForIdSet(r,e,l);yield,s&&(i=new Set([...i,...s])),yield,t.updateFeatureVisibilities(t=>i.has(t))}catch(a){n(a),i.getLogger(this).warn(`FeatureFilter query failed: ${a}`,{error:a}),t.setAllFeaturesVisibility(!0)}}};t([h({constructOnly:!0})],m.prototype,"context",void 0),t([h()],m.prototype,"updating",null),t([h()],m.prototype,"defaultVisibility",null),t([h()],m.prototype,"_featureFilter",null),t([h()],m.prototype,"_effectiveDisplayFilter",null),t([h()],m.prototype,"_highlightIds",null),t([h()],m.prototype,"_displayFilterHighlightIds",null),t([h()],m.prototype,"_sceneFilter",null),t([h()],m.prototype,"_floorFilter",null),t([h()],m.prototype,"_timeExtent",null),t([h()],m.prototype,"_compositedFeatureFilter",null),t([h()],m.prototype,"_configuration",null),t([h()],m.prototype,"_updateRequested",void 0),m=t([p("esri.views.3d.layers.support.FeatureVisibilityFilter")],m);export{m as FeatureVisibilityFilter};
