import React from 'react'; import PropTypes from 'prop-types'; import { Alert, Button, ButtonGroup, ProgressBar } from 'react-bootstrap'; import shortid from 'shortid'; import VisualizeModal from './VisualizeModal'; import HighlightedSql from './HighlightedSql'; import FilterableTable from '../../components/FilterableTable/FilterableTable'; const propTypes = { actions: PropTypes.object, csv: PropTypes.bool, query: PropTypes.object, search: PropTypes.bool, showSql: PropTypes.bool, visualize: PropTypes.bool, cache: PropTypes.bool, height: PropTypes.number.isRequired, }; const defaultProps = { search: true, visualize: true, showSql: false, csv: true, actions: {}, cache: false, }; const RESULT_SET_CONTROLS_HEIGHT = 46; export default class ResultSet extends React.PureComponent { constructor(props) { super(props); this.state = { searchText: '', showModal: false, data: [], height: props.search ? props.height - RESULT_SET_CONTROLS_HEIGHT : props.height, }; } componentDidMount() { // only do this the first time the component is rendered/mounted this.reRunQueryIfSessionTimeoutErrorOnMount(); } componentWillReceiveProps(nextProps) { // when new results comes in, save them locally and clear in store if (this.props.cache && (!nextProps.query.cached) && nextProps.query.results && nextProps.query.results.data.length > 0) { this.setState( { data: nextProps.query.results.data }, this.clearQueryResults(nextProps.query), ); } if (nextProps.query.resultsKey && nextProps.query.resultsKey !== this.props.query.resultsKey) { this.fetchResults(nextProps.query); } } getControls() { if (this.props.search || this.props.visualize || this.props.csv) { let csvButton; if (this.props.csv) { csvButton = ( ); } let visualizeButton; if (this.props.visualize) { visualizeButton = ( ); } let searchBox; if (this.props.search) { searchBox = ( ); } return (
{visualizeButton} {csvButton}
{searchBox}
); } return
; } clearQueryResults(query) { this.props.actions.clearQueryResults(query); } popSelectStar() { const qe = { id: shortid.generate(), title: this.props.query.tempTable, autorun: false, dbId: this.props.query.dbId, sql: `SELECT * FROM ${this.props.query.tempTable}`, }; this.props.actions.addQueryEditor(qe); } showModal() { this.setState({ showModal: true }); } hideModal() { this.setState({ showModal: false }); } changeSearch(event) { this.setState({ searchText: event.target.value }); } fetchResults(query) { this.props.actions.fetchQueryResults(query); } reFetchQueryResults(query) { this.props.actions.reFetchQueryResults(query); } reRunQueryIfSessionTimeoutErrorOnMount() { const { query } = this.props; if (query.errorMessage && query.errorMessage.indexOf('session timed out') > 0) { this.props.actions.runQuery(query, true); } } render() { const query = this.props.query; const results = query.results; let data; if (this.props.cache && query.cached) { data = this.state.data; } else { data = results ? results.data : []; } let sql; if (query.state === 'stopped') { return Query was stopped; } if (this.props.showSql) { sql = ; } if (['running', 'pending', 'fetching'].indexOf(query.state) > -1) { let progressBar; if (query.progress > 0 && query.state === 'running') { progressBar = ( ); } return (
Loading... {progressBar}
); } else if (query.state === 'failed') { return {query.errorMessage}; } else if (query.state === 'success' && query.ctas) { return (
Table [{query.tempTable}] was created  
); } else if (query.state === 'success') { if (results && data && data.length > 0) { return (
{this.getControls.bind(this)()} {sql} col.name)} height={this.state.height} filterText={this.state.searchText} />
); } } if (query.cached) { return ( ); } return The query returned no data; } } ResultSet.propTypes = propTypes; ResultSet.defaultProps = defaultProps;