cartodb-4.42/lib/assets/javascripts/cartodb/models/sqlview.js
2024-04-06 05:25:13 +00:00

106 lines
2.8 KiB
JavaScript

/**
* contains data for a sql view
* var s = new cdb.admin.SQLViewData({ sql : "select...." });
* s.fetch();
*/
cdb.admin.SQLViewData = cdb.admin.CartoDBTableData.extend({
UNDEFINED_TYPE_COLUMN: 'undefined',
initialize: function(models, options) {
this.model.prototype.idAttribute = 'cartodb_id';
// this.elder('initialize', models, options);
cdb.admin.CartoDBTableData.prototype.initialize.call(this, models, options);
this.bind('error', function() {
this.reset([]);
});
//this.initOptions();
if(options && options.sql) {
this.setSQL(options.sql);
}
},
_parseSQL: function(sql) {
sql = sql.replace(/([^\\]){x}/g, '$10').replace(/\\{x}/g, '{x}')
sql = sql.replace(/([^\\]){y}/g, '$10').replace(/\\{y}/g, '{y}')
sql = sql.replace(/([^\\]){z}/g, '$10').replace(/\\{z}/g, '{z}')
// Substitute mapnik tokens
// resolution at zoom level 0
var res = '156543.03515625';
// full webmercator extent
var ext = 'ST_MakeEnvelope(-20037508.5,-20037508.5,20037508.5,20037508.5,3857)';
sql = sql.replace('!bbox!', ext)
.replace('!pixel_width!', res)
.replace('!pixel_height!', res);
return sql
},
sqlSource: function() {
return this.options.get('sql_source');
},
setSQL: function(sql, opts) {
opts = opts || {}
// reset options whiout changing raising a new fetchs
this.options.set({
page: 0,
sort_order: 'asc',
order_by: '',
filter_column: '',
filter_value: '',
sql_source: opts.sql_source || null
}, { silent: true } );
var silent = opts.silent;
opts.silent = true;
this.options.set({ sql : sql ? this._parseSQL(sql): '' }, opts);
if(!silent) {
this.options.trigger('change:sql', this.options, sql);
}
},
getSQL: function() {
return this.options.get('sql');
},
url: function() {
return this.sqlApiUrl();
},
isReadOnly: function() {
return this.sqlSource() !== 'filters';
},
quartiles: function(nslots, column, callback, error) {
var tmpl = _.template('SELECT quartile, max(<%= column %>) as maxAmount FROM (SELECT <%= column %>, ntile(<%= slots %>) over (order by <%= column %>) as quartile FROM (<%= sql %>) as _rambo WHERE <%= column %> IS NOT NULL) x GROUP BY quartile ORDER BY quartile');
this._sqlQuery(tmpl({
slots: nslots,
sql: this.options.get('sql'),
column: column
}),
function(data) {
callback(_(data.rows).pluck('maxamount'));
},
error);
},
// returns if the query contains geo data
isGeoreferenced: function() {
return this.getGeometryTypes().length > 0;
}
/*url: function() {
if(!this.sql) {
throw "sql must be provided";
}
return '/api/v1/queries?sql=' +
encodeURIComponent(this.sql) +
'&limit=20&rows_per_page=40&page=0'
}*/
});