'use strict'; var _ = require('underscore'); var AnalysisFilter = require('../models/filter/analysis'); function FilterStatsBackends(pgQueryRunner) { this.pgQueryRunner = pgQueryRunner; } module.exports = FilterStatsBackends; function getEstimatedRows(pgQueryRunner, username, query, callback) { pgQueryRunner.run(username, "EXPLAIN (FORMAT JSON)"+query, function(err, result_rows) { if (err){ callback(err); return; } var rows; if ( result_rows[0] && result_rows[0]['QUERY PLAN'] && result_rows[0]['QUERY PLAN'][0] && result_rows[0]['QUERY PLAN'][0].Plan ) { rows = result_rows[0]['QUERY PLAN'][0].Plan['Plan Rows']; } return callback(null, rows); }); } FilterStatsBackends.prototype.getFilterStats = function (username, unfiltered_query, filters, callback) { var stats = {}; getEstimatedRows(this.pgQueryRunner, username, unfiltered_query, (err, rows) => { if (err){ return callback(err); } stats.unfiltered_rows = rows; if (!filters || _.isEmpty(filters)) { return callback(null, stats); } var analysisFilter = new AnalysisFilter(filters); var query = analysisFilter.sql(unfiltered_query); getEstimatedRows(this.pgQueryRunner, username, query, (err, rows) => { if (err){ return callback(err); } stats.filtered_rows = rows; return callback(null, stats); }); }); };