import type PopupTemplate from "../PopupTemplate.js";
import type Collection from "../core/Collection.js";
import type Extent from "../geometry/Extent.js";
import type SpatialReference from "../geometry/SpatialReference.js";
import type Layer from "./Layer.js";
import type Field from "./support/Field.js";
import type FieldsIndex from "./support/FieldsIndex.js";
import type LabelClass from "./support/LabelClass.js";
import type FeatureSet from "../rest/support/FeatureSet.js";
import type { ClonableMixin } from "../core/Clonable.js";
import type { MultiOriginJSONSupportMixin } from "../core/MultiOriginJSONSupport.js";
import type { AbortOptions } from "../core/promiseUtils.js";
import type { FeatureLayerCapabilities, FieldDomainOptions } from "./types.js";
import type { BlendLayer, BlendLayerProperties } from "./mixins/BlendLayer.js";
import type { CustomParametersMixin, CustomParametersMixinProperties } from "./mixins/CustomParametersMixin.js";
import type { FeatureEffectLayer, FeatureEffectLayerProperties } from "./mixins/FeatureEffectLayer.js";
import type { FeatureReductionLayer, FeatureReductionLayerProperties } from "./mixins/FeatureReductionLayer.js";
import type { OperationalLayer, OperationalLayerProperties } from "./mixins/OperationalLayer.js";
import type { OrderedLayer, OrderedLayerProperties } from "./mixins/OrderedLayer.js";
import type { ScaleRangeLayer, ScaleRangeLayerProperties } from "./mixins/ScaleRangeLayer.js";
import type { ParquetGeometryType } from "./support/parquetUtils.js";
import type { DomainUnion, ParquetGeometryEncodingUnion } from "./support/types.js";
import type { RendererUnion } from "../renderers/types.js";
import type { QueryProperties } from "../rest/support/Query.js";
import type { CreatePopupTemplateOptions } from "../support/popupUtils.js";
import type { ObjectId } from "../views/types.js";
import type { FieldProperties } from "./support/Field.js";
import type { ParquetGeometryEncodingLocationProperties } from "./support/ParquetGeometryEncodingLocation.js";
import type { ParquetGeometryEncodingWkbProperties } from "./support/ParquetGeometryEncodingWkb.js";
import type { ExtentProperties } from "../geometry/Extent.js";
import type { LabelClassProperties } from "./support/LabelClass.js";
import type { PopupTemplateProperties } from "../PopupTemplate.js";
import type { HeatmapRendererProperties } from "../renderers/HeatmapRenderer.js";
import type { PieChartRendererProperties } from "../renderers/PieChartRenderer.js";
import type { DictionaryRendererProperties } from "../renderers/DictionaryRenderer.js";
import type { DotDensityRendererProperties } from "../renderers/DotDensityRenderer.js";
import type { UniqueValueRendererProperties } from "../renderers/UniqueValueRenderer.js";
import type { ClassBreaksRendererProperties } from "../renderers/ClassBreaksRenderer.js";
import type { SimpleRendererProperties } from "../renderers/SimpleRenderer.js";
import type { SpatialReferenceProperties } from "../geometry/SpatialReference.js";
import type { ReadonlyArrayOrCollection } from "../core/Collection.js";
import type { LayerProperties } from "./Layer.js";

export interface ParquetLayerProperties extends LayerProperties, CustomParametersMixinProperties, OperationalLayerProperties, ScaleRangeLayerProperties, OrderedLayerProperties, BlendLayerProperties, FeatureEffectLayerProperties, FeatureReductionLayerProperties, Partial<Pick<ParquetLayer, "copyright" | "geometryType" | "labelsVisible" | "legendEnabled" | "outFields" | "popupEnabled">> {
  /**
   * An array of fields in the layer.
   *
   * > [!WARNING]
   * >
   * > **Notes**
   * >
   * > The ParquetLayer does not support the `date` and `group type` field types.
   * > For details on how `big-integer` fields are handled, refer to the [big-integer](https://developers.arcgis.com/javascript/latest/references/core/layers/support/Field/#type) documentation.
   *
   * @example
   * // define each field's schema
   * let fields = [
   *  new Field({
   *    "name": "ObjectID",
   *    "alias": "ObjectID",
   *    "type": "oid"
   *  }), new Field({
   *    "name": "description",
   *    "alias": "Description",
   *    "type": "string"
   *  }), new Field ({
   *    "name": "title",
   *    "alias": "Title",
   *    "type": "string"
   *  })
   * ];
   */
  fields?: FieldProperties[];
  /**
   * The full extent of the layer.
   *
   * @example
   * // Once the layer loads, set the view's extent to the layer's full extent
   * layer.when(function(){
   *   view.extent = layer.fullExtent;
   * });
   */
  fullExtent?: ExtentProperties | null;
  /**
   * The encoding format used to store geometries in the Parquet files.
   * The geometry encoding is automatically detected if the file contains Geoparquet metadata. If not, the layer will attempt to locate
   * latitude and longitude columns and display those as the geometry. Otherwise, the encoding must be specified manually.
   *
   * ParquetLayer supports two geometry encoding types:
   * * [ParquetGeometryEncodingLocation](https://developers.arcgis.com/javascript/latest/references/core/layers/support/ParquetGeometryEncodingLocation/): Used when geometry is stored as coordinate fields.
   * If the file contains coordinate fields named `"lng/lat"`, `"lon/lat"`, `"long/lat"`,  `"longitude/latitude"`, `"x/y"`, `"xcenter/ycenter"`, `"longitude83/latitude83"`,
   * `"longdecdeg/latdecdeg"`, `"point-x/point-y"`, these are detected automatically. The field names are case-insensitive.
   * For other coordinate field names, set the layer’s [geometryEncoding](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#geometryEncoding) to an instance of `ParquetGeometryEncodingLocation`
   * with the coordinate fields specified, and set the layer’s [spatialReference](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#spatialReference) and [geometryType](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#geometryType) properties accordingly.
   *
   * * [ParquetGeometryEncodingWkb](https://developers.arcgis.com/javascript/latest/references/core/layers/support/ParquetGeometryEncodingWkb/): Used when geometry is stored as a WKB-encoded column.
   * Set the layer's [geometryEncoding](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#geometryEncoding) to an instance of `ParquetGeometryEncodingWkb` with
   * the geometry column name, and set the layer’s [spatialReference](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#spatialReference) (WGS84 or WebMercator) and [geometryType](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#geometryType) properties accordingly.
   *
   * @since 4.34
   * @example
   * // ParquetLayer with WKB geometry encoding
   * const layer = new ParquetLayer({
   *   urls: ["https://example.com/path/to/parquetfile.parquet"],
   *   geometryEncoding: new ParquetGeometryEncodingWkb({
   *     field: "polyGeometry"
   *   }), // WKB geometry column
   *   spatialReference: { wkid: 4326 }, // WGS84
   *   geometryType: "polygon"
   * });
   */
  geometryEncoding?: ((ParquetGeometryEncodingWkbProperties & { type: "wkb" }) | (ParquetGeometryEncodingLocationProperties & { type: "location" })) | null;
  /**
   * The label definition for this layer, specified as an array of [LabelClass](https://developers.arcgis.com/javascript/latest/references/core/layers/support/LabelClass/). Use this property to specify
   * labeling properties for the layer.
   *
   * Multiple Label classes with different `where` clauses can be used to define several labels with varying styles on the same feature.
   * Likewise, multiple label classes may be used to label different types of features (for example blue labels
   * for lakes and green labels for parks).
   *
   * @see [labelsVisible](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#labelsVisible)
   * @example
   * const labels = new LabelClass({
   *   labelExpressionInfo: { expression: "$feature.NAME" },
   *   symbol: {
   *     type: "text",  // autocasts as new TextSymbol()
   *     color: "black",
   *     haloSize: 1,
   *     haloColor: "white"
   *   }
   * });
   *
   * layer.labelingInfo = [ labels ];
   */
  labelingInfo?: LabelClassProperties[] | null;
  /**
   * The popup template for the layer. When set on the layer, the `popupTemplate`
   * allows users to access attributes and display their values in the
   * view's Popup when a feature is selected using text and/or charts. See the [PopupTemplate sample](https://developers.arcgis.com/javascript/latest/sample-code/intro-popuptemplate/)
   * for an example of how [PopupTemplate](https://developers.arcgis.com/javascript/latest/references/core/PopupTemplate/) interacts with a
   * [FeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/).
   *
   * A default popup template is automatically used if no `popupTemplate` has been defined when
   * [Popup.defaultPopupTemplateEnabled](https://developers.arcgis.com/javascript/latest/references/core/widgets/Popup/#defaultPopupTemplateEnabled) is set to `true`.
   *
   * > [!WARNING]
   * >
   * > **Notes**
   * >
   * > The ParquetLayer's [popupTemplate](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#popupTemplate) displays only the attributes of the topmost feature when features overlap.
   *
   * @see [createPopupTemplate()](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#createPopupTemplate)
   * @see [View2D.popup](https://developers.arcgis.com/javascript/latest/references/core/views/View2D/#popup)
   */
  popupTemplate?: PopupTemplateProperties | null;
  /**
   * The renderer assigned to the layer. The renderer defines how to
   * visualize each feature in the layer. Depending on the renderer type,
   * features may be visualized with the same symbol, or with varying symbols
   * based on the values of provided attribute fields or functions. If not specified,
   * a default renderer will be generated based on the geometry type.
   *
   * @see [Styles and data visualization](https://developers.arcgis.com/javascript/latest/visualization/)
   */
  renderer?: (((SimpleRendererProperties & { type: "simple" }) | (ClassBreaksRendererProperties & { type: "class-breaks" }) | (UniqueValueRendererProperties & { type: "unique-value" }) | (DotDensityRendererProperties & { type: "dot-density" }) | (DictionaryRendererProperties & { type: "dictionary" }) | (PieChartRendererProperties & { type: "pie-chart" })) | (HeatmapRendererProperties & { type: "heatmap" })) | null;
  /**
   * The spatial reference of the layer. The default value is WGS84.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > The ParquetLayer only supports geographic (WGS84) and Web Mercator spatial references.
   *
   * @default SpatialReference.WGS84
   * @see [SpatialReference.WGS84](https://developers.arcgis.com/javascript/latest/references/core/geometry/SpatialReference/#WGS84)
   */
  spatialReference?: SpatialReferenceProperties;
  /**
   * Collection of urls for Parquet files.
   *
   * @example
   * // create parquet layer from multiple Parquet files
   * const layer = new ParquetLayer({
   *   urls: [
   *     "https://example.com/path/to/parquetfile1.parquet",
   *     "https://example.com/path/to/parquetfile2.parquet"
   *   ]
   * });
   */
  urls?: ReadonlyArrayOrCollection<string>;
}

/**
 * The ParquetLayer enables visualization of [Parquet files](https://parquet.apache.org/docs/) on a map.
 * Parquet is a columnar storage format optimized for efficiently handling big data and distributed environments.
 * Its columnar structure, compression capabilities, and schema support make it ideal for analytics and query-heavy workloads.
 *
 * The ParquetLayer can represent either [spatial](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#geometryType) data (with geographic features) or non-spatial data as a [table](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#isTable).
 * If the Parquet file contains spatial data, then rows can be rendered as [features](https://developers.arcgis.com/javascript/latest/references/core/Graphic/) with [geometries](https://developers.arcgis.com/javascript/latest/references/core/geometry/Geometry/)
 * in a [Map component](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-map/) or a [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/).
 * If not, they can still be shown in a table. A non-spatial layer is a [table](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#isTable) which does not have
 * a spatial column representing geographic features.
 *
 * Parquet files must use either GZIP or Snappy [compression](https://parquet.apache.org/docs/file-format/data-pages/compression/), or no compression. Files using other compression formats
 * are not supported.
 * Geometry encoding must be specified when it cannot be automatically inferred. For details on supported formats and how to configure encoding manually
 * or rely on auto-detection, see the [geometryEncoding](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#geometryEncoding) property.
 *
 * ParquetLayers may be created by either:
 * ###### Specifying the [urls](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#urls) of the Parquet files.
 *
 * The ParquetLayer can be loaded by setting its [urls](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#urls) property to the urls of the Parquet files.
 * The following snippet shows how to add a new ParquetLayer to the map.
 *
 * ```js
 * // Add the Parquet files from given urls as a parquet layer.
 * const layer = new ParquetLayer({
 *   urls: [
 *     "url-to-parquet-file1.parquet",
 *     "url-to-parquet-file2.parquet"
 *   ]
 * });
 * map.add(layer);
 * ```
 *
 * ###### Using the [getParquetLayerInfo()](https://developers.arcgis.com/javascript/latest/references/core/layers/support/parquetUtils/#getParquetLayerInfo)
 *
 * Use the [getParquetLayerInfo()](https://developers.arcgis.com/javascript/latest/references/core/layers/support/parquetUtils/#getParquetLayerInfo) method to
 * retrieve information needed to create a parquet layer from the first Parquet file in the specified URLs array.
 * The following snippet shows how to create a new ParquetLayer using the retrieved information returned from the `getParquetLayerInfo()`.
 *
 * ```js
 * // get parquet layer info from the first Parquet file in the urls array
 * const urls = ["url-to-your-parquet-file.parquet", "url-to-your-parquet-file2.parquet"];
 * const info = await parquetUtils.getParquetLayerInfo(urls);
 * const layer = new ParquetLayer(info);
 *
 * // create a renderer based on the geometry type
 * if (info.geometryType === "polygon") {
 *   const renderer = new SimpleRenderer({
 *     symbol: {
 *       type: "simple-fill",
 *       color: [227, 139, 79, 0.8],
 *       outline: {
 *         color: [255, 255, 255],
 *         width: 1
 *       }
 *     }
 *   });
 *   layer.renderer = renderer;
 * }
 * // add the layer to the map
 * map.add(layer);
 * ```
 *
 * > [!WARNING]
 * >
 * > **Known Limitations**
 * >
 * > The ParquetLayer is supported in a [Map component](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-map/) or a [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/).
 * > The ParquetLayer only supports geographic (WGS84) and Web Mercator spatial references.
 * > Time and date fields may be downgraded to numeric values.
 * > The [ParquetLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/) does not support the [Query.outStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outStatistics),
 * > [Query.orderByFields](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#orderByFields), or [Query.returnDistinctValues](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnDistinctValues)
 * > query parameters when the layer has more than 20,000 features.
 *
 * @beta
 * @since 4.33
 * @see [Sample - Intro to ParquetLayer](https://developers.arcgis.com/javascript/latest/sample-code/layers-parquetlayer/)
 * @see [ParquetLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/ParquetLayerView/)
 * @see [Apache Parquet documentation](https://parquet.apache.org/docs/)
 * @see [Geoparquet documentation](https://geoparquet.org/)
 */
export default class ParquetLayer extends ParquetLayerSuperclass {
  /**
   * @example
   * const layer = new ParquetLayer({
   *    urls: [
   *      "https://example.com/path/to/parquetfile1.parquet",
   *      "https://example.com/path/to/parquetfile2.parquet"
   *    ]
   * });
   * mapElement.map.add(layer);  // adds the layer to the map
   */
  constructor(properties?: ParquetLayerProperties);
  /** Describes the layer's supported capabilities. */
  get capabilities(): FeatureLayerCapabilities | null | undefined;
  /** Copyright information for the layer. */
  accessor copyright: string | null | undefined;
  /**
   * An array of fields in the layer.
   *
   * > [!WARNING]
   * >
   * > **Notes**
   * >
   * > The ParquetLayer does not support the `date` and `group type` field types.
   * > For details on how `big-integer` fields are handled, refer to the [big-integer](https://developers.arcgis.com/javascript/latest/references/core/layers/support/Field/#type) documentation.
   *
   * @example
   * // define each field's schema
   * let fields = [
   *  new Field({
   *    "name": "ObjectID",
   *    "alias": "ObjectID",
   *    "type": "oid"
   *  }), new Field({
   *    "name": "description",
   *    "alias": "Description",
   *    "type": "string"
   *  }), new Field ({
   *    "name": "title",
   *    "alias": "Title",
   *    "type": "string"
   *  })
   * ];
   */
  get fields(): Field[];
  set fields(value: FieldProperties[]);
  /**
   * A convenient property that can be used to make case-insensitive lookups for a field by name.
   * It can also provide a list of the [date fields](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FieldsIndex/#dateFields) in a layer.
   *
   * @example
   * // lookup a field by name. name is case-insensitive
   * const field = layer.fieldsIndex.get("SoMeFiEld");
   *
   * if (field) {
   *   console.log(field.name); // SomeField
   * }
   */
  get fieldsIndex(): FieldsIndex<Field>;
  /**
   * The full extent of the layer.
   *
   * @example
   * // Once the layer loads, set the view's extent to the layer's full extent
   * layer.when(function(){
   *   view.extent = layer.fullExtent;
   * });
   */
  get fullExtent(): Extent | null | undefined;
  set fullExtent(value: ExtentProperties | null | undefined);
  /**
   * The encoding format used to store geometries in the Parquet files.
   * The geometry encoding is automatically detected if the file contains Geoparquet metadata. If not, the layer will attempt to locate
   * latitude and longitude columns and display those as the geometry. Otherwise, the encoding must be specified manually.
   *
   * ParquetLayer supports two geometry encoding types:
   * * [ParquetGeometryEncodingLocation](https://developers.arcgis.com/javascript/latest/references/core/layers/support/ParquetGeometryEncodingLocation/): Used when geometry is stored as coordinate fields.
   * If the file contains coordinate fields named `"lng/lat"`, `"lon/lat"`, `"long/lat"`,  `"longitude/latitude"`, `"x/y"`, `"xcenter/ycenter"`, `"longitude83/latitude83"`,
   * `"longdecdeg/latdecdeg"`, `"point-x/point-y"`, these are detected automatically. The field names are case-insensitive.
   * For other coordinate field names, set the layer’s [geometryEncoding](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#geometryEncoding) to an instance of `ParquetGeometryEncodingLocation`
   * with the coordinate fields specified, and set the layer’s [spatialReference](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#spatialReference) and [geometryType](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#geometryType) properties accordingly.
   *
   * * [ParquetGeometryEncodingWkb](https://developers.arcgis.com/javascript/latest/references/core/layers/support/ParquetGeometryEncodingWkb/): Used when geometry is stored as a WKB-encoded column.
   * Set the layer's [geometryEncoding](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#geometryEncoding) to an instance of `ParquetGeometryEncodingWkb` with
   * the geometry column name, and set the layer’s [spatialReference](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#spatialReference) (WGS84 or WebMercator) and [geometryType](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#geometryType) properties accordingly.
   *
   * @since 4.34
   * @example
   * // ParquetLayer with WKB geometry encoding
   * const layer = new ParquetLayer({
   *   urls: ["https://example.com/path/to/parquetfile.parquet"],
   *   geometryEncoding: new ParquetGeometryEncodingWkb({
   *     field: "polyGeometry"
   *   }), // WKB geometry column
   *   spatialReference: { wkid: 4326 }, // WGS84
   *   geometryType: "polygon"
   * });
   */
  get geometryEncoding(): ParquetGeometryEncodingUnion | null | undefined;
  set geometryEncoding(value: ((ParquetGeometryEncodingWkbProperties & { type: "wkb" }) | (ParquetGeometryEncodingLocationProperties & { type: "location" })) | null | undefined);
  /** The geometry type of features in the layer. All features must be of the same type. */
  accessor geometryType: ParquetGeometryType | null | undefined;
  /**
   * Returns `true` if the layer is loaded from a Parquet file without spatial data.
   * Non-spatial Parquet files do not have geometry object that represent geographic features.
   * The [geometryType](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#geometryType) of the layer will be `null` if the `isTable` is `true`.
   *
   * A non-spatial table instance can be created from the [urls](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#urls) and the table must be loaded by calling [load()](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#load) method.
   *
   * @default false
   * @since 4.34
   * @see [Map.tables](https://developers.arcgis.com/javascript/latest/references/core/Map/#tables)
   * @see [WebMap.tables](https://developers.arcgis.com/javascript/latest/references/core/WebMap/#tables)
   * @see [Map.allTables](https://developers.arcgis.com/javascript/latest/references/core/Map/#allTables)
   * @see [WebMap.allTables](https://developers.arcgis.com/javascript/latest/references/core/WebMap/#allTables)
   */
  get isTable(): boolean;
  /**
   * The label definition for this layer, specified as an array of [LabelClass](https://developers.arcgis.com/javascript/latest/references/core/layers/support/LabelClass/). Use this property to specify
   * labeling properties for the layer.
   *
   * Multiple Label classes with different `where` clauses can be used to define several labels with varying styles on the same feature.
   * Likewise, multiple label classes may be used to label different types of features (for example blue labels
   * for lakes and green labels for parks).
   *
   * @see [labelsVisible](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#labelsVisible)
   * @example
   * const labels = new LabelClass({
   *   labelExpressionInfo: { expression: "$feature.NAME" },
   *   symbol: {
   *     type: "text",  // autocasts as new TextSymbol()
   *     color: "black",
   *     haloSize: 1,
   *     haloColor: "white"
   *   }
   * });
   *
   * layer.labelingInfo = [ labels ];
   */
  get labelingInfo(): LabelClass[] | null | undefined;
  set labelingInfo(value: LabelClassProperties[] | null | undefined);
  /**
   * Indicates whether to display labels for this layer. If `true`, labels will
   * appear as defined in the [labelingInfo](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#labelingInfo) property.
   *
   * @default true
   */
  accessor labelsVisible: boolean;
  /**
   * Indicates whether the layer will be included in the legend.
   *
   * @default true
   */
  accessor legendEnabled: boolean;
  /**
   * The name of an `oid` [field](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#fields) containing
   * a unique value or identifier for each feature in the layer.
   *
   * @see [fields](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#fields)
   */
  get objectIdField(): string;
  /**
   * An array of field names from the service to include with each feature.
   * To fetch the values from all fields in the layer, use `["*"]`. Fields specified in
   * `outFields` will be requested alongside with required fields for [rendering](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#renderer),
   * and [labeling](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#labelingInfo) for the layer.
   * The required fields and `outFields` are used to populate
   * [FeatureLikeLayerView.availableFields](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#availableFields).
   *
   * @see [FeatureLikeLayerView.availableFields](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#availableFields)
   * @see [fieldUtils](https://developers.arcgis.com/javascript/latest/references/core/layers/support/fieldUtils/)
   * @example
   * // Includes all fields from the Parquet files in the layer
   * layer.outFields = ["*"];
   * @example
   * // Get the specified fields from the service in the layer
   * // These fields will be added to ParquetLayerView.availableFields
   * // along with rendering and labeling fields.
   * layer.outFields = ["NAME", "POP_2010", "FIPS", "AREA"];
   */
  accessor outFields: string[] | null | undefined;
  /**
   * Indicates whether to display popups when features in the layer are clicked. The layer needs to have a [popupTemplate](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#popupTemplate) to define what
   * information should be displayed in the popup. Alternatively, a default popup template may be automatically used if
   * [Popup.defaultPopupTemplateEnabled](https://developers.arcgis.com/javascript/latest/references/core/widgets/Popup/#defaultPopupTemplateEnabled) is set to `true`.
   *
   * @default true
   */
  accessor popupEnabled: boolean;
  /**
   * The popup template for the layer. When set on the layer, the `popupTemplate`
   * allows users to access attributes and display their values in the
   * view's Popup when a feature is selected using text and/or charts. See the [PopupTemplate sample](https://developers.arcgis.com/javascript/latest/sample-code/intro-popuptemplate/)
   * for an example of how [PopupTemplate](https://developers.arcgis.com/javascript/latest/references/core/PopupTemplate/) interacts with a
   * [FeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/).
   *
   * A default popup template is automatically used if no `popupTemplate` has been defined when
   * [Popup.defaultPopupTemplateEnabled](https://developers.arcgis.com/javascript/latest/references/core/widgets/Popup/#defaultPopupTemplateEnabled) is set to `true`.
   *
   * > [!WARNING]
   * >
   * > **Notes**
   * >
   * > The ParquetLayer's [popupTemplate](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#popupTemplate) displays only the attributes of the topmost feature when features overlap.
   *
   * @see [createPopupTemplate()](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#createPopupTemplate)
   * @see [View2D.popup](https://developers.arcgis.com/javascript/latest/references/core/views/View2D/#popup)
   */
  get popupTemplate(): PopupTemplate | null | undefined;
  set popupTemplate(value: PopupTemplateProperties | null | undefined);
  /**
   * The renderer assigned to the layer. The renderer defines how to
   * visualize each feature in the layer. Depending on the renderer type,
   * features may be visualized with the same symbol, or with varying symbols
   * based on the values of provided attribute fields or functions. If not specified,
   * a default renderer will be generated based on the geometry type.
   *
   * @see [Styles and data visualization](https://developers.arcgis.com/javascript/latest/visualization/)
   */
  get renderer(): RendererUnion | null | undefined;
  set renderer(value: (((SimpleRendererProperties & { type: "simple" }) | (ClassBreaksRendererProperties & { type: "class-breaks" }) | (UniqueValueRendererProperties & { type: "unique-value" }) | (DotDensityRendererProperties & { type: "dot-density" }) | (DictionaryRendererProperties & { type: "dictionary" }) | (PieChartRendererProperties & { type: "pie-chart" })) | (HeatmapRendererProperties & { type: "heatmap" })) | null | undefined);
  /**
   * The spatial reference of the layer. The default value is WGS84.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > The ParquetLayer only supports geographic (WGS84) and Web Mercator spatial references.
   *
   * @default SpatialReference.WGS84
   * @see [SpatialReference.WGS84](https://developers.arcgis.com/javascript/latest/references/core/geometry/SpatialReference/#WGS84)
   */
  get spatialReference(): SpatialReference;
  set spatialReference(value: SpatialReferenceProperties);
  /** The layer type provides a convenient way to check the type of the layer without the need to import specific layer modules. */
  get type(): "parquet";
  /**
   * Collection of urls for Parquet files.
   *
   * @example
   * // create parquet layer from multiple Parquet files
   * const layer = new ParquetLayer({
   *   urls: [
   *     "https://example.com/path/to/parquetfile1.parquet",
   *     "https://example.com/path/to/parquetfile2.parquet"
   *   ]
   * });
   */
  get urls(): Collection<string>;
  set urls(value: ReadonlyArrayOrCollection<string>);
  /**
   * Creates a popup template for the layer, populated with all the fields of the layer.
   *
   * > [!WARNING]
   * >
   * > **Notes**
   * >
   * > The ParquetLayer's [popupTemplate](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#popupTemplate) displays only the attributes of the topmost feature when features overlap.
   *
   * @param options - Options for creating the popup template.
   * @returns The popup template, or `null` if the layer does not have any fields.
   */
  createPopupTemplate(options?: CreatePopupTemplateOptions): PopupTemplate | null | undefined;
  /**
   * Returns the [Field](https://developers.arcgis.com/javascript/latest/references/core/layers/support/Field/) instance for a field name (case-insensitive).
   *
   * @param fieldName - Name of the field.
   * @returns the matching field or `undefined`
   * @see [fields](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/#fields)
   */
  getField(fieldName: string): Field | null | undefined;
  /**
   * Returns the [Domain](https://developers.arcgis.com/javascript/latest/references/core/layers/support/Domain/) associated with the given field name. The domain can be either a
   * [CodedValueDomain](https://developers.arcgis.com/javascript/latest/references/core/layers/support/CodedValueDomain/) or [RangeDomain](https://developers.arcgis.com/javascript/latest/references/core/layers/support/RangeDomain/).
   *
   * @param fieldName - Name of the field.
   * @param options - An object specifying additional options. See the
   *                      object specification table below for the required properties of this object.
   * @returns The Domain object associated with the given field name for the given feature.
   */
  getFieldDomain(fieldName: string, options?: FieldDomainOptions | null): DomainUnion | null | undefined;
  /**
   * Executes a [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) against the ParquetLayer and returns the [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) and count of features that satisfy the query.
   * If no parameters are specified, then the extent and count of all features satisfying the layer's configuration/filters are returned.
   *
   * To query count of features available for drawing in the [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/), you must
   * use the [ParquetLayerView#queryExtent](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryExtent).
   *
   * @param query - Specifies the attributes and spatial filter of the query. If no parameters are specified,
   * then the extent and count of all features satisfying the layer's configuration/filters are returned.
   * @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.
   * @since 4.34
   * @example
   * // Queries for the extent of all features matching the layer's configurations
   * // e.g. definitionExpression
   * layer.queryExtent().then((results) => {
   *   // go to the extent of the results satisfying the query
   *   view.goTo(results.extent);
   * });
   * @example
   * const query = new Query();
   * query.where = "region = 'Southern California'";
   *
   * const result = await layer.queryExtent(query);
   * view.goTo(result.extent);  // go to the extent of the results satisfying the query
   */
  queryExtent(query?: QueryProperties | null | undefined, options?: AbortOptions): Promise<{
      count: number;
      extent: Extent | null;
  }>;
  /**
   * Executes a [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) against the ParquetLayer and returns the number of features that satisfy the query.
   * If no parameters are specified, the total number of features satisfying the layer's configuration/filters is returned.
   *
   * To query count of features available for drawing in the [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/), you must
   * use the [ParquetLayerView#queryFeatureCount](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryFeatureCount).
   *
   * @param query - Specifies the attributes and spatial filter of the query.
   * If no parameters are specified, the total number of features satisfying the layer's configuration/filters is returned.
   * @param options - An object with the following properties.
   * @returns When resolved, returns the number of features that satisfy the query.
   * @since 4.34
   * @example
   * // Queries for the count of all features matching the layer's configurations
   * // e.g. definitionExpression
   * layer.queryFeatureCount().then((numFeatures) =>{
   *   // prints the total count to the console
   *   console.log(numFeatures);
   * });
   * @example
   * const query = new Query();
   * query.where = "region = 'Southern California'";
   *
   * layer.queryFeatureCount(query).then((numResults) => {
   *   console.log(numResults);  // prints the number of results satisfying the query
   * });
   */
  queryFeatureCount(query?: QueryProperties | null | undefined, options?: AbortOptions): Promise<number>;
  /**
   * Executes a [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) against the ParquetLayer and returns a
   * [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/) once the promise resolves.
   * A [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/) contains an array of [Graphic](https://developers.arcgis.com/javascript/latest/references/core/Graphic/) features.
   *
   * To query features available for drawing in the [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/), you must
   * use the [ParquetLayerView#queryFeatures](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryFeatures).
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > The [ParquetLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/ParquetLayer/) does not support the [Query.outStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outStatistics),
   * > [Query.orderByFields](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#orderByFields), or [Query.returnDistinctValues](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnDistinctValues)
   * > query parameters when the layer has more than 20,000 features.
   * > Attribute values used in attribute queries executed against ParquetLayer are case sensitive.
   *
   * @param query - Specifies the attributes and spatial
   * filter of the query. If no parameters are specified, then all features satisfying the layer's configuration/filters are returned.
   * @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 features is returned.
   * @since 4.34
   * @see [Sample - Query features from a FeatureLayer](https://developers.arcgis.com/javascript/latest/sample-code/featurelayer-query/)
   * @see [Query and filter guide](https://developers.arcgis.com/javascript/latest/query-filter/)
   * @example
   * // Queries for all the features matching the layer's configurations
   * // e.g. definitionExpression
   * layer.queryFeatures().then((results) => {
   *   // prints the array of result graphics to the console
   *   console.log(results.features);
   * });
   * @example
   * const layer = new ParquetLayer({
   *   urls: [
   *     "parquet-file-url1.parquet"
   *   ]
   * });
   *
   * const query = new Query();
   * query.where = "STATE_NAME = 'Washington'";
   * query.returnGeometry = true;
   * query.outFields = [ "CITY_NAME" ];
   *
   * layer.queryFeatures(query).then((results) => {
   *   console.log(results.features);  // prints the array of features to the console
   * });
   * @example
   * // Get a query object for the layer's current configuration
   * const queryParams = layer.createQuery();
   * // set a geometry for filtering features by a region of interest
   * queryParams.geometry = extentForRegionOfInterest;
   * // Add to the layer's current definitionExpression
   * queryParams.where = queryParams.where + " AND TYPE = 'Extreme'";
   *
   * // query the layer with the modified params object
   * layer.queryFeatures(queryParams).then((results) => {
   *   // prints the array of result graphics to the console
   *   console.log(results.features);
   * });
   *
   * layer.queryFeatures(query).then((results) => {
   *   console.log(results.features);  // prints the array of features to the console
   * });
   */
  queryFeatures(query?: QueryProperties | null | undefined, options?: AbortOptions): Promise<FeatureSet>;
  /**
   * Executes a [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) against the ParquetLayer and returns an
   * array of Object IDs for features that satisfy the input query. If no parameters are specified,
   * then the Object IDs of all features satisfying the layer's configuration/filters are returned.
   *
   * To query ObjectIDs of features available for drawing in the [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/), you must
   * use the [ParquetLayerView#queryObjectIds](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryObjectIds).
   *
   * @param query - Specifies the attributes and spatial
   * filter of the query. If no parameters are specified, then the Object IDs of all features
   * satisfying the layer's configuration/filters are returned.
   * @param options - An object with the following properties.
   * @returns When resolved, returns an array of numbers representing the object IDs of the features satisfying the query.
   * @since 4.34
   * @example
   * // Queries for all the Object IDs of features matching the layer's configurations
   * // e.g. definitionExpression
   * layer.queryObjectIds().then((results) =>{
   *   // prints the array of Object IDs to the console
   *   console.log(results);
   * });
   * @example
   * const query = new Query({
   *   where: "SUB_REGION = 'Pacific'"
   * });
   *
   * const ids = await parquetLayer.queryObjectIds(query);
   * console.log(ids);  // an array of object IDs
   */
  queryObjectIds(query?: QueryProperties | null | undefined, options?: AbortOptions): Promise<ObjectId[]>;
}
declare const ParquetLayerSuperclass: typeof Layer & typeof ClonableMixin & typeof CustomParametersMixin & typeof MultiOriginJSONSupportMixin & typeof OperationalLayer & typeof ScaleRangeLayer & typeof OrderedLayer & typeof BlendLayer & typeof FeatureEffectLayer & typeof FeatureReductionLayer