    // import {
    //     PARAM_SUB,
    //     SPACE_ENUM_POLYGON,
    //     PARAM_COMMA,
    //     PARAM_SPLIT,
    //     PARAM_BRACKET_LEFT,
    //     PARAM_SPACE,
    //     PARAM_BRACKET_RIGHT
    // } from './BaseDefine';
    import { Zondy } from '../../common/Base';
    import { DataStoreService } from '../ServiceBase';

    /**
     * @author 基础平台-王魁帅
     * @class module:弹性搜索服务.ESQueryStats
     * @description Zondy.DataStore.ElasticSearch.ESQueryStats————DataStore的es数据查询统计接口。如果查询路径中只有数据库名、工作空间名和表名，则查询结果为对应表中要素信息，不包含属性；如果没有统计字段，则查询结果为查询结果对应的要素信息，是否包含属性与includeProperites是否为true相关；如果有统计字段，则查询结果只有对应的统计结果信息。
     * @param {Object} option 查询条件
     * @param {String} [option.libName] 必选。数据库名
     * @param {String} [option.tableName] 必选。表名
     * @param {String} [option.geometry] 可选。(geometry和extent，二选一)。几何信息，圆、多边形等
     * @param {String} [option.extent] 可选。(geometry和extent，二选一)。地图范围,示例：{xmin:-180,ymin:-90,xmax:180,ymax:90}。这里extent会转换为geometry
     * @param {String} [option.geoFormat] 可选。(与 geometry或extent并存)。几何类型，wkt、wkb、geojson、自定义等
     * @param {Object} [option.filter] 可选。过滤条件
     * @param {String} [option.filter.spatialCondition] 可选。(spatialCondition和extent，二选一)空间条件
     * @param {String} [option.filter.extent] 可选。(spatialCondition和extent，二选一)空间条件，这里的extent会转换为spatialCondition
     * @param {String} [option.filter.timeCondition] 可选。时间条件
     * @param {String} [option.filter.timeCondition.field] 可选。时间字段
     * @param {String} [option.filter.timeCondition.timeRange] 可选。时间范围
     * @param {String} [option.filter.otherProperty] 可选。其他过滤条件
     * @param {String} [option.filter.fieldTag] 可选。过滤字段标签
     * @param {String} [option.fields] 可选。统计计算中用于分组字段名列表
     * @param {Array} [option.statisticFields] 可选。 统计字段 数组，里面可以包含多个Json数据，每个Json包含field和statisticTypes两个字段，表示某个类型数据的统计方式。示例：{field:"图斑地类面积",statisticTypes:"sum"}，表示图斑地类面积求和。其中statisticTypes有count,min,max,mean,sum,variance(方差),stddev(标准差）几种方式。
     * @param {String} [option.sref] 可选。动态投影坐标系 ID，支持 MapGIS 和 EPSG 标准编号，其中 MapGIS 只支持当前库中自带的坐标系的 ID，EPSG 标准请 使用 EPSG:4326 格式，若指定了该参数，则系统认为 geometry 的坐标系为此坐标系
     * @param {Boolean} [option.includeProperites = false] 可选。查询结果中是否包含属性
     * @param {Int} [option.pageSize=10] 可选。每页大小
     * @param {Int} [option.pageNo=1] 可选。页码，从1开始
     * @see https://shimo.im/docs/1d579d6a082a4631
     */
    export default class ESQueryStats extends DataStoreService {
        constructor(option) {
            super(option);

            /**
             * @member module:弹性搜索服务.ESQueryStats.prototype.serviceUrl
             * @type {String}
             * @description es数据查询统计服务地址
             * @default /datastore/rest/dataset/es/query/
             */
            this.serviceUrl = '/datastore/rest/dataset/es/query/';

            /**
             * @member module:弹性搜索服务.ESQueryStats.prototype.libName
             * @type {String}
             * @description 库名称
             * @default null
             */
            this.libName = option.libName !== undefined ? option.libName : null;

            /**
             * @member module:弹性搜索服务.ESQueryStats.prototype.tableName
             * @type {String}
             * @description 表名称
             * @default null
             */
            this.tableName = option.tableName !== undefined ? option.tableName : null;

            /**
             * @member module:弹性搜索服务.ESQueryStats.prototype.geometry
             * @type {String}
             * @description 几何信息，圆、多边形等
             * @default null
             */
            /**
             * @member module:弹性搜索服务.ESQueryStats.prototype.extent
             * @type {String}
             * @description 地图范围,示例：{xmin:-180,ymin:-90,xmax:180,ymax:90}。这里extent会转换为geometry
             * @default null
             */
            /**
             * @member module:弹性搜索服务.ESQueryStats.prototype.geoFormat
             * @type {String}
             * @description 几何类型，wkt、wkb、geojson、自定义等
             * @default 'wkt'
             */
            if (option.geometry !== undefined || option.extent !== undefined) {
                this.geoFormat = option.geoFormat !== undefined ? option.geoFormat : 'wkt'; // wkt、wkb、geojson等
                if (option.geometry !== undefined) {
                    this.geometry = option.geometry !== undefined ? option.geometry : null;
                } else if (option.extent !== undefined) {
                    let extent = option.extent;
                    this.geometry = 'polygon' + '(' + '(' + extent.xmin + ' ' + extent.ymax + ',' + extent.xmin + ' ' + extent.ymin + ',' + extent.xmax + ' ' + extent.ymin + ',' + extent.xmax + ' ' + extent.ymax + ',' + extent.xmin + ' ' + extent.ymax + ')' + ')';
                }
            }

            /**
             * @member module:弹性搜索服务.ESQueryStats.prototype.filter
             * @type {Object}
             * @description 过滤条件
             * @default null
             */
            if (option.filter !== undefined) {
                //this.option.filter = JSON.stringify(option.filter);
                this.filter = {};
                //[{"spatialCondition":"polygon:0.843798,80.58775;0.843746,140.586464;40.845467,140.5646;40.845467,80.5646;0.843798,80.58775","timeCondition":{"field":"GPS_DateTime","timeRange":"1351713168000,1351815300000"},"otherProperty":"ID=1012,Direction=178","fieldTag":"ID"}];
                if (option.filter.spatialCondition !== undefined) {
                    this.filter.spatialCondition = option.filter.spatialCondition;
                } else if (option.filter.extent !== undefined) {
                    let extent = option.filter.extent;
                    this.filter.spatialCondition = 'polygon' + ':' +
                        extent.ymax + ',' + extent.xmin + ';' + extent.yamx + ',' + extent.xmax + ';' + extent.ymin + ',' + extent.xmax + ';' + extent.ymin + ',' + extent.xmin;
                }
                if (option.filter.timeCondition !== undefined && option.filter.timeCondition.field !== undefined && option.filter.timeCondition.timeRange !== undefined) {
                    this.filter.timeCondition = {};
                    this.filter.timeCondition.field = option.filter.timeCondition.field;
                    this.filter.timeCondition.timeRange = option.filter.timeCondition.timeRange.join(',');
                }
                if (option.filter.otherProperty !== undefined && option.filter.otherProperty !== '') {
                    this.filter.otherProperty = option.filter.otherProperty;
                }
                if (option.filter.fieldTag !== undefined) {
                    this.filter.fieldTag = option.filter.fieldTag;
                }
                this.filter = '[' + JSON.stringify(this.filter) + ']';
            }

            /**
             * @member module:弹性搜索服务.ESQueryStats.prototype.fields
             * @type {String}
             * @description 统计计算中用于分组字段名列表
             * @default null
             */
            this.fields = option.fields !== undefined ? option.fields : null;

            /**
             * @member module:弹性搜索服务.ESQueryStats.prototype.statisticFields
             * @type {Array}
             * @description 统计字段 数组，里面可以包含多个Json数据
             * @default null
             */
            if (option.statisticFields !== undefined && option.statisticFields.length > 0) {
                let statisticFields = [];
                for (let i = 0; i < option.statisticFields.length; i++) {
                    let sFields = {
                        "field": option.statisticFields[i].field,
                        "statisticTypes": [option.statisticFields[i].statisticTypes]
                    };
                    statisticFields.push(sFields);
                }
                this.statisticFields = JSON.stringify(statisticFields);
            }
            /**
             * @member module:弹性搜索服务.ESQueryStats.prototype.sref
             * @type {String}
             * @description 动态投影坐标系 ID
             * @default null
             */
            this.sref = option.sref !== undefined ? option.sref : null;

            /**
             * @member module:弹性搜索服务.ESQueryStats.prototype.includeProperites
             * @type {Boolean}
             * @description 查询结果中是否包含属性
             * @default false
             */
            this.includeProperites = option.includeProperites !== undefined ? option.includeProperites : false;

            /**
             * @member module:弹性搜索服务.ESQueryStats.prototype.pageSize
             * @type {Int}
             * @description 每页大小
             * @default 10
             */
            this.pageSize = option.pageSize !== undefined ? option.pageSize : 10;
            /**
             * @member module:弹性搜索服务.ESQueryStats.prototype.pageNo
             * @type {Int}
             * @description 页码，从1开始
             * @default 1
             */
            this.pageNo = option.pageNo !== undefined ? option.pageNo : 1;

            this.fixOption();
        }

        /**
         * @private 修正get/post需要的真正参数
         */
        fixOption() {
            this.option = {
                geoFormat: this.geoFormat,
                geometry: this.geometry,
                filter: this.filter,
                fields: this.fields,
                statisticFields: this.statisticFields,
                sref: this.sref,
                includeProperites: this.includeProperites,
                pageSize: this.pageSize,
                pageNo: this.pageNo
            };
        }

        /**
         * @description 查询函数，向服务器发送请求,返回geosjon格式数据
         * @function module:弹性搜索服务.ESQueryStats.prototype.query
         * @param  {Function} onSuccess 查询成功回调函数。
         * @param {Function} onError 查询失败回调函数。
         */
        query(onSuccess, onError) {
            let { serviceUrl, option, libName, tableName} = this;
            serviceUrl = serviceUrl + libName + '/' + tableName;
            let url = this.getFullUrl(serviceUrl, option);
            this.get(url, onSuccess, onError);
        }
    }
    export { ESQueryStats };
    Zondy.DataStore.ElasticSearch.ESQueryStats = ESQueryStats;