import type Graphic from "../../Graphic.js";
import type CSVLayer from "../../layers/CSVLayer.js";
import type FeatureLayer from "../../layers/FeatureLayer.js";
import type GeoJSONLayer from "../../layers/GeoJSONLayer.js";
import type OGCFeatureLayer from "../../layers/OGCFeatureLayer.js";
import type OrientedImageryLayer from "../../layers/OrientedImageryLayer.js";
import type ParquetLayer from "../../layers/ParquetLayer.js";
import type StreamLayer from "../../layers/StreamLayer.js";
import type SubtypeGroupLayer from "../../layers/SubtypeGroupLayer.js";
import type WFSLayer from "../../layers/WFSLayer.js";
import type CatalogFootprintLayer from "../../layers/catalog/CatalogFootprintLayer.js";
import type KnowledgeGraphSublayer from "../../layers/knowledgeGraph/KnowledgeGraphSublayer.js";
import type FeatureEffect from "../../layers/support/FeatureEffect.js";
import type FeatureFilter from "../../layers/support/FeatureFilter.js";
import type AttributeBinsFeatureSet from "../../rest/support/AttributeBinsFeatureSet.js";
import type AttributeBinsQuery from "../../rest/support/AttributeBinsQuery.js";
import type FeatureSet from "../../rest/support/FeatureSet.js";
import type Query from "../../rest/support/Query.js";
import type LayerView from "./LayerView.js";
import type HighlightOptions from "../support/HighlightOptions.js";
import type { ResourceHandle } from "../../core/Handles.js";
import type { AbortOptions } from "../../core/promiseUtils.js";
import type { QueryProperties } from "../../rest/support/Query.js";
import type { ObjectId } from "../types.js";
import type { LayerViewHighlightOptions } from "./types.js";
import type { HighlightOptionsProperties } from "../support/HighlightOptions.js";
import type { FeatureEffectProperties } from "../../layers/support/FeatureEffect.js";
import type { FeatureFilterProperties } from "../../layers/support/FeatureFilter.js";

/**
 * The set of layers that have FeatureLikeLayerView implementations.
 *
 * @see [CatalogFootprintLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/CatalogFootprintLayerView/)
 * @see [CSVLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/CSVLayerView/)
 * @see [FeatureLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/)
 * @see [GeoJSONLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/GeoJSONLayerView/)
 * @see [OGCFeatureLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/OGCFeatureLayerView/)
 * @see [OrientedImageryLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/OrientedImageryLayerView/)
 * @see [ParquetLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/ParquetLayerView/)
 * @see [StreamLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/)
 * @see [SubtypeGroupLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/SubtypeGroupLayerView/)
 * @see [WFSLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/WFSLayerView/)
 * @see [KnowledgeGraphSublayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/KnowledgeGraphSublayerView/)
 */
export type FeatureLikeLayerViewLayer = CatalogFootprintLayer | CSVLayer | FeatureLayer | GeoJSONLayer | OGCFeatureLayer | OrientedImageryLayer | ParquetLayer | StreamLayer | SubtypeGroupLayer | WFSLayer | KnowledgeGraphSublayer;

/** @since 5.0 */
export default abstract class FeatureLikeLayerView extends LayerView {
  /**
   * A list of attribute fields fetched for each feature including fields required for layer's `renderer`
   * `labelingInfo`, `elevationInfo`, and additional fields defined on the `outFields` properties.
   * The `availableFields` property is populated when the layerView has finished [LayerView.updating](https://developers.arcgis.com/javascript/latest/references/core/views/layers/LayerView/#updating).
   * The `availableFields` is used when [filtering](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#filter) or querying features on the [client-side](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryFeatures).
   *
   * @since 4.11
   * @see [dataUpdating](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#dataUpdating)
   * @example
   * const layerView = await view.whenLayerView(layer);
   *
   * // availableFields will become available once the
   * // layerView finishes updating
   * await reactiveUtils.whenOnce(() => !layerView.updating);
   *
   * try {
   *   const results = await layerView.queryFeatures({
   *     outFields: layerView.availableFields,
   *     where: "DEW_POINT > 10"
   *   });
   *   console.log(results.features.length, " features returned");
   * } catch(error) {
   *   console.log("query failed: ", error);
   * }
   */
  get availableFields(): string[];
  /**
   * Indicates whether the layer view is currently fetching new features. It becomes `false` once all layer queries have finished executing.
   * Watch this property along with [LayerView.updating](https://developers.arcgis.com/javascript/latest/references/core/views/layers/LayerView/#updating) property to know when to re-execute client-side queries after an update cycle.
   * For example, a query that returns the number of features available in the layer view should be executed when
   * `dataUpdating` becomes `false`. It's important to note that `dataUpdating` can only be `true` when `updating` is also `true`.
   *
   * @since 4.28
   * @see [hasAllFeatures](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#hasAllFeatures)
   * @see [hasAllFeaturesInView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#hasAllFeaturesInView)
   * @see [hasFullGeometries](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#hasFullGeometries)
   * @example
   * // watch layer view updating and dataUpdating to get the count of features
   * // available in layer view. Only execute the query once new features are fetched.
   * let dataWasUpdated = lv.dataUpdating;
   * reactiveUtils.watch(() => [lv.updating, lv.dataUpdating],
   *   ([updating, dataUpdating]) => {
   *   dataWasUpdated ||= dataUpdating;
   *   if (!updating && dataWasUpdated) {
   *    dataWasUpdated = false;
   *    lv.queryFeatureCount().then((results)=>{
   *       console.log("number of features in layerView", results);
   *     });
   *   }
   * });
   */
  get dataUpdating(): boolean;
  /**
   * The featureEffect can be used to draw attention to features of interest.
   * It allows for the selection of features via a
   * [FeatureEffect.filter](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FeatureEffect/#filter), and an
   * [FeatureEffect.includedEffect](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FeatureEffect/#includedEffect) and
   * [FeatureEffect.excludedEffect](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FeatureEffect/#excludedEffect)
   * are applied to those features that respectively pass or fail the filter requirements.
   *
   * If the `featureEffect` is set on the layer, it will be inherited by `layerView.featureEffect` unless the developer overrides it on the layerView. The `layerView.featureEffect`
   * will take precedence over `layer.featureEffect` if both properties are set.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > FeatureEffect is not supported in the following scenarios:
   * >    * In 3D [SceneViews](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/)
   * >    * When [FeatureReductionCluster](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#featureReduction) is enabled
   * >    * When a map is [printed](https://developers.arcgis.com/javascript/latest/references/core/rest/print/)
   * > A FeatureEffect set on a layerView cannot persisted in a [WebMap](https://developers.arcgis.com/javascript/latest/references/core/WebMap/).
   *
   * @since 4.22
   * @see [FeatureLayer.featureEffect](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#featureEffect)
   * @see [Sample - Apply effects to features](https://developers.arcgis.com/javascript/latest/sample-code/featureeffect-geometry/)
   * @see [Sample - Apply drop-shadow effect to a layerView](https://developers.arcgis.com/javascript/latest/sample-code/featureeffect-drop-shadow/)
   * @example
   * // gray out features that fall outside of the 3 mile buffer of the mouse's location
   * // by setting feature effect on excluded features
   * layerView.featureEffect = new FeatureEffect({
   *   filter: new FeatureFilter({
   *     geometry: filterGeometry,
   *     spatialRelationship: "intersects",
   *     distance: 3,
   *     units: "miles"
   *   }),
   *   excludedEffect: "grayscale(100%) opacity(30%)"
   * });
   * @example
   * // Apply a drop-shadow feature effect to the features that intersect the borough boundaries,
   * // while applying blur and brightness effects to the features that are excluded from filter criteria.
   * // The resulting map will make it easier to spot if the residents are more likely to experience deprivation
   * // if they live on a borough boundary.
   * const featureFilter = new FeatureFilter({
   *   where: "BoroughEdge='true'"
   * });
   * layerView.featureEffect = new FeatureEffect({
   *   filter: featureFilter,
   *   includedEffect: "drop-shadow(3px, 3px, 3px, black)",
   *   excludedEffect: "blur(1px) brightness(65%)"
   * });
   */
  get featureEffect(): FeatureEffect | null | undefined;
  set featureEffect(value: FeatureEffectProperties | null | undefined);
  /**
   * The [attribute](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FeatureFilter/#where),
   * [FeatureFilter.geometry](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FeatureFilter/#geometry),
   * and [time extent](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FeatureFilter/#timeExtent)
   * filter. Only the features that satisfy the filter are displayed on the view.
   *
   * @since 4.11
   * @see [Sample - Filter features by attributes](https://developers.arcgis.com/javascript/latest/sample-code/featurefilter-attributes/)
   * @see [Sample - Filter features by geometry](https://developers.arcgis.com/javascript/latest/sample-code/layers-scenelayer-feature-masking/)
   * @see [availableFields](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#availableFields)
   * @example
   * // display rain gauges where their water percent is over 30%
   * // and if the gauges are completely contained by the 10-mile
   * // buffer around the filter geometry
   * featureLayerView.filter = new FeatureFilter({
   *   where: "percentile >= 30",
   *   geometry: filterPolygon,
   *   spatialRelationship: "contains",
   *   distance: 10,
   *   units: "miles"
   * });
   */
  get filter(): FeatureFilter | null | undefined;
  set filter(value: FeatureFilterProperties | null | undefined);
  /**
   * Indicates whether the layer view contains all available features from the service or source.
   * After the layer finishes loading and [fetching](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/#dataUpdating) its data,
   * this property reflects whether all features from the source are available in the layer view.
   *
   * When `hasAllFeatures` is `true`:
   * - The LayerView contains all features from the layer.
   * - [Queries](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryFeatures) executed on the LayerView run against the entire dataset.
   * - To restrict queries to features currently visible in the view, set the query’s [Query.geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry)
   *   property to the View's `extent`.
   *
   * When `hasAllFeatures` is `false`:
   * - The LayerView contains only features available for drawing.
   * - Queries on the LayerView run against the subset of features available on the client.
   * - To query the entire dataset with full-resolution geometries, use the query method on the Layer itself.
   *
   * @since 4.29
   * @see [dataUpdating](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#dataUpdating)
   * @see [queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryFeatures)
   * @example
   * const viewElement = document.querySelector("arcgis-map");
   * const layerView = await viewElement.whenLayerView(layer);
   *
   * // Wait until the initial layer load completes
   * const layerView = await viewElement.whenLayerView(airQualityLayer);
   * await reactiveUtils.whenOnce(() => !layerView.updating);
   *
   * // Set up query with outStatistics to compute min, max, and average PM2.5 of all data
   * const query = airQualityLayer.createQuery();
   * query.outStatistics = [
   *   {
   *     statisticType: "avg",
   *     onStatisticField: "pm25",
   *     outStatisticFieldName: "avg_pm25"
   *   },
   *   {
   *     statisticType: "min",
   *     onStatisticField: "pm25",
   *     outStatisticFieldName: "min_pm25"
   *   },
   *   {
   *     statisticType: "max",
   *     onStatisticField: "pm25",
   *     outStatisticFieldName: "max_pm25"
   *   }
   * ];
   *
   * // Run the query on all features to get the min, max, and average values.
   * // If `hasAllFeatures` is true, all features from the layer are loaded
   * // and available on the client, so use layerView.queryFeatures for faster performance.
   * // Otherwise, use layer.queryFeatures to run the query against all features
   * const results = layerView.hasAllFeatures
   *   ? await layerView.queryFeatures(query)
   *   : await airQualityLayer.queryFeatures(query);
   *
   * // process the result
   * updateAirQualityStatus(results);
   */
  get hasAllFeatures(): boolean;
  /**
   * This property helps determine if the layer view has successfully retrieved all relevant data for the current extent, even if no features are visible
   * (for example, if the result is zero). When `true`, you can use the layer view's query functions to investigate the features currently displayed on the map.
   * If `false`, you may need to query the layer and its service directly to get accurate results.
   * The hasAllFeaturesInView property will be `false` if some queries failed to execute, or when the layer contains a large number of features and is configured
   * with a [display filter](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#displayFilterInfo). This filter is sent along with the layer's
   * [FeatureLayer.definitionExpression](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#definitionExpression) during each feature tile query.
   *
   * @since 4.29
   * @see [dataUpdating](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#dataUpdating)
   * @see [queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryFeatures)
   * @example
   * const layerView = await viewElement.whenLayerView(featureLayer);
   *
   * reactiveUtils.when(
   *   () => !layerView.dataUpdating,
   *   async () => {
   *     // wait till the layerView finishes fetching its data
   *     // layerView has all expected features
   *     if (layerView.hasAllFeaturesInView) {
   *       const count = await layerView.queryFeatureCount({
   *         geometry: view.extent
   *       });
   *       // use the feature count
   *       console.log(count, "features in the layerView within the extent");
   *     } else {
   *       // LayerView does not have all expected features
   *       // for example, the layer may have displayFilterInfo applied
   *       // in this case, not all features from the layer will be available
   *       // in the layer view as they are filtered out
   *       const count = await layer.queryFeatureCount({
   *         geometry: view.extent
   *       });
   *       // use the count
   *       console.log(count, "features in the layer within the extent");
   *     }
   *   }
   * );
   */
  get hasAllFeaturesInView(): boolean;
  /**
   * Indicates whether the LayerView contains geometries at full resolution.
   * After the layer finishes loading and [fetching](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/#dataUpdating) its data,
   * this property reflects whether all geometries were loaded at full resolution without quantization.
   *
   * To retrieve feature geometries at full resolution when querying, first check the LayerView's `hasFullGeometries` property.
   * If it is `true`, use a query method on the LayerView; otherwise, use the query method on the Layer.
   *
   * @since 4.29
   * @see [dataUpdating](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#dataUpdating)
   * @see [queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryFeatures)
   */
  get hasFullGeometries(): boolean;
  /**
   * Options for configuring the highlight. Use the [highlight()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#highlight) method on the layer view to highlight a feature
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > The `highlightOptions` on layer views are only supported in [2D MapViews](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/). To
   * > configure highlights for a [3D SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/), use
   * > [SceneView.highlights](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/#highlights) instead.
   *
   * @deprecated since version 4.34. Use the [View.highlights](https://developers.arcgis.com/javascript/latest/references/core/views/View/#highlights) property instead.
   * @since 4.26
   * @see [highlight()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#highlight)
   * @see [Sample: Highlight SceneLayer](https://developers.arcgis.com/javascript/latest/sample-code/highlight-scenelayer/)
   * @example
   * // Features in the layerview will be highlighted with bright
   * // yellow colors in the map.
   * const layerView = await view.whenLayerView(layer);
   * layerView.highlightOptions = {
   *   color: [255, 255, 0, 1],
   *   haloOpacity: 0.9,
   *   fillOpacity: 0.2
   * };
   */
  get highlightOptions(): HighlightOptions | null | undefined;
  set highlightOptions(value: HighlightOptionsProperties | null | undefined);
  /** The layer being viewed. */
  get layer(): FeatureLikeLayerViewLayer;
  /**
   * The maximum number of features that can be displayed at a time. This setting currently only applies to
   * SceneView. By default, the maximum number of features is estimated automatically depending on the symbology,
   * geometry complexity, memory consumption and display quality profile.
   *
   * Changing this setting to a higher value may lead to a significant decrease in performance and increase in
   * memory usage.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > * The `maximumNumberOfFeatures` is only supported in 3D [SceneViews](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   * > * This property does not apply to [ParquetLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/ParquetLayerView/) and [StreamLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/).
   *
   * @since 4.10
   */
  accessor maximumNumberOfFeatures: number;
  /**
   * Signifies whether the maximum number of features has been exceeded. Not all features could be displayed
   * when this value is `true`. This setting currently only applies to SceneView.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > * The `maximumNumberOfFeaturesExceeded` is only supported in 3D [SceneViews](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   * > * This property does not apply to [ParquetLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/ParquetLayerView/) and [StreamLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/).
   *
   * @since 4.10
   */
  get maximumNumberOfFeaturesExceeded(): boolean;
  /**
   * Creates query parameter object that can be used to [fetch aggregate features](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryAggregates) as they are being
   * displayed. It sets the query parameter's [Query.outFields](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outFields)
   * property to `["*"]` and [Query.returnGeometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnGeometry) to `true`.
   * The output spatial reference [Query.outSpatialReference](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outSpatialReference)
   * is set to the spatial reference of the view.
   *
   * @returns The query parameter object.
   * @since 4.25
   * @see [queryAggregates()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryAggregates)
   */
  createAggregateQuery(): Query;
  /**
   * Creates a query parameter object that can be used to fetch features as they are being
   * displayed. It sets the query parameter's [Query.outFields](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outFields)
   * property to `["*"]` and [Query.returnGeometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnGeometry) to `true`.
   * The [Query.outSpatialReference](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outSpatialReference)
   * is set to the spatial reference of the view. Parameters of the [filter](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#filter) currently
   * applied to the layer view are also incorporated in the returned query object. The results will include
   * geometries of features and values for all fields.
   *
   * @returns The query object
   * @since 4.12
   * @example
   * const query = csvLayerView.createQuery();
   * query.where = "magnitude > 4";
   * csvLayerView.queryFeatures(query).then(function(results) {
   *   console.log(results);
   * })
   * .catch(function(error) {
   *   console.log(error);
   * });
   */
  createQuery(): Query;
  /**
   * Highlights the given feature(s) in a layer view using the named [HighlightOptions](https://developers.arcgis.com/javascript/latest/references/core/views/support/HighlightOptions/)
   * from the view's [View.highlights](https://developers.arcgis.com/javascript/latest/references/core/views/View/#highlights) collection. If no `name` is provided, the
   * feature will use the `default` highlight options.
   *
   * Release-specific changes:
   * * As of version 4.32, the `highlight` method accepts an `options` parameter which can be used to provide a [HighlightOptions.name](https://developers.arcgis.com/javascript/latest/references/core/views/support/HighlightOptions/#name)
   * to apply specific [HighlightOptions](https://developers.arcgis.com/javascript/latest/references/core/views/support/HighlightOptions/).
   * If no `name` is provided, the `default` highlight options will be used.
   * * As of version 4.23, the `highlight()` method was added to [ImageryLayerView.highlight()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/ImageryLayerView/#highlight),
   *   supported only in a [2D MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/).
   *
   * @param target - The feature(s) to highlight. When passing a graphic or an array of graphics, each feature must have a valid `objectID`.\nYou may alternatively pass one or more objectIDs as a single number, string, or an array of numbers or strings.
   * @param options - An object with the following properties.
   * @public
   * @param target - The feature(s) to highlight. When passing a graphic or an array of graphics, each feature must have a valid `objectID`.
   * You may alternatively pass one or more objectIDs as a single number, string, or an array of numbers or strings.
   * @param options - An object with the following properties.
   * @returns Returns a highlight handler with a `remove()` method that can be called to remove the highlight.
   * @see [View.highlights](https://developers.arcgis.com/javascript/latest/references/core/views/View/#highlights)
   * @see [Sample: Highlight features by geometry](https://developers.arcgis.com/javascript/latest/sample-code/highlight-features-by-geometry/)
   * @see [Sample: Highlight SceneLayer](https://developers.arcgis.com/javascript/latest/sample-code/highlight-scenelayer/)
   * @example
   * // Highlight features based on a query result
   *
   * // Add a new set of highlight options to the view's highlights collection
   * view.highlights.push({
   *   name: "oaks",
   *   color: "forestgreen",
   *   haloOpacity: 0.8,
   *   fillOpacity: 0.3
   * });
   *
   * // A handler can be used to remove any previous highlight when applying a new one
   * let highlight;
   *
   * // Query for particular features in a layer and then highlight them with the specified options
   * view.whenLayerView(treesLayer).then((layerView) => {
   *   let query = treesLayer.createQuery();
   *   query.where = "type = 'Quercus'";
   *
   *   treesLayer.queryFeatures(query).then((result) => {
   *     // Remove any previous highlight, if it exists
   *     highlight?.remove();
   *     // Apply the "oaks" highlight options to the corresponding tree features
   *     highlight = layerView.highlight(result.features, {name: "oaks"});
   *   });
   * });
   * @example
   * // Use the default highlights collection to apply a highlight to features when you hover over them
   *
   * // A handler can be used to remove any previous highlight when applying a new one
   * let hoverHighlight;
   *
   * view.on("pointer-move", (event) => {
   *   // Search for the first feature in the featureLayer at the hovered location
   *   view.hitTest(event, { include: layer }).then((response) => {
   *     if (response.results[0]) {
   *       const graphic = response.results[0].graphic;
   *       view.whenLayerView(graphic.layer).then((layerView) => {
   *         // Remove any previous highlight, if it exists
   *         hoverHighlight?.remove();
   *         // Highlight the hit features with the temporary highlight options, which are pre-configured for this use case
   *         hoverHighlight = layerView.highlight(graphic, { name: "temporary" });
   *       });
   *     }
   *   });
   * });
   */
  abstract highlight(target: Graphic | Graphic[] | ObjectId | ObjectId[], options?: LayerViewHighlightOptions): ResourceHandle;
  /**
   * Executes a [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) against aggregate features (i.e. clusters or bins)
   * available for drawing in the layerView
   * and returns a [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/). If query parameters are not provided,
   * all aggregates available for drawing are returned along with their attributes that are available on
   * the client. Fields referenced in statistic queries or in the where clause must first be
   * defined as [aggregate fields](https://developers.arcgis.com/javascript/latest/references/core/layers/support/AggregateField/).
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > This method currently does not support spatial queries (i.e. the [Query.geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry) option and its related properties).
   *
   * @param query - Specifies the parameters of the query. Leave this parameter empty
   *   to query all aggregates in the view.
   * @param options - An object with the following properties.
   * @returns When resolved, returns
   *   a [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/) containing an array of [aggregate features](https://developers.arcgis.com/javascript/latest/references/core/Graphic/#isAggregate).
   * @since 4.25
   * @see [FeatureReductionBinning](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FeatureReductionBinning/)
   * @see [FeatureReductionCluster](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FeatureReductionCluster/)
   * @see [Graphic.isAggregate](https://developers.arcgis.com/javascript/latest/references/core/Graphic/#isAggregate)
   * @example
   * // clustered point layer
   * const layer = new FeatureLayer({
   *   featureReduction: { type: "cluster" }
   * });
   *
   * const layerView = await view.whenLayerView(layer);
   * await reactiveUtils.whenOnce(() => !layerView.updating);
   *
   * // features represents all the clusters in the view
   * const { features } = await layerView.queryAggregates();
   */
  abstract queryAggregates(query?: Query, options?: AbortOptions): Promise<FeatureSet>;
  /**
   * Executes a [AttributeBinsQuery](https://developers.arcgis.com/javascript/latest/references/core/rest/support/AttributeBinsQuery/) against features available for drawing, which groups features into bins based on ranges in numeric or date fields, and returns an
   * [AttributeBinsFeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/AttributeBinsFeatureSet/) containing the series of bins. Please refer to the [AttributeBinsQuery](https://developers.arcgis.com/javascript/latest/references/core/rest/support/AttributeBinsQuery/) document for more detailed information
   * on how to configure the bin parameters.
   *
   * Binned data can condense complex information into meaningful insight. This query allows you to classify data into meaningful categories and summarize the data within each bin with summary statistics.
   * Binned data can be effectively visualized in histograms (or bar charts), providing clearer insights into data distributions and trends.
   * It can reveal underlying patterns that might be obscured in raw data. For example, bins can show concentrations of values in common ranges.
   *
   * > [!WARNING]
   * >
   * > **Notes**
   * > The `queryAttributeBins()` method is unrelated to querying bins in [FeatureReductionBinning](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FeatureReductionBinning/).
   *
   * @param binsQuery - Specifies the parameters of the `queryAttributeBins()` operation. The [AttributeBinsQuery.binParameters](https://developers.arcgis.com/javascript/latest/references/core/rest/support/AttributeBinsQuery/#binParameters) property must be set.
   * @param options - An object with the following properties.
   * @returns When resolved, returns a [AttributeBinsFeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/AttributeBinsFeatureSet/) containing
   * a series of bins. Each feature in the AttributeBinsFeatureSet represents a bin. The attributes of each feature contains statistics summarizing the data in the bin, including count, average, standard deviation, etc.
   * @since 4.32
   * @see [AttributeBinsQuery](https://developers.arcgis.com/javascript/latest/references/core/rest/support/AttributeBinsQuery/)
   * @see [Sample - Attribute Bins Query](https://developers.arcgis.com/javascript/latest/sample-code/query-attribute-bins/)
   * @example
   * // Query the temperature field in the feature layer and create a histogram
   * // Analyze temperature data over a year, create 100 bins for different temperature ranges
   * // to assess frequency and identify patterns.
   * const binQuery = new AttributeBinsQuery({
   *   where: "UnitTop = 0",
   *   binParameters: new AutoIntervalBinParameters({
   *     bins: 100,
   *     field: "temp",
   *     start: 0, // lowest temp value to be included in the bin query
   *     end: 30 // highest temp value to be included
   *   })
   * });
   *
   * layerView.queryAttributeBins(query).then((results) => {
   *   const bins = results.features.map((bin) => {
   *     return {
   *       minValue: bin.attributes.lowerBoundary,
   *       maxValue: bin.attributes.upperBoundary,
   *       count: bin.attributes.temperature_count,
   *     };
   *   });
   *
   *   // get the lower boundary of the first bin
   *   const min = results.features[0].attributes.lowerBoundary;
   *   // get the upper boundary of the last bin
   *   const max = results.features[results.features.length - 1].attributes.upperBoundary;
   *   // calculate the average for the bins
   *   const average = results.features[0].attributes.lowerBoundary + results.features[results.features.length - 1].attributes.upperBoundary) / 2;
   *
   *   const histogram = new Histogram({
   *     container: "histogramDiv",
   *     bins: bins,
   *     min: min,
   *     max: max,
   *     average: average,
   *     barCreatedFunction:(index, element) => {
   *       element.setAttribute("fill", "#FFA500");
   *       element.setAttribute("opacity", 0.5);
   *     },
   *     labelFormatFunction: (value, type) => {
   *       return (Math.round(value)).toLocaleString();
   *     },
   *     dataLines: [{
   *       value: histogram.min,
   *       label: histogram.min.toLocaleString()
   *     }, {
   *       value: histogram.average,
   *       label: histogram.average.toLocaleString()
   *     }, {
   *       value: histogram.max,
   *       label: histogram.max.toLocaleString()
   *     }]
   *   });
   * });
   */
  abstract queryAttributeBins(binsQuery: AttributeBinsQuery, options?: AbortOptions): Promise<AttributeBinsFeatureSet>;
  /**
   * Executes a [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) against features available for drawing in the layerView and
   * returns the [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) of features that satisfy the query.
   *
   * > [!WARNING]
   * >
   * > **Notes**
   * >
   * > - Attribute values used in attribute queries executed against LayerViews are case sensitive.
   * > - Ensure the fields being queried are included in the [availableFields](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#availableFields) list; otherwise, the query may fail or return incomplete results.
   * > - To get an extent of all the features in a layer rather than only those currently available on the client,
   * >   check the [hasAllFeatures](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#hasAllFeatures) property on the LayerView.
   * >   If `hasAllFeatures` is `true`, then `queryExtent()` on the LayerView returns an `extent` based on all features available in the layer
   * >   that satisfy the query, not just those currently loaded on the client.
   * >   Otherwise, use `queryExtent()` on the Layer to get the extent based on all features available in the layer that satisfy the query.
   * > - Spatial queries can be performed on quantized geometries within the LayerView. The resolution of these geometries is
   * >   only as precise as the scale [View2D.resolution](https://developers.arcgis.com/javascript/latest/references/core/views/View2D/#resolution) of the view.
   * >   Geometries returned from any LayerView query will match the view's scale resolution.
   * >   To retrieve feature geometries at full resolution, first check the LayerView's [hasFullGeometries](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#hasFullGeometries) property. If it is `true`,
   * >   use the `queryExtent()` method on the LayerView; otherwise, use the `queryExtent()` method on the Layer.
   * > - Spatial queries have the same limitations as those listed in the [projectOperator](https://developers.arcgis.com/javascript/latest/references/core/geometry/operators/projectOperator/) documentation.
   * > - Spatial queries are not currently supported if the layerView has any of the following [SpatialReferences](https://developers.arcgis.com/javascript/latest/references/core/geometry/SpatialReference/):
   * >   - GDM 2000 (4742) – Malaysia
   * >   - Gusterberg (Ferro) (8042) – Austria/Czech Republic
   * >   - ISN2016 (8086) - Iceland
   * >   - SVY21 (4757) - Singapore
   *
   * @param query - Specifies the attributes and spatial filter of the query.
   * When no parameters are passed to this method, all features in the client are returned. To only return features
   * visible in the view, set the `geometry` parameter in the query object to the view's extent.
   * @param options - An object with the following properties.
   * @returns When resolved, returns the extent and count of the features
   * that satisfy the input query. See the object specification table below for details.
   * Property | Type | Description
   * ---------|------|-------------
   * count | Number | The number of features that satisfy the input query.
   * extent | [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) \| null | The extent of the features that satisfy the query.
   * @example
   * let layer = new CSVLayer({
   *   url: csvUrl  // URL to a csv file
   * });
   *
   * const layerView = await view.whenLayerView(layer);
   * await reactiveUtils.whenOnce(() => !layerView.updating);
   *
   * const results = await layerView.queryExtent()
   * view.goTo(results.extent);  // go to the extent of all the graphics in the layerView
   * @example
   * // Expand the extent so that a feature (i.e. point feature)
   * // won't be off screen after the end of goTo animation.
   * const { extent } = await layerView.queryExtent()
   * const zoomScale = 16000;
   * extent.expand((zoomScale / view.scale) * view.resolution);
   * view.goTo(extent);
   */
  abstract queryExtent(query?: QueryProperties | null | undefined, options?: AbortOptions): Promise<any>;
  /**
   * Executes a [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) against features available for drawing in the layerView
   * and returns the number of features that satisfy the query. If query parameters are not provided,
   * the count of all features available for drawing is returned.
   *
   * > [!WARNING]
   * >
   * > **Notes**
   * >
   * > - Attribute values used in attribute queries executed against LayerViews are case sensitive.
   * > - Ensure the fields being queried are included in the [availableFields](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#availableFields) list; otherwise, the query may fail or return incomplete results.
   * > - To get a count of all features in a layer rather than only those currently available on the client,
   * >   check the [hasAllFeatures](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#hasAllFeatures) property on the LayerView.
   * >   If `hasAllFeatures` is `true`, then `queryFeatureCount()` on the LayerView returns the count of all features from the entire dataset
   * >   that satisfy the query, not just those currently loaded on the client.
   * >   Otherwise, use `queryFeatureCount()` on the layer to get the count based on all features available in the layer that satisfy the query.
   * > - Spatial queries can be performed on quantized geometries within the LayerView. The resolution of these geometries is
   * >   only as precise as the scale [View2D.resolution](https://developers.arcgis.com/javascript/latest/references/core/views/View2D/#resolution) of the view.
   * >   Geometries returned from any LayerView query will match the view's scale resolution.
   * >   To retrieve feature geometries at full resolution, first check the LayerView's [hasFullGeometries](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#hasFullGeometries) property. If it is `true`,
   * >   use the `queryFeatureCount()` method on the LayerView; otherwise, use the `queryFeatureCount()` method on the Layer.
   * > - Spatial queries have the same limitations as those listed in the [projectOperator](https://developers.arcgis.com/javascript/latest/references/core/geometry/operators/projectOperator/) documentation.
   * > - Spatial queries are not currently supported if the layerView has any of the following [SpatialReferences](https://developers.arcgis.com/javascript/latest/references/core/geometry/SpatialReference/):
   * >   - GDM 2000 (4742) – Malaysia
   * >   - Gusterberg (Ferro) (8042) – Austria/Czech Republic
   * >   - ISN2016 (8086) - Iceland
   * >   - SVY21 (4757) - Singapore
   *
   * @param query - Specifies the attributes and spatial filter of the query.
   * When no parameters are passed to this method, all features in the client are returned. To only return features
   * visible in the view, set the `geometry` parameter in the query object to the view's extent.
   * @param options - An object with the following properties.
   * @returns When resolved, returns the number of features satisfying the query.
   * @example
   * view.on("click", (event) => {
   *   let query = new Query();
   *   query.geometry = event.mapPoint;  // obtained from a view click event
   *   query.spatialRelationship = "intersects";
   *
   *   const layerView = await view.whenLayerView(layer);
   *   await reactiveUtils.whenOnce(() => !layerView.updating);
   *
   *   const count = await layerView.queryFeatureCount(query);
   *   console.log(count);  // prints the number of the client-side graphics that satisfy the query
   * });
   * @example
   * const layerView = await view.whenLayerView(layer);
   * const count = await layerView.queryFeatureCount()
   * console.log(count);  // prints the total number of client-side graphics to the console
   */
  abstract queryFeatureCount(query?: QueryProperties | null | undefined, options?: AbortOptions): Promise<number>;
  /**
   * Executes a [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) against features available for drawing in the LayerView
   * and returns a [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/). If query parameters are not provided,
   * then a default query is created using [createQuery()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#createQuery)
   * method and all features that pass the layer view [filter](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#filter) are returned along with their attributes
   * that are [available on the client](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#availableFields).
   *
   * > [!WARNING]
   * >
   * > **Notes**
   * >
   * > - Attribute values used in attribute queries executed against LayerViews are case sensitive.
   * > - Ensure the fields being queried are included in the [availableFields](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#availableFields) list; otherwise, the query may fail or return incomplete results.
   * > - To execute a query against all features in a layer rather than only those currently available on the client, check the [hasAllFeatures](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#hasAllFeatures)
   * >   property on the LayerView. If `hasAllFeatures` is `true`, then `queryFeatures()` on the LayerView returns all features from the entire dataset
   * >   that satisfy the query, not just those currently loaded on the client.
   * >   Otherwise, use `queryFeatures()` on the layer to query against all features available in the layer that satisfy the query.
   * > - Spatial queries can be performed on quantized geometries within the LayerView. The resolution of these geometries is
   * >   only as precise as the scale [View2D.resolution](https://developers.arcgis.com/javascript/latest/references/core/views/View2D/#resolution) of the view.
   * >   Geometries returned from any LayerView query will match the view's scale resolution.
   * >   To retrieve feature geometries at full resolution, first check the LayerView's [hasFullGeometries](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#hasFullGeometries) property. If it is `true`,
   * >   use the `queryFeatures()` method on the LayerView; otherwise, use the `queryFeatures()` method on the Layer.
   * > - Spatial queries have the same limitations as those listed in the [projectOperator](https://developers.arcgis.com/javascript/latest/references/core/geometry/operators/projectOperator/) documentation.
   * > - Spatial queries are not currently supported if the FeatureLayerView has any of the following [SpatialReferences](https://developers.arcgis.com/javascript/latest/references/core/geometry/SpatialReference/):
   * >   - GDM 2000 (4742) – Malaysia
   * >   - Gsterberg (Ferro) (8042) – Austria/Czech Republic
   * >   - ISN2016 (8086) - Iceland
   * >   - SVY21 (4757) - Singapore
   *
   * @param query - Specifies the attributes and spatial filter of the query.
   * When this parameter is not passed to `queryFeatures()` method, then a default query is created using [createQuery()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#createQuery)
   * method and all features that pass the layer view [filter](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#filter) are returned along with their attributes
   * that are [available on the client](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#availableFields). To only return features
   * visible in the view, set the `geometry` parameter in the query object to the view's extent.
   * @param options - An object with the following properties.
   * @returns When resolved, a [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/) containing
   * an array of graphic features is returned.
   * @see [Sample - Query FeatureLayerView](https://developers.arcgis.com/javascript/latest/sample-code/featurelayerview-query/)
   * @see [Sample - Query statistics client-side by distance](https://developers.arcgis.com/javascript/latest/sample-code/featurelayerview-query-distance/)
   * @see [Sample - Query statistics by geometry](https://developers.arcgis.com/javascript/latest/sample-code/featurelayerview-query-geometry/)
   * @see [Sample - Query statistics client-side](https://developers.arcgis.com/javascript/latest/sample-code/featurelayerview-query-stats/)
   * @see [Query and filter guide](https://developers.arcgis.com/javascript/latest/query-filter/)
   * @example
   * let layer = new FeatureLayer({
   *   url: fsUrl  // points to a Feature Service layer url
   * });
   *
   * let query = new Query();
   * query.geometry = new Extent({
   *  xmin: -9177811,
   *  ymin: 4247000,
   *  xmax: -9176791,
   *  ymax: 4247784,
   *  spatialReference: 102100
   * });
   * query.spatialRelationship = "intersects";
   *
   * const layerView = await view.whenLayerView(layer);
   * await reactiveUtils.whenOnce(() => !layerView.updating);
   *
   * const results = await layerView.queryFeatures(query);
   * console.log(results.features);  // prints the array of client-side graphics to the console
   * @example
   * let layer = new FeatureLayer({
   *   url: fsUrl  // points to a Feature Service layer url
   * });
   *
   * // returns all the graphics from the layerView
   * const layerView = await view.whenLayerView(layer);
   * await reactiveUtils.whenOnce(() => !layerView.updating);
   *
   * const results = await layerView.queryFeatures()
   * console.log(results.features); // prints all the client-side graphics to the console
   * @example
   * layerView.queryFeatures({
   *   geometry: mapPoint,
   *   // 6 pixels around a point at the view resolution to query around a finger.
   *   distance: view.resolution * 6,
   * });
   */
  abstract queryFeatures(query?: QueryProperties | null | undefined, options?: AbortOptions): Promise<FeatureSet>;
  /**
   * Executes a [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) against features available for drawing in
   * the layerView and returns array of the ObjectIDs of features that satisfy the input query. If
   * query parameters are not provided, the ObjectIDs of all features available for drawing are returned.
   *
   * > [!WARNING]
   * >
   * > **Notes**
   * >
   * > - Attribute values used in attribute queries executed against LayerViews are case sensitive.
   * > - Ensure the fields being queried are included in the [availableFields](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#availableFields) list; otherwise,
   * >   the query may fail or return incomplete results.
   * > - To execute a query against all features in a layer rather than only those currently available on the client,
   * >   check the [hasAllFeatures](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#hasAllFeatures) property on the LayerView.
   * >   If `hasAllFeatures` is `true`, then `queryObjectIds()` on the LayerView returns all features from the entire dataset
   * >   that satisfy the query, not just those currently loaded on the client.
   * >   Otherwise, use `queryObjectIds()` on the layer to query against all features available in the layer that satisfy the query.
   * > - Spatial queries can be performed on quantized geometries within the LayerView. The resolution of these geometries is
   * >   only as precise as the scale [View2D.resolution](https://developers.arcgis.com/javascript/latest/references/core/views/View2D/#resolution) of the view.
   * >   Geometries returned from any LayerView query will match the view's scale resolution.
   * >   To retrieve feature geometries at full resolution, first check the LayerView's [hasFullGeometries](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#hasFullGeometries) property. If it is `true`,
   * >   use the `queryObjectIds()` method on the LayerView; otherwise, use the `queryObjectIds()` method on the Layer.
   * > - Spatial queries have the same limitations as those listed in the [projectOperator](https://developers.arcgis.com/javascript/latest/references/core/geometry/operators/projectOperator/) documentation.
   * > - Spatial queries are not currently supported if the layerView has any of the following [SpatialReferences](https://developers.arcgis.com/javascript/latest/references/core/geometry/SpatialReference/):
   * >   - GDM 2000 (4742) – Malaysia
   * >   - Gusterberg (Ferro) (8042) – Austria/Czech Republic
   * >   - ISN2016 (8086) - Iceland
   * >   - SVY21 (4757) - Singapore
   *
   * @param query - Specifies the attributes and spatial filter of the query.
   * When no parameters are passed to this method, all features in the client are returned. To only return features
   * visible in the view, set the `geometry` parameter in the query object to the view's extent.
   * @param options - An object with the following properties.
   * @returns When resolved, returns an array representing the ObjectIDs of the features
   *                   satisfying the query.
   * @example
   * view.on("click", async (event) => {
   *   let query = new Query();
   *   query.geometry = event.mapPoint;  // obtained from a view click event
   *   query.spatialRelationship = "intersects";
   *
   *   const layerView = await view.whenLayerView(layer)
   *   await reactiveUtils.whenOnce(() => !layerView.updating);
   *
   *   const ids = await layerView.queryObjectIds(query);
   *   console.log(ids);  // prints the ids of the client-side graphics to the console=
   * });
   * @example
   * // returns all the Ids from the graphics in the layerView
   * view.whenLayerView(layer).then(function(layerView){
   *   return layerView.queryObjectIds()
   * }).then(function(ids){
   *   console.log(ids);  // prints the ids of all the client-side graphics to the console
   * });
   */
  abstract queryObjectIds(query?: QueryProperties | null | undefined, options?: AbortOptions): Promise<ObjectId[]>;
}