|
|
|
@ -38,7 +38,7 @@ module.exports = class AggregationMapConfig extends MapConfig {
|
|
|
|
|
return AggregationMapConfig.SUPPORTED_GEOMETRY_TYPES.includes(geometryType);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
constructor (config, connection, datasource) {
|
|
|
|
|
constructor (user, config, connection, datasource) {
|
|
|
|
|
super(config, datasource);
|
|
|
|
|
|
|
|
|
|
const validate = aggregationValidator(this);
|
|
|
|
@ -51,7 +51,8 @@ module.exports = class AggregationMapConfig extends MapConfig {
|
|
|
|
|
validate('threshold', positiveNumberValidator);
|
|
|
|
|
validate('columns', aggregationColumnsValidator);
|
|
|
|
|
|
|
|
|
|
this.connection = connection;
|
|
|
|
|
this.user = user;
|
|
|
|
|
this.pgConnection = connection;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getAggregatedQuery (index) {
|
|
|
|
@ -128,20 +129,41 @@ module.exports = class AggregationMapConfig extends MapConfig {
|
|
|
|
|
const limitedQuery = ctx => `SELECT * FROM (${ctx.query}) __cdb_schema LIMIT 0`;
|
|
|
|
|
const layer = this.getLayer(index);
|
|
|
|
|
|
|
|
|
|
this.connection.query(limitedQuery({ query: layer.options.sql }), (err, result) => {
|
|
|
|
|
this.pgConnection.getConnection(this.user, (err, connection) => {
|
|
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let columns = result.fields || [];
|
|
|
|
|
const sql = limitedQuery({ query: layer.options.sql });
|
|
|
|
|
|
|
|
|
|
columns = columns.map(({ name, type }) => ({ name, type }));
|
|
|
|
|
connection.query(sql, (err, result) => {
|
|
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (skipGeoms) {
|
|
|
|
|
columns = columns.filter((column) => !geomColumns.includes(column));
|
|
|
|
|
}
|
|
|
|
|
let columns = result.fields || [];
|
|
|
|
|
|
|
|
|
|
columns = columns.map(({ name, type }) => ({ name, type }));
|
|
|
|
|
|
|
|
|
|
return callback(err, columns);
|
|
|
|
|
if (skipGeoms) {
|
|
|
|
|
columns = columns.filter((column) => !geomColumns.includes(column));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return callback(err, columns);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
isDefaultAggregation (index) {
|
|
|
|
|
const aggregation = this.getAggregation(index);
|
|
|
|
|
return !aggregation || (
|
|
|
|
|
!aggregation.placement &&
|
|
|
|
|
this._isEmptyParameter(aggregation.columns) &&
|
|
|
|
|
this._isEmptyParameter(aggregation.dimensions)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_isEmptyParameter (parameter) {
|
|
|
|
|
return !parameter || Object.keys(parameter).length === 0;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|