Skip to content

Commit

Permalink
Merge pull request #576 from cggh/fixDataSort
Browse files Browse the repository at this point in the history
Fix data sort
  • Loading branch information
benjeffery authored Oct 21, 2016
2 parents 55ad5b7 + 0345b58 commit ed42dfb
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 52 deletions.
57 changes: 31 additions & 26 deletions server/responders/downloadtable.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,41 +7,46 @@
from DQXDbTools import DBTBESC
import config
import lzstring

import json
import DQXUtils

def response(returndata):
mytablename=returndata['tbname']
encodedquery=returndata['qry']
myorderfield=returndata['order']
sortreverse=int(returndata['sortreverse'])>0

mycolumns=DQXDbTools.ParseColumnEncoding(lzstring.decompressFromEncodedURIComponent(returndata['collist']))
tableId = returndata['table']
query = returndata['query']
columns = DQXDbTools.ParseColumnEncoding(lzstring.decompressFromEncodedURIComponent(returndata['columns']))
database = None
orderBy = None

databaseName=None
if 'database' in returndata:
databaseName = returndata['database']
with DQXDbTools.DBCursor(returndata, databaseName, read_timeout=config.TIMEOUT) as cur:
whc=DQXDbTools.WhereClause()
whc.ParameterPlaceHolder='%s'#NOTE!: MySQL PyODDBC seems to require this nonstardard coding
whc.Decode(encodedquery)
whc.CreateSelectStatement()
database = returndata['database']

sqlquery="SELECT {0} FROM {1}".format(','.join([DBCOLESC(x['Name']) for x in mycolumns]), DBTBESC(mytablename))
if len(whc.querystring_params)>0:
sqlquery+=" WHERE {0}".format(whc.querystring_params)
sqlquery+=" ORDER BY {0}".format(DQXDbTools.CreateOrderByStatement(myorderfield, sortreverse))
if 'orderBy' in returndata:
orderBy = json.loads(returndata['orderBy'])

with DQXDbTools.DBCursor(returndata, database, read_timeout = config.TIMEOUT) as cur:
whc = DQXDbTools.WhereClause()
whc.ParameterPlaceHolder = '%s' # NOTE: MySQL PyODDBC seems to require this nonstardard coding
whc.Decode(query)
whc.CreateSelectStatement()
sqlquery = "SELECT {0} FROM {1}" . format(','.join([DBCOLESC(x['Name']) for x in columns]), DBTBESC(tableId))
if len(whc.querystring_params) > 0:
sqlquery += " WHERE {0}" . format(whc.querystring_params)
if orderBy is not None:
sqlquery += " ORDER BY {0}" . format(','.join([DBCOLESC(col) + ' ' + direction for direction, col in orderBy]))
cur.execute(sqlquery, whc.queryparams)

yield '\t'.join(str(col[0]) for col in cur.description)+'\n'

yield '\t'.join(str(col[0]) for col in cur.description) + '\n'
for row in cur.fetchall() :
line='\t'.join([str(x) for x in row])+'\n'
line = '\t'.join([str(x) for x in row]) + '\n'
yield line
if DQXDbTools.LogRequests:
DQXUtils.LogServer('###QRY:' + sqlquery)
DQXUtils.LogServer('###PARAMS:' + str(whc.queryparams))


def handler(start_response, response):
status = '200 OK'
response_headers = [('Content-type', 'text/plain'),('Content-Disposition','attachment; filename=download.txt')]
start_response(status, response_headers)
for item in response:
yield item
status = '200 OK'
response_headers = [('Content-type', 'text/plain'), ('Content-Disposition','attachment; filename=download.txt')]
start_response(status, response_headers)
for item in response:
yield item
9 changes: 3 additions & 6 deletions webapp/src/js/components/containers/DataTableWithActions.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ let DataTableWithActions = React.createClass({
table: React.PropTypes.string.isRequired,
query: React.PropTypes.string,
order: React.PropTypes.array,
ascending: React.PropTypes.bool,
columns: React.PropTypes.array,
columnWidths: React.PropTypes.object,
initialStartRowIndex: React.PropTypes.number,
Expand All @@ -59,7 +58,6 @@ let DataTableWithActions = React.createClass({
table: null,
query: undefined,
order: [],
ascending: true,
columnWidths: {},
initialStartRowIndex: 0,
sidebar: true,
Expand Down Expand Up @@ -166,7 +164,7 @@ let DataTableWithActions = React.createClass({
onLimitBreach: this.handleDownloadLimitBreach,
query: this.getDefinedQuery(),
columns: this.props.columns,
ascending: this.props.ascending
order: this.props.order
}
);
},
Expand Down Expand Up @@ -247,7 +245,7 @@ let DataTableWithActions = React.createClass({

orderDescriptionString(order) {
if (order.length === 0) {
return "None";
return 'None';
}
return _map(order, ([dir, column]) =>
`${this.tableConfig().propertiesById[column].name} ${dir === 'asc' ? 'asc' : 'desc'}`)
Expand All @@ -257,7 +255,7 @@ let DataTableWithActions = React.createClass({
render() {

let actions = this.getFlux().actions;
let {table, columns, columnWidths, order, ascending, sidebar, setProps, searchText} = this.props;
let {table, columns, columnWidths, order, sidebar, setProps, searchText} = this.props;
let {fetchedRowsCount, startRowIndex, showableRowsCount, searchOpen, totalRowsCount} = this.state;

//Set default columns here as we can't do it in getDefaultProps as we don't have the config there.
Expand Down Expand Up @@ -449,7 +447,6 @@ let DataTableWithActions = React.createClass({
<DataTableView table={table}
query={dataTableQuery}
order={order}
ascending={ascending}
columns={columns}
columnWidths={columnWidths}
onColumnResize={this.handleColumnResize}
Expand Down
10 changes: 4 additions & 6 deletions webapp/src/js/components/panoptes/DataTableView.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,13 @@ let DataTableView = React.createClass({
PureRenderMixin,
FluxMixin,
ConfigMixin,
DataFetcherMixin('table', 'query', 'columns', 'order', 'ascending', 'startRowIndex')
DataFetcherMixin('table', 'query', 'columns', 'order', 'startRowIndex')
],

propTypes: {
table: React.PropTypes.string.isRequired,
query: React.PropTypes.string,
order: React.PropTypes.array,
ascending: React.PropTypes.bool,
startRowIndex: React.PropTypes.number,
columns: React.PropTypes.array,
columnWidths: React.PropTypes.object,
Expand All @@ -69,7 +68,6 @@ let DataTableView = React.createClass({
table: null,
query: undefined,
order: [],
ascending: true,
startRowIndex: 0,
columns: [],
columnWidths: {},
Expand Down Expand Up @@ -168,7 +166,7 @@ let DataTableView = React.createClass({
let newDir = 'asc';
_forEach(currentOrder, ([dir, orderCol]) => {
if (orderCol === column) {
newDir = {asc:'desc', desc:null}[dir];
newDir = {asc: 'desc', desc: null}[dir];
}
});
//Remove this column from the sort order
Expand Down Expand Up @@ -245,8 +243,8 @@ let DataTableView = React.createClass({
}
let columnData = this.tableConfig().propertiesById[column];
let {id, isPrimKey, description, name} = columnData;
let asc = _some(order, ([dir, orderCol]) => dir === 'asc' && orderCol===column);
let desc = _some(order, ([dir, orderCol]) => dir === 'desc' && orderCol===column);
let asc = _some(order, ([dir, orderCol]) => dir === 'asc' && orderCol === column);
let desc = _some(order, ([dir, orderCol]) => dir === 'desc' && orderCol === column);
let width = columnWidths[column] || this.defaultWidth(columnData);
return <Column
//TODO Better default column widths
Expand Down
25 changes: 11 additions & 14 deletions webapp/src/js/util/DataDownloader.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,18 @@ import Immutable from 'immutable';
import LZString from 'lz-string';
import API from 'panoptes/API';
import SQL from 'panoptes/SQL';
import Base64 from 'panoptes/Base64';

const MAX_DOWNLOAD_DATA_POINTS = 100000;

// TODO: migrate to API.js ???
function downloadTableData(payload) {

let defaults = {
query: SQL.nullQuery,
ascending: true
query: SQL.nullQuery
};

let {dataset, table, query, columns, tableConfig, ascending, rowsCount, onLimitBreach} = {...defaults, ...payload};
let {dataset, table, query, columns, tableConfig, rowsCount, onLimitBreach, order} = {...defaults, ...payload};

// If no columns have been specified, get all of the showable columns.
if (!columns)
Expand Down Expand Up @@ -43,18 +43,15 @@ function downloadTableData(payload) {
}

let downloadURL = API.serverURL;
downloadURL += '?datatype' + '=' + 'downloadtable';
downloadURL += '&database' + '=' + dataset;
downloadURL += '&qry' + '=' + API.encodeQuery(query);
downloadURL += '&tbname' + '=' + table;
downloadURL += '&collist' + '=' + LZString.compressToEncodedURIComponent(columnList);
if (tableConfig.position) {
downloadURL += '&posfield' + '=' + tableConfig.position;
downloadURL += '&order' + '=' + tableConfig.position;
} else {
downloadURL += '&order' + '=' + tableConfig.primKey;
downloadURL += '?datatype=downloadtable';
downloadURL += '&database=' + dataset;
downloadURL += '&query=' + API.encodeQuery(query);
downloadURL += '&table=' + table;
downloadURL += '&columns=' + LZString.compressToEncodedURIComponent(columnList);

if (order instanceof Array && order.length > 0) {
downloadURL += '&orderBy=' + JSON.stringify(order);
}
downloadURL += '&sortreverse' + '=' + (ascending ? '0' : '1');

window.location.href = downloadURL;
}
Expand Down

0 comments on commit ed42dfb

Please sign in to comment.