106 lines
2.8 KiB
JavaScript
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'
|
||
|
}*/
|
||
|
|
||
|
});
|