cartodb/lib/assets/javascripts/builder/data/column-row-data.js
2020-06-15 10:58:47 +08:00

68 lines
1.8 KiB
JavaScript
Executable File

var _ = require('underscore');
var Backbone = require('backbone');
var CDB = require('internal-carto.js');
var queryTemplate = _.template('SELECT <%= column %> FROM (<%= sql %>) _table_sql GROUP BY <%= column %> ORDER BY <%= column %> ASC');
var MAX_ROW_COUNT = 100;
module.exports = Backbone.Model.extend({
initialize: function (attrs, opts) {
if (!opts.configModel) throw new Error('configModel param is required');
if (!opts.nodeDefModel) throw new Error('nodeDefModel param is required');
this._query = opts.nodeDefModel.querySchemaModel.get('query');
this._rowData = [];
this._SQL = new CDB.SQL({
user: opts.configModel.get('user_name'),
sql_api_template: opts.configModel.get('sql_api_template'),
api_key: opts.configModel.get('api_key')
});
this.on('change:column', this.fetch, this);
},
_onQueryDone: function (r) {
var resultCount = _.size(r.rows);
if (resultCount && resultCount < MAX_ROW_COUNT) {
this._rowData = _.pluck(r.rows, this.get('column'));
this.trigger('columnsFetched', this._rowData);
}
},
fetch: function () {
if (this.get('column') && this._query) {
this._SQL.execute(
queryTemplate({
sql: this._query,
column: this.get('column')
}),
null,
{
extra_params: ['page', 'rows_per_page'],
page: 0,
rows_per_page: 40,
success: this._onQueryDone.bind(this),
error: function () {
// TODO: what happens if fails?
}
}
);
}
},
getRows: function () {
var rowDataCount = _.size(this._rowData);
if (rowDataCount > 0) {
if (rowDataCount && rowDataCount < MAX_ROW_COUNT) {
return _.reject(this._rowData, _.isNull);
} else {
return false;
}
} else {
return false;
}
}
});