import type Point from "../../geometry/Point.js";
import type SpatialReference from "../../geometry/SpatialReference.js";
import type GeographicTransformation from "../../geometry/operators/support/GeographicTransformation.js";
import type QuantizationParameters from "./QuantizationParameters.js";
import type StatisticDefinition from "./StatisticDefinition.js";
import type TimeExtent from "../../time/TimeExtent.js";
import type { JSONSupport } from "../../core/JSONSupport.js";
import type { GeometryUnion } from "../../geometry/types.js";
import type { DatumTransformation, SQLFormat } from "../../portal/jsonTypes.js";
import type { ObjectId } from "../../views/types.js";
import type { MeshProperties } from "../../geometry/Mesh.js";
import type { PolylineProperties } from "../../geometry/Polyline.js";
import type { PolygonProperties } from "../../geometry/Polygon.js";
import type { PointProperties } from "../../geometry/Point.js";
import type { MultipointProperties } from "../../geometry/Multipoint.js";
import type { ExtentProperties } from "../../geometry/Extent.js";
import type { SpatialReferenceProperties } from "../../geometry/SpatialReference.js";
import type { StatisticDefinitionProperties } from "./StatisticDefinition.js";
import type { QuantizationParametersProperties } from "./QuantizationParameters.js";
import type { TimeExtentProperties } from "../../time/TimeExtent.js";

export interface QueryProperties extends Partial<Pick<Query, "aggregateIds" | "cacheHint" | "datumTransformation" | "distance" | "gdbVersion" | "geometryPrecision" | "groupByFieldsForStatistics" | "having" | "maxAllowableOffset" | "maxRecordCountFactor" | "multipatchOption" | "num" | "objectIds" | "orderByFields" | "outFields" | "parameterValues" | "rangeValues" | "relationParameter" | "returnCentroid" | "returnDistinctValues" | "returnExceededLimitFeatures" | "returnGeometry" | "returnM" | "returnQueryGeometry" | "returnTrueCurves" | "returnZ" | "spatialRelationship" | "sqlFormat" | "start" | "text" | "units" | "where">> {
  /**
   * The geometry to apply to the spatial filter. The [spatialRelationship](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#spatialRelationship)
   * will indicate how the geometry should be used to query features.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > [Mesh](https://developers.arcgis.com/javascript/latest/references/core/geometry/Mesh/) geometry types are currently not supported.
   */
  geometry?: ((ExtentProperties & { type: "extent" }) | (MultipointProperties & { type: "multipoint" }) | (PointProperties & { type: "point" }) | (PolygonProperties & { type: "polygon" }) | (PolylineProperties & { type: "polyline" }) | (MeshProperties & { type: "mesh" })) | null;
  /**
   * The historic moment to query. This parameter applies only if the `supportsQueryWithHistoricMoment`
   * capability of the service being queried is `true`. This setting is provided in the layer resource.
   */
  historicMoment?: (Date | number | string) | null;
  /**
   * The spatial reference for the returned geometry. If not specified, the geometry is returned in the spatial
   * reference of the queried layer.
   */
  outSpatialReference?: SpatialReferenceProperties | null;
  /**
   * The definitions for one or more field-based statistics to be calculated. If `outStatistics` is specified the only other query parameters
   * that should be used are [groupByFieldsForStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#groupByFieldsForStatistics), [orderByFields](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#orderByFields), [returnDistinctValues](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnDistinctValues),
   * [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry), [text](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#text), [timeExtent](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#timeExtent) and [where](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#where).
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > For service-based queries, `outStatistics` is only supported on layers where `supportsStatistics = true`.
   *
   * @example
   * let query = new Query();
   * let statisticDefinition = new StatisticDefinition({
   *   statisticType: "sum",
   *   onStatisticField: "POP2000",
   *   outStatisticFieldName: "TotalPop"
   * });
   *
   * query.outStatistics = [ statisticDefinition ];
   */
  outStatistics?: StatisticDefinitionProperties[] | null;
  /**
   * Specifies the pixel level to be identified on the X and Y axis. Defaults to the base resolution of the
   * dataset if not specified. Applicable only to Image Service layers.
   */
  pixelSize?: PointProperties | null;
  /**
   * Used to project the geometry onto a virtual grid, likely representing
   * pixels on the screen. Geometry coordinates are converted to integers
   * by building a grid with a resolution matching the `quantizationParameters.tolerance`.
   * Each coordinate is then snapped to one pixel on the grid.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > Only supported with ArcGIS Online hosted services or ArcGIS Enterprise 10.6.1 services.
   *
   * @example
   * let query = new Query();
   * query.quantizationParameters = {
   *   mode: "view",
   *   originPosition: "upper-left",
   *   tolerance: 4820,
   *   extent: layer.fullExtent
   * };
   */
  quantizationParameters?: QuantizationParametersProperties | null;
  /**
   * A time extent for a temporal query against [time-aware layers](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#timeInfo).
   * For example, it can be used to discover all crimes that occurred during the
   * night shift from 10 PM to 6 AM on a particular date.
   *
   * @example
   * let layer = new FeatureLayer( ... );
   * let timeExtent = new TimeExtent({
   *   start: new Date(1992, 0, 1),
   *   end: new Date(1992, 11, 31)
   * });
   * let timeQuery = new Query({
   *   timeExtent: timeExtent
   * });
   * layerView.queryFeatures(timeQuery).then(function(featureSet) { ... });
   */
  timeExtent?: TimeExtentProperties | null;
}

/**
 * Range value to filter features from the layer that are within the specified range values.
 *
 * @see [rangeValues](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#rangeValues)
 */
export interface RangeValue {
  /** The range id. */
  name: string;
  /** Single value or value range. */
  value: number | [
      number,
      number
  ];
}

/**
 * * [Attribute queries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#attribute)
 *   * [Numbers and strings](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#number-string-query)
 *   * [Date and times](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#date-query)
 * * [Spatial queries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#spatial)
 * * [Temporal queries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#temporal)
 * * [Statistic queries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#statistic)
 *
 * This class defines parameters for executing queries for features from a layer or layer view.
 * Once a Query object's properties are defined, it can then be passed into an executable function, which will
 * return the features in a [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/).
 *
 * There are three types of queries: attribute, spatial, and statistic queries. You can query for features
 * in one of these categories or use elements of each in a single query.
 *
 * <span id="attribute"></span>
 * ## Attribute queries
 *
 * <span id="number-string-query"></span>
 * #### Number and strings
 * To query features based on attribute values, specify a SQL where clause in the [where](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#where) property.
 * You can optionally use the [text](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#text) property for a `LIKE` statement. Setting the [outFields](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outFields)
 * of the query will limit the attributes returned from the query. This can improve the speed of the query
 * if your app doesn't require all the attributes for each feature.
 *
 * For example, you can use [where](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#where) to query all counties in the state of Washington
 * from a layer representing U.S. Counties:
 *
 * ```js
 * const query = featureLayer.createQuery();
 * query.where = "STATE_NAME = 'Washington'";
 * query.outFields = [ "STATE_NAME", "COUNTY_NAME", "POPULATION", "(POPULATION / AREA) as 'POP_DENSITY'" ];
 *
 * // To return a feature set containing the attributes: STATE_NAME, COUNTY_NAME, POPULATION, and POP_DENSITY.
 * const featureSet = await featureLayer.queryFeatures(query)
 * ```
 * <span id="date-query"></span>
 * #### Date and times
 *
 * When querying features based on `date`, `date-only`, `time-only` and `timestamp-offset` field types
 * the `DATE`, `TIMESTAMP` or `TIME` SQL functions should be used to make sure the query returns correct results.
 * The following snippets demonstrate how the date functions can be constructed with the functions mentioned above.
 *
 * ```js
 * <DateField> = DATE 'YYYY-MM-DD'
 * <DateField> = TIMESTAMP 'YYYY-MM-DD HH:MI:SS'
 * <DateOnlyField> = DATE 'YYYY-MM-DD'
 * <TimeOnlyField> = TIME 'HH:MM:SS'
 * <TimestampOffsetField> = TIMESTAMP 'YYYY-MM-DD HH:MI:SS +/-UTC offset'
 * ```
 *
 * Date values are stored as epoch values in `date` field. Epoch time describes a point in time as the number
 * of seconds since `00:00:00 Thursday, 1 January 1970 (UTC)`.
 * A `date` field can be associated with a specific time zone. When querying values from a date field, you may need to convert dates to match the time zone of the field.
 * Use the [FieldsIndex.getTimeZone()](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FieldsIndex/#getTimeZone) method to identify the time zone of a date field.
 * For example, if your service has two date fields, one in `America/Los_Angeles` and the other in `America/New_York`, then date queries need to be crafted specifically for each field.
 * If the desired query date is `01/01/2012 11:20:00 PM GMT` then the resulting query could be:
 *
 * `query.where = "DateTime_PST = TIMESTAMP '2012-01-01 15:20:00"`, or
 *
 * `query.where = "DateTime_EST = TIMESTAMP '2012-01-01 18:20:00"`.
 *
 * ```js
 * // Query for features that recorded on January 1, 2012 9:00:00 AM GMT
 * // DateTime_PST date field values are in PST. Must adjust the epoch values to PST
 *
 * const queryDate = new Date(1325408400000); // 01/01/2012 9:00:00 AM GMT
 * let queryFields = ["DateTime_PST"];
 *
 * // get the timezone of the DateTime_PST date field
 * const fieldTimeZone = layer.fieldsIndex.getTimeZone("DateTime_PST") ;
 *
 * // we need to adjust the date value to match the time zone of the field.
 * const where = `DateTime_PST < DATE '${getDateForTimeZone(queryDate, fieldTimeZone)}'`
 * layerView.filter = new FeatureFilter({
 *   where
 * });
 * runQueries(where, queryFields);
 *
 * // This function conveniently formats a dates in terms of the parsed time zone.
 * function getDateForTimeZone(queryDate, timezone) {
 *
 *   // adjust the given date field to the timezone of the date field
 *   const zonedDate = new Date(
 *     queryDate.toLocaleString("en-US", {
 *       timeZone: timezone
 *     })
 *   );
 *   const pad = (value) => String(value).padStart(2, "0");
 *   const month = pad(zonedDate.getMonth() + 1);
 *   const day = pad(zonedDate.getDate())
 *   const year = zonedDate.getFullYear();
 *   const hour = pad(zonedDate.getHours());
 *   const minutes = pad(zonedDate.getMinutes());
 *   const seconds = pad(zonedDate.getSeconds());
 *
 *   return `${year}-${month}-${day} ${hour}:${minutes}:${seconds}`;
 * }
 * ```
 *
 * Please refer to [Querying Feature Services: Date-Time Queries](https://www.esri.com/arcgis-blog/products/api-rest/data-management/querying-feature-services-date-time-queries/) and
 * [REST API - Date-time queries](https://developers.arcgis.com/rest/services-reference/enterprise/query-feature-service-layer/#date-time-queries) documents
 * to learn more about how to query date-time values.
 *
 * <span id="spatial"></span>
 * ## Spatial queries
 *
 * You can query features by geometry/location. While [where](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#where) is not required in this
 * workflow, you can use `where` as part of the query to get more refined results.
 *
 * To execute a spatial query, you must set the [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry) parameter to a
 * [Geometry](https://developers.arcgis.com/javascript/latest/references/core/geometry/Geometry/) object and specify a valid [spatialRelationship](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#spatialRelationship).
 * You can optionally provide a query [distance](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#distance) and [units](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#units) to query features against a buffer
 * around the given geometry.
 *
 * For example, to query for all features within 2 miles of a mouse move, you would do the following:
 *
 * ```js
 * view.on("pointer-move", async (event) => {
 *   const query = featureLayer.createQuery();
 *   query.geometry = view.toMap(event);  // the point location of the pointer
 *   query.distance = 2;
 *   query.units = "miles";
 *   query.spatialRelationship = "intersects";  // this is the default
 *   query.returnGeometry = true;
 *   query.outFields = ["POPULATION"];
 *
 *   // The following line returns features within two miles of the pointer's location
 *   const { features } = await featureLayer.queryFeatures(query);
 * });
 * ```
 *
 * You could also use `where`, for example, to return all features with a population greater than 10,000 within
 * the 2-mile buffer.
 *
 * > [!WARNING]
 * >
 * > **Known Limitations**
 * >
 * > For client side spatial queries on 3D Object SceneLayerView the [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) of the feature
 * > is used when evaluating the spatial relationship with the [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry). This means that a feature might be
 * > returned from the query, even though its footprint is not in a spatial relationship with the [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry).
 *
 * <span id="temporal"></span>
 * ## Temporal queries
 *
 * You can query features based on a given time range by specifying the [timeExtent](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#timeExtent) property. The temporal query will return
 * results only if the feature service is published with [FeatureLayer.timeInfo](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#timeInfo) information. The temporal
 * query can also be combined with attribute and geometry queries.
 *
 * For example, you can use [timeExtent](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#timeExtent) and [where](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#where) parameters to query specified hurricane tracks
 * within a given time extent.
 *
 * ```js
 * // query katrina tracks that took place in Aug 30 - Aug 31, 2005
 * const query = new Query({
 *   outFields: ["Name, WindSpeed"],
 *   where: "Name = 'Katrina'",
 *   timeExtent: {
 *     start: new Date(2005, 7, 30),
 *     end: new Date(2005, 7, 31)
 *   }
 * });
 * const { features } = await featureLayer.queryFeatures(query);
 * ```
 *
 * <span id="statistic"></span>
 * ## Statistic queries
 *
 * Rather than return individual features from a query, you can return statistics
 * for field attributes and expressions. Statistic queries are defined by the [outStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outStatistics)
 * parameter, which requires an array of [StatisticDefinition](https://developers.arcgis.com/javascript/latest/references/core/rest/support/StatisticDefinition/) objects.
 *
 * For example, you can query for the average and total population of counties in the layer mentioned above
 * in the following manner:
 *
 * ```js
 *
 * // query for the sum of the population in all features
 * const sumPopulation = {
 *   onStatisticField: "POP_2015",  // service field for 2015 population
 *   outStatisticFieldName: "Pop_2015_sum",
 *   statisticType: "sum"
 * };
 *
 * // query for the average population in all features
 * const avgPopulation = {
 *   onStatisticField: "POP_2015",  // service field for 2015 population
 *   outStatisticFieldName: "Pop_2015_avg",
 *   statisticType: "avg"
 * };
 *
 * // Notice that you can pass a SQL expression as a field name to calculate statistics
 * const populationChangeDefinition = {
 *   onStatisticField: "POP_2015 - POP_2010",  // service field for 2015 population
 *   outStatisticFieldName: "avg_pop_change_2015_2010",
 *   statisticType: "avg"
 * };
 *
 * const query = layer.createQuery();
 * query.where = "STATE_NAME = 'Washington'";
 * query.outStatistics = [sumPopulation, avgPopulation, populationChangeDefinition];
 *
 * const { feature } = await featureLayer.queryFeatures(query);
 * const { attributes } = features[0];
 *
 * console.log(`The total population in WA is ${attributes.Pop_2015_sum}`);
 * console.log(`The average population in WA counties is ${attributes.Pop_2015_avg}`);
 * console.log(`The average population change in WA counties is ${attributes.avg_pop_change_2015_2010}`);
 * ```
 *
 * <span id="working-with-results"></span>
 * ## Working with results
 *
 * Query results can be used in a number of ways depending on the use case. Consider the following
 * parameters which impact the format of the resulting feature set.
 *
 * * [returnGeometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnGeometry) - Returning a geometry is useful for displaying results back
 *   in the view as graphics, or for conducting further spatial analysis. If the geometry isn't necessary
 *   in your workflow, then don't request it to improve app performance.
 * * [outStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outStatistics) - Querying for statistics will never return features from the layer,
 *   only an object with number properties for the requested statistics.
 * * [returnDistinctValues](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnDistinctValues) - Returns the unique values that exist in a field as an
 *   array of strings, so no features are returned when this parameter is true.
 *
 * > [!WARNING]
 * >
 * > The fields in the query needs to be available and listed in the [FeatureLayerView.availableFields](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/#availableFields) or [SceneLayerView.availableFields](https://developers.arcgis.com/javascript/latest/references/core/views/layers/SceneLayerView/#availableFields).
 * > Define them either in [FeatureLayer.outFields](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#outFields) or [SceneLayer.outFields](https://developers.arcgis.com/javascript/latest/references/core/layers/SceneLayer/#outFields).
 *
 * @since 4.20
 * @see [FeatureLayer.createQuery()](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#createQuery)
 * @see [FeatureLayer.queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#queryFeatures)
 * @see [FeatureLayerView.queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/#queryFeatures)
 * @see [CSVLayer.queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/layers/CSVLayer/#queryFeatures)
 * @see [SceneLayer.queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/layers/SceneLayer/#queryFeatures)
 * @see [SceneLayerView.queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/SceneLayerView/#queryFeatures)
 * @see [Query and filter guide](https://developers.arcgis.com/javascript/latest/query-filter/)
 * @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](https://developers.arcgis.com/javascript/latest/references/core/rest/query/)
 */
export default class Query extends JSONSupport {
  constructor(properties?: QueryProperties);
  /**
   * An array of Object IDs representing [aggregate](https://developers.arcgis.com/javascript/latest/references/core/Graphic/#isAggregate) (i.e. cluster) graphics. This property should be used to query features represented
   * by one or more cluster graphics with the given Object IDs.
   *
   * This is useful in the following scenarios:
   *
   * - To display features included in the cluster as a collection of graphics.
   * - To push clustered features to the view's popup for browsing.
   * - To display statistics of features included in the cluster in the popup.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > This property only applies to [LayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/LayerView/) query methods. Support for server-side
   * > queries is being considered for a future release.
   *
   * @example
   * // Will execute query for features represented by the clusterGraphic
   * if (clusterGraphic.isAggregate) {
   *   query.aggregateIds = [clusterGraphic.getObjectId()];
   * }
   */
  accessor aggregateIds: ObjectId[] | null | undefined;
  /**
   * Indicates if the service should cache the query results. It only applies if the layer's
   * [capabilities.query.supportsCacheHint](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#capabilities) is set to `true`.
   * Use only for queries that have the same parameters every time the app is used.
   * Some examples of cacheable queries:
   * * Queries that fetch [statistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outStatistics) or [features](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnGeometry) on app load.
   * * Queries based on [preset input](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#where), for example, a drop-down list of US states.
   * * Queries based on [preset extents](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry), for example bookmarks, in web maps.
   */
  accessor cacheHint: boolean | null | undefined;
  /**
   * Datum transformation used for projecting geometries in the query results when
   * [outSpatialReference](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outSpatialReference) is different from the layer's spatial reference.
   * Requires ArcGIS Server service 10.5 or greater.
   */
  accessor datumTransformation: DatumTransformation | GeographicTransformation | null | undefined;
  /**
   * Specifies a search distance from a given [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry) in a spatial query.
   * The [units property](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#units) indicates the unit of measurement. In essence, setting this property
   * creates a buffer at the specified size around the input [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry). The query will use that
   * buffer to return features in the layer or layer view that adhere to the to the indicated [spatial relationship](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#spatialRelationship).
   *
   * If querying a feature service, the [supportsQueryWithDistance](https://developers.arcgis.com/rest/services-reference/query-feature-service-layer-.htm)
   * capability must be `true`.
   */
  accessor distance: number | null | undefined;
  /** Specifies the geodatabase version to display for feature service queries. */
  accessor gdbVersion: string | null | undefined;
  /**
   * The geometry to apply to the spatial filter. The [spatialRelationship](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#spatialRelationship)
   * will indicate how the geometry should be used to query features.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > [Mesh](https://developers.arcgis.com/javascript/latest/references/core/geometry/Mesh/) geometry types are currently not supported.
   */
  get geometry(): GeometryUnion | null | undefined;
  set geometry(value: ((ExtentProperties & { type: "extent" }) | (MultipointProperties & { type: "multipoint" }) | (PointProperties & { type: "point" }) | (PolygonProperties & { type: "polygon" }) | (PolylineProperties & { type: "polyline" }) | (MeshProperties & { type: "mesh" })) | null | undefined);
  /** Specifies the number of decimal places for geometries returned by the [JSON query operation](https://developers.arcgis.com/javascript/latest/references/core/rest/query/#executeQueryJSON). */
  accessor geometryPrecision: number | null | undefined;
  /**
   * Used only in [statistical queries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#statistic). When one or more field names are provided in this property, the output
   * statistics will be grouped based on unique values from those fields. This is only valid when
   * [outStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outStatistics) has been defined.
   *
   * @example
   * query.outStatistics = [{
   *   onStatisticField: "CUSTOMERS",
   *   outStatisticFieldName: "avg_customers",
   *   statisticType: "avg"
   * }, {
   *   onStatisticField: "RATING",
   *   outStatisticFieldName: "min_rating",
   *   statisticType: "min"
   * }, {
   *   onStatisticField: "1=1",
   *   outStatisticFieldName: "total_businesses",
   *   statisticType: "count"
   * }];
   * query.groupByFieldsForStatistics = [ "region" ];
   *
   * // query the above stats for each region in the layer
   * layer.queryFeatures(query).then(displayResults);
   */
  accessor groupByFieldsForStatistics: string[] | null | undefined;
  /**
   * A condition used with [outStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outStatistics) and [groupByFieldsForStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#groupByFieldsForStatistics)
   * to limit query results to groups that
   * satisfy the aggregation function(s).
   *
   * The following aggregation functions are supported in this clause: `MIN` | `MAX` | `AVG` | `SUM` | `STDDEV` | `COUNT` | `VAR`
   *
   * Aggregation functions used in `having` must be included in the `outStatistics` as well. See the snippet below for an example
   * of how this works.
   *
   * For service-based layer queries, this parameter applies only if the [supportsHavingClause](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#capabilities) property of the layer is `true`.
   * This property is supported on all [LayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/LayerView/) queries.
   *
   * @see [ArcGIS Blog - Querying Feature Services: Having Clause](https://www.esri.com/arcgis-blog/products/api-rest/data-management/querying-feature-services-having-clause/)
   * @see [ArcGIS REST API documentation](https://developers.arcgis.com/rest/services-reference/query-feature-service-layer-.htm)
   * @example
   * query.outStatistics = [{
   *   onStatisticField: "CUSTOMERS",
   *   outStatisticFieldName: "avg_customers",
   *   statisticType: "avg"
   * }, {
   *   onStatisticField: "RATING",
   *   outStatisticFieldName: "min_rating",
   *   statisticType: "min"
   * }, {
   *   onStatisticField: "1=1",
   *   outStatisticFieldName: "total_businesses",
   *   statisticType: "count"
   * }];
   * query.groupByFieldsForStatistics = [ "region" ];
   * query.having = "AVG(CUSTOMERS) >= 1,000 AND MIN(RATING) >= 3";
   *
   * // query the above stats for all regions where
   * // the average number of daily customers per business is
   * // greater than 1,000 and the minimum customer rating
   * // for a business within the region is 3
   * layer.queryFeatures(query).then(displayResults);
   */
  accessor having: string | null | undefined;
  /**
   * The historic moment to query. This parameter applies only if the `supportsQueryWithHistoricMoment`
   * capability of the service being queried is `true`. This setting is provided in the layer resource.
   */
  get historicMoment(): Date | null | undefined;
  set historicMoment(value: (Date | number | string) | null | undefined);
  /**
   * The maximum distance in units of [outSpatialReference](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outSpatialReference) used for
   * generalizing geometries returned by the query operation. It limits how far any part of the
   * generalized geometry can be from the original geometry. If `outSpatialReference` is not defined,
   * the spatialReference of the data is used.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > This property does not apply to [LayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/LayerView/) or [CSVLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CSVLayer/) queries.
   */
  accessor maxAllowableOffset: number | null | undefined;
  /**
   * When set, the maximum number of features returned by the query will equal the
   * `maxRecordCount` of the service multiplied by this factor. The value of this
   * property may not exceed `5`.
   *
   * For example, if the `maxRecordCount` of your feature service is `2000`, and you set
   * the `maxRecordCountFactor` to `5`, then the maximum number of features that could be
   * returned by the query is `10000`.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > Only supported with ArcGIS Online hosted services or ArcGIS Enterprise 10.6 services and higher.
   *
   * @default 1
   */
  accessor maxRecordCountFactor: number;
  /**
   * Parameter dictates how the geometry of a multipatch feature will be returned.
   * Currently, the only supported value is `xyFootprint`. If indicated, the xy footprint of each multipatch geometry will be
   * returned in the result.
   *
   * @example
   * // url to the layer of interest to query
   * const queryUrl = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Notes/FeatureServer/0";
   *
   * const queryObject = new Query({
   *   objectIds: [22],
   *   multipatchOption: "xyFootprint",
   *   outFields: ["*"],
   *   returnGeometry: true
   * });
   *
   * // call the executeQueryJSON() method
   * query.executeQueryJSON(queryUrl, queryObject).then(function(results){
   *   // results.graphics contains the graphics returned from query
   * });
   */
  accessor multipatchOption: "xyFootprint" | null | undefined;
  /**
   * The number of features to retrieve. This option should be used in conjunction with the [start property](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#start). Use this to
   * implement paging (i.e. to retrieve "pages" of results when querying).
   *
   * If not provided, but an instance of Query has a `start` property, then the default value of `num` is 10.
   * If neither `num` nor `start` properties are provided, then the default value of `num` is equal to the
   * `maxRecordCount` of the service, which can be found at the REST endpoint of the FeatureLayer.
   */
  accessor num: number | null | undefined;
  /** An array of ObjectIDs to be used to query for features in a layer. */
  accessor objectIds: ObjectId[] | null | undefined;
  /**
   * One or more field names used to order the query results. Specify `ASC` (ascending) or `DESC`
   * (descending) after the field name to control the order. The default order is `ASC`.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > If querying a [MapImageLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/), then `supportsAdvancedQueries` must be `true` on the service.
   * > For [FeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/), `FeatureLayer.capabilities.queryRelated.supportsOrderBy` must be `true`.
   *
   * @see [FeatureLayer.capabilities](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#capabilities)
   * @example query.orderByFields = ["STATE_NAME DESC"];
   */
  accessor orderByFields: string[] | null | undefined;
  /**
   * Attribute fields to include in the [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/). Fields must exist in the service layer. You must list actual
   * field names rather than field aliases. You may, however, use field aliases when you display
   * the results of the query.
   *
   * When specifying the output fields, you should limit the fields to only those you expect to use in the
   * query or the results. The fewer fields you include, the smaller the payload size, and therefore the faster the response of the query.
   *
   * You can also specify SQL expressions as `outFields` to calculate new values server side for the query results. See the
   * example snippets below for an example of this.
   *
   * Each query must have access to the `Shape` and `ObjectId` fields for a layer. However, the list of outFields does
   * not need to include these two fields.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > If specifying outFields as expressions on a feature service-based [FeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/), the service capabilities
   * > `advancedQueryCapabilities.supportsOutFieldSQLExpression` and `useStandardizedQueries` must both be true.
   *
   * @example
   * // query for field attributes
   * query.outFields = [ "NAME", "STATE_ABBR", "POP04" ];
   * @example
   * // query for data returned from an expressions and other fields as the following field names
   * // POP_CHANGE_2020, NAME, POP2020
   * // where POP_CHANGE_2020 represents the population change from 2010 - 2020
   * query.outFields = [ "( (POP2020 - POP2010) / POP2010 ) * 100 as POP_CHANGE_2020", "NAME", "POP2020" ]
   */
  accessor outFields: string[] | null | undefined;
  /**
   * The spatial reference for the returned geometry. If not specified, the geometry is returned in the spatial
   * reference of the queried layer.
   */
  get outSpatialReference(): SpatialReference | null | undefined;
  set outSpatialReference(value: SpatialReferenceProperties | null | undefined);
  /**
   * The definitions for one or more field-based statistics to be calculated. If `outStatistics` is specified the only other query parameters
   * that should be used are [groupByFieldsForStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#groupByFieldsForStatistics), [orderByFields](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#orderByFields), [returnDistinctValues](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnDistinctValues),
   * [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry), [text](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#text), [timeExtent](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#timeExtent) and [where](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#where).
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > For service-based queries, `outStatistics` is only supported on layers where `supportsStatistics = true`.
   *
   * @example
   * let query = new Query();
   * let statisticDefinition = new StatisticDefinition({
   *   statisticType: "sum",
   *   onStatisticField: "POP2000",
   *   outStatisticFieldName: "TotalPop"
   * });
   *
   * query.outStatistics = [ statisticDefinition ];
   */
  get outStatistics(): StatisticDefinition[] | null | undefined;
  set outStatistics(value: StatisticDefinitionProperties[] | null | undefined);
  /**
   * Filters features from the layer based on pre-authored parameterized filters.
   * When value is not specified for any parameter in a request, the default value,
   * that is assigned during authoring time, gets used.
   * Requires an ArcGIS Enterprise service 10.5 or greater. This parameter is only supported with
   * [MapImageLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/) pointing to a [map service](https://enterprise.arcgis.com/en/server/latest/publish-services/windows/what-is-a-map-service.htm).
   *
   * @see [ArcGIS Pro - creating a query layer](https://pro.arcgis.com/en/pro-app/latest/help/mapping/layer-properties/creating-a-query-layer.htm)
   * @see [ArcGIS REST API - query a map service layer](https://developers.arcgis.com/rest/services-reference/enterprise/query-map-service-layer-.htm)
   */
  accessor parameterValues: Record<string, ParameterValueType> | null | undefined;
  /**
   * Specifies the pixel level to be identified on the X and Y axis. Defaults to the base resolution of the
   * dataset if not specified. Applicable only to Image Service layers.
   */
  get pixelSize(): Point | null | undefined;
  set pixelSize(value: PointProperties | null | undefined);
  /**
   * Used to project the geometry onto a virtual grid, likely representing
   * pixels on the screen. Geometry coordinates are converted to integers
   * by building a grid with a resolution matching the `quantizationParameters.tolerance`.
   * Each coordinate is then snapped to one pixel on the grid.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > Only supported with ArcGIS Online hosted services or ArcGIS Enterprise 10.6.1 services.
   *
   * @example
   * let query = new Query();
   * query.quantizationParameters = {
   *   mode: "view",
   *   originPosition: "upper-left",
   *   tolerance: 4820,
   *   extent: layer.fullExtent
   * };
   */
  get quantizationParameters(): QuantizationParameters | null | undefined;
  set quantizationParameters(value: QuantizationParametersProperties | null | undefined);
  /**
   * Filters features from the layer that are within the specified range values.
   * Requires ArcGIS Enterprise services 10.5 or greater. This parameter is only supported with
   * [MapImageLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/) pointing to a [map service](https://enterprise.arcgis.com/en/server/latest/publish-services/windows/what-is-a-map-service.htm).
   *
   * @see [ArcGIS Pro - creating a query layer](https://pro.arcgis.com/en/pro-app/latest/help/mapping/layer-properties/creating-a-query-layer.htm)
   * @see [ArcGIS REST API - query a map service layer](https://developers.arcgis.com/rest/services-reference/enterprise/query-map-service-layer-.htm)
   */
  accessor rangeValues: RangeValue[] | null | undefined;
  /**
   * The Dimensionally Extended 9 Intersection Model (DE-9IM) matrix relation (encoded as a string) to query
   * the spatial relationship of the input [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry) to the layer's features. This
   * string contains the test result of each intersection represented in the DE-9IM matrix. Each result is
   * one character of the string and may be represented as either a number (maximum dimension returned: 0,1,2),
   * a Boolean value (T or F), or a mask character (for ignoring results: '*').
   *
   * Set this parameter when the [spatialRelationship](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#spatialRelationship) is `relation`.
   * The [Relational functions for ST_Geometry](https://pro.arcgis.com/en/pro-app/latest/help/data/databases/pdf/stgeometry_reference.pdf) topic has additional details
   * on how to construct these strings.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > This property does not apply to layer view or [CSVLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CSVLayer/) queries.
   *
   * @example
   * let query = new Query({
   *   relationParameter: "FFFTTT***"
   * });
   */
  accessor relationParameter: string | null | undefined;
  /**
   * If `true`, each feature in the returned [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/) will be returned with a centroid.
   * This property only applies to queries against polygon [FeatureLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/).
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > Only supported with ArcGIS Online hosted services or ArcGIS Enterprise 10.6.1 services.
   *
   * @default false
   */
  accessor returnCentroid: boolean;
  /**
   * If `true` then the query returns distinct values based on the field(s) specified in [outFields](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outFields).
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > For service-based queries, this parameter applies only if the `supportsAdvancedQueries` capability of the layer is `true`.
   * > Make sure to set [returnGeometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnGeometry) to `false` when `returnDistinctValues` is true. Otherwise, reliable results will not be returned.
   *
   * @default false
   */
  accessor returnDistinctValues: boolean;
  /**
   * If `true`, then all features are returned for each tile request, even if they exceed the
   * maximum record limit per query indicated on the service by `maxRecordCount`. If `false`, the
   * tile request will not return any features if the `maxRecordCount` limit is exceeded.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > Only supported with ArcGIS Online hosted services or ArcGIS Enterprise 10.6 services and higher.
   *
   * @default true
   */
  accessor returnExceededLimitFeatures: boolean;
  /**
   * If `true`, each feature in the returned [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/) includes the geometry.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > For [FeatureLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/) queries, the precision of the returned geometries will only be
   * >   as high as the view's scale resolution since geometries are quantized for improved performance on the view.
   * >   The smaller the scale, the lower the resolution of the geometries.
   * >
   * >   This limitation does not apply to [FeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/), [CSVLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CSVLayer/),
   * >   and [CSVLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/CSVLayerView/) queries.
   *
   * @default false
   */
  accessor returnGeometry: boolean;
  /** If `true`, and [returnGeometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnGeometry) is `true`, then m-values are included in the geometry. */
  accessor returnM: boolean | null | undefined;
  /**
   * If `true`, the [query geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/#queryGeometry) will be returned with the query results.
   * It is useful for getting the buffer geometry generated when querying features by [distance](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#distance)
   * or getting the query geometry projected in the [outSpatialReference](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outSpatialReference) of the query.
   * The query geometry is returned only for [client-side queries](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/#queryFeatures)
   * and [hosted feature services](https://doc.arcgis.com/en/arcgis-online/share-maps/hosted-web-layers.htm)
   * and if the layer's [capabilities.query.supportsQueryGeometry](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#capabilities)
   * is `true`.
   *
   * @default false
   */
  accessor returnQueryGeometry: boolean;
  /**
   * When `true` output geometry will include curves. If `false`, curves (if any) will be converted to
   * densified polylines or polygons.
   *
   * This option only applies when [returnGeometry](#returnGeometry) is set to `true` and the output geometry is
   * non-quantized polylines or polygons.
   *
   * @since 5.0
   * @see [ArcGIS REST API | Query Feature Service/Layer | returnTrueCurves](https://developers.arcgis.com/rest/services-reference/enterprise/query-feature-service-layer/#:~:text=returntruecurves)
   */
  accessor returnTrueCurves: boolean | null | undefined;
  /**
   * If `true`, and [returnGeometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnGeometry) is `true`, then z-values are included in the geometry.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > [FeatureLayerView.queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/#queryFeatures),
   * > [GeoJSONLayerView#queryFeatures](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryFeatures), and
   * > [OGCFeatureLayerView#queryFeatures](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryFeatures) results do not
   * > include the z-values when called in [2D MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/) even if `returnZ` is set to `true`.
   */
  accessor returnZ: boolean | null | undefined;
  /**
   * For spatial queries, this parameter defines the spatial relationship to query features in the layer or layer view against the input [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry).
   * The spatial relationships discover how features are spatially related to each other.
   * For example, you may want to know if a polygon representing a county completely contains points representing settlements.
   *
   * The spatial relationship is determined by whether the boundaries or interiors of a geometry intersect.
   * * Boundary — The endpoints of all linear parts for line features, or the linear outline of a polygon. Only lines and polygons have boundaries.
   * * Interior — Points are entirely interior and have no boundary. For lines and polygons, the interior is any part of the geometry that is not part of the boundary.
   *
   * The possible values for this parameter are described below and the images highlight the geometries returned for the specified spatial
   * relationship for given geometries.
   *
   * The `intersects` spatial relationship returns features in the layer view that intersect the query [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry).
   *
   * ![intersects](https://developers.arcgis.com/javascript/latest/assets/img/apiref/layers/spatialRelationships/intersects.png)
   *
   * The `contains` spatial relationship returns features in the layer view that are completely contained by the query [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry).
   *
   * ![contains](https://developers.arcgis.com/javascript/latest/assets/img/apiref/layers/spatialRelationships/contains.png)
   *
   * The `crosses` spatial relationship returns features in the layer view when the interior of a query [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry) comes into contact with
   * the interior or boundary of features in the layer view. In other words, the geometries share some interior area, but not all interior area.
   *
   * ![crosses](https://developers.arcgis.com/javascript/latest/assets/img/apiref/layers/spatialRelationships/crosses.png)
   *
   * The `envelope-intersects` spatial relationship returns features in the layer view that intersect the envelope (or extent)
   * of the filter [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry).
   *
   * ![envelope-intersects](https://developers.arcgis.com/javascript/latest/assets/img/apiref/layers/spatialRelationships/envelope-intersects.png)
   *
   * The `overlaps` spatial relationship returns features in the layer view that overlap the query [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry).
   * Only features of the same geometry can be compared.
   *
   * ![overlaps](https://developers.arcgis.com/javascript/latest/assets/img/apiref/layers/spatialRelationships/overlap.png)
   *
   * The `touches` spatial relationship returns features in the layer view that touch the query [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry).
   * The boundaries of the geometries intersect, but not their interiors.
   *
   * ![touches](https://developers.arcgis.com/javascript/latest/assets/img/apiref/layers/spatialRelationships/touches.png)
   *
   * The `within` spatial relationship returns features in the layer view that completely contain the query [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry).
   * In other words, the filter geometry is completely `within` the features in the layer view. It is opposite of
   * `contains`.
   *
   * ![within](https://developers.arcgis.com/javascript/latest/assets/img/apiref/layers/spatialRelationships/within.png)
   *
   * The `disjoint` spatial relationship returns features in the layer view that do not intersect the query [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry) in anyway.
   * Opposite of `intersects`.
   *
   * ![disjoint](https://developers.arcgis.com/javascript/latest/assets/img/apiref/layers/spatialRelationships/disjoint.png)
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > For spatial queries on 3D Object SceneLayers and BuildingSceneLayers the spatial relationship is evaluated based on the
   * > [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) of the feature and not the footprint. This means that a feature might be
   * > returned from the query, even though its footprint is not in a spatial relationship with the [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry).
   * > Currently only `intersects`, `contains`, and `disjoint` [spatialRelationships](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#spatialRelationship) are supported on spatial
   * > [queries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) for 3D Object SceneLayers and BuildingSceneLayers.
   *
   * @default "intersects"
   * @default intersects
   * @example
   * let query = new Query({
   *   spatialRelationship: "contains"
   * });
   */
  spatialRelationship: "intersects" | "contains" | "crosses" | "disjoint" | "envelope-intersects" | "index-intersects" | "overlaps" | "touches" | "within" | "relation";
  /**
   * This parameter can be either standard SQL92 `standard` or it can use the native SQL of the underlying datastore `native`.
   * See the [ArcGIS REST API documentation](https://developers.arcgis.com/rest/services-reference/query-feature-service-.htm)
   * for more information.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > This property does not apply to layer view or [CSVLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CSVLayer/) queries.
   *
   * @default "none"
   */
  accessor sqlFormat: SQLFormat | null | undefined;
  /**
   * The zero-based index indicating where to begin retrieving features. This property should be used in conjunction with [num](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#num).
   * Use this to implement paging and retrieve "pages" of results when querying. Features are sorted ascending by
   * object ID by default.
   */
  accessor start: number | null | undefined;
  /** Shorthand for a where clause using "like". The field used is the display field defined in the services directory. */
  accessor text: string | null | undefined;
  /**
   * A time extent for a temporal query against [time-aware layers](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#timeInfo).
   * For example, it can be used to discover all crimes that occurred during the
   * night shift from 10 PM to 6 AM on a particular date.
   *
   * @example
   * let layer = new FeatureLayer( ... );
   * let timeExtent = new TimeExtent({
   *   start: new Date(1992, 0, 1),
   *   end: new Date(1992, 11, 31)
   * });
   * let timeQuery = new Query({
   *   timeExtent: timeExtent
   * });
   * layerView.queryFeatures(timeQuery).then(function(featureSet) { ... });
   */
  get timeExtent(): TimeExtent | null | undefined;
  set timeExtent(value: TimeExtentProperties | null | undefined);
  /**
   * The unit for calculating the buffer distance when [distance](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#distance) is specified in spatial queries.
   * If `units` is not specified, the unit is derived from the geometry spatial reference.
   * If the geometry spatial reference is not specified, the unit is derived from the feature service data spatial reference.
   * For service-based queries, this parameter only applies if the layer's
   * [capabilities.query.supportsDistance](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#capabilities) is `true`.
   *
   * @example
   * // Query at a distance in pixels of the query geometry.
   * // Use the unit of the query geometry's spatial reference.
   * layerView.queryFeatures({
   *   geometry: event.mapPoint,
   *   distance: 2 * view.resolution,
   *   returnGeometry: true
   * }).then(processResults);
   */
  accessor units: "feet" | "miles" | "nautical-miles" | "us-nautical-miles" | "meters" | "kilometers" | null | undefined;
  /**
   * A where clause for the query. Any legal SQL where clause operating on the fields in the layer is allowed.
   * Be sure to have the correct sequence of single and double quotes when writing the where clause in JavaScript.
   *
   * @example query.where = "NAME = '" + stateName + "'";
   * @example query.where = "POP04 > " + population;
   */
  accessor where: string | null | undefined;
  /**
   * Creates a deep clone of Query object.
   *
   * @returns A new instance of a Query object equal to the object used to call `.clone()`.
   */
  clone(): Query;
}

/**
 * Parameter value type to filters features from the layer based on pre-authored parameterized filters.
 *
 * @see [parameterValues](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#parameterValues)
 */
export type ParameterValueType = number | number[] | string | string[] | Date | Date[];