Skip to content

Commit

Permalink
fix(select): make to rebase master
Browse files Browse the repository at this point in the history
  • Loading branch information
prosdev0107 committed Mar 17, 2022
2 parents 96fbe51 + cfb967f commit c6a3966
Show file tree
Hide file tree
Showing 154 changed files with 4,183 additions and 883 deletions.
3 changes: 2 additions & 1 deletion UPDATING.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,12 @@ flag for the legacy datasource editor (DISABLE_LEGACY_DATASOURCE_EDITOR) in conf

### Deprecations

- [19078](https://github.com/apache/superset/pull/19078): Creation of old shorturl links has been deprecated in favor of a new permalink feature that solves the long url problem (old shorturls will still work, though!). By default, new permalinks use UUID4 as the key. However, to use serial ids similar to the old shorturls, add the following to your `superset_config.py`: `PERMALINK_KEY_TYPE = "id"`.
- [18960](https://github.com/apache/superset/pull/18960): Persisting URL params in chart metadata is no longer supported. To set a default value for URL params in Jinja code, use the optional second argument: `url_param("my-param", "my-default-value")`.

### Other

- [17589](https://github.com/apache/incubator-superset/pull/17589): It is now possible to limit access to users' recent activity data by setting the `ENABLE_BROAD_ACTIVITY_ACCESS` config flag to false, or customizing the `raise_for_user_activity_access` method in the security manager.
- [17589](https://github.com/apache/superset/pull/17589): It is now possible to limit access to users' recent activity data by setting the `ENABLE_BROAD_ACTIVITY_ACCESS` config flag to false, or customizing the `raise_for_user_activity_access` method in the security manager.
- [17536](https://github.com/apache/superset/pull/17536): introduced a key-value endpoint to store dashboard filter state. This endpoint is backed by Flask-Caching and the default configuration assumes that the values will be stored in the file system. If you are already using another cache backend like Redis or Memchached, you'll probably want to change this setting in `superset_config.py`. The key is `FILTER_STATE_CACHE_CONFIG` and the available settings can be found in Flask-Caching [docs](https://flask-caching.readthedocs.io/en/latest/).
- [17882](https://github.com/apache/superset/pull/17882): introduced a key-value endpoint to store Explore form data. This endpoint is backed by Flask-Caching and the default configuration assumes that the values will be stored in the file system. If you are already using another cache backend like Redis or Memchached, you'll probably want to change this setting in `superset_config.py`. The key is `EXPLORE_FORM_DATA_CACHE_CONFIG` and the available settings can be found in Flask-Caching [docs](https://flask-caching.readthedocs.io/en/latest/).

Expand Down
2 changes: 1 addition & 1 deletion superset-frontend/cypress-base/cypress.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"baseUrl": "http://localhost:8088",
"chromeWebSecurity": false,
"defaultCommandTimeout": 5000,
"defaultCommandTimeout": 8000,
"numTestsKeptInMemory": 0,
"experimentalFetchPolyfill": true,
"requestTimeout": 10000,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,23 +27,29 @@ interface QueryString {
native_filters_key: string;
}

describe('nativefiler url param key', () => {
xdescribe('nativefiler url param key', () => {
// const urlParams = { param1: '123', param2: 'abc' };
before(() => {
cy.login();
cy.visit(WORLD_HEALTH_DASHBOARD);
WORLD_HEALTH_CHARTS.forEach(waitForChartLoad);
cy.wait(1000); // wait for key to be published (debounced)
});

let initialFilterKey: string;
it('should have cachekey in nativefilter param', () => {
// things in `before` will not retry and the `waitForChartLoad` check is
// especically flaky and may need more retries
cy.visit(WORLD_HEALTH_DASHBOARD);
WORLD_HEALTH_CHARTS.forEach(waitForChartLoad);
cy.wait(1000); // wait for key to be published (debounced)
cy.location().then(loc => {
const queryParams = qs.parse(loc.search) as QueryString;
expect(typeof queryParams.native_filters_key).eq('string');
});
});

it('should have different key when page reloads', () => {
cy.visit(WORLD_HEALTH_DASHBOARD);
WORLD_HEALTH_CHARTS.forEach(waitForChartLoad);
cy.wait(1000); // wait for key to be published (debounced)
cy.location().then(loc => {
const queryParams = qs.parse(loc.search) as QueryString;
expect(queryParams.native_filters_key).not.equal(initialFilterKey);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,11 @@ export interface ChartMetadataConfig {
exampleGallery?: ExampleImage[];
tags?: string[];
category?: string | null;
label?: {
name?: ChartLabel;
description?: string;
} | null;
// deprecated: true hides a chart from all viz picker interactions.
deprecated?: boolean;
// label: ChartLabel.DEPRECATED which will display a "deprecated" label on the chart.
label?: ChartLabel | null;
labelExplanation?: string | null;
}

export default class ChartMetadata {
Expand Down Expand Up @@ -80,10 +81,11 @@ export default class ChartMetadata {

category: string | null;

label?: {
name?: ChartLabel;
description?: string;
} | null;
deprecated?: boolean;

label?: ChartLabel | null;

labelExplanation?: string | null;

constructor(config: ChartMetadataConfig) {
const {
Expand All @@ -101,7 +103,9 @@ export default class ChartMetadata {
exampleGallery = [],
tags = [],
category = null,
deprecated = false,
label = null,
labelExplanation = null,
} = config;

this.name = name;
Expand All @@ -127,7 +131,9 @@ export default class ChartMetadata {
this.exampleGallery = exampleGallery;
this.tags = tags;
this.category = category;
this.deprecated = deprecated;
this.label = label;
this.labelExplanation = labelExplanation;
}

canBeAnnotationType(type: string): boolean {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,18 +53,21 @@ export interface PlainObject {
}

export enum ChartLabel {
VERIFIED = 'VERIFIED',
DEPRECATED = 'DEPRECATED',
FEATURED = 'FEATURED',
}

export const ChartLabelWeight = {
export const chartLabelExplanations: Record<ChartLabel, string> = {
[ChartLabel.DEPRECATED]:
'This chart uses features or modules which are no longer actively maintained. It will eventually be replaced or removed.',
[ChartLabel.FEATURED]:
'This chart was tested and verified, so the overall experience should be stable.',
};

export const chartLabelWeight: Record<ChartLabel, { weight: number }> = {
[ChartLabel.DEPRECATED]: {
weight: -0.1,
},
[ChartLabel.VERIFIED]: {
weight: 0.2,
},
[ChartLabel.FEATURED]: {
weight: 0.1,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,17 +171,20 @@ class AceEditorWrapper extends React.PureComponent<Props, State> {
meta: 'schema',
}));
const columns = {};
const tables = props.extendedTables || props.tables || [];

const tables = props.tables || [];
const extendedTables = props.extendedTables || [];

const tableWords = tables.map(t => {
const tableName = t.name;
const cols = t.columns || [];
const tableName = t.value;
const extendedTable = extendedTables.find(et => et.name === tableName);
const cols = (extendedTable && extendedTable.columns) || [];
cols.forEach(col => {
columns[col.name] = null; // using an object as a unique set
});

return {
name: tableName,
name: t.label,
value: tableName,
score: TABLE_AUTOCOMPLETE_SCORE,
meta: 'table',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,12 @@
* under the License.
*/
import React from 'react';
import { render } from 'spec/helpers/testing-library';
import { ThemeProvider, supersetTheme } from '@superset-ui/core';
import { shallow } from 'enzyme';
import sinon from 'sinon';
import thunk from 'redux-thunk';
import configureStore from 'redux-mock-store';
import QueryAutoRefresh from 'src/SqlLab/components/QueryAutoRefresh';
import { initialState, runningQuery } from 'src/SqlLab/fixtures';
import fetchMock from 'fetch-mock';
import * as actions from 'src/SqlLab/actions/sqlLab';

describe('QueryAutoRefresh', () => {
const middlewares = [thunk];
Expand All @@ -40,29 +38,31 @@ describe('QueryAutoRefresh', () => {
sqlLab,
};
const store = mockStore(state);
const setup = (overrides = {}) => (
<ThemeProvider theme={supersetTheme}>
<QueryAutoRefresh store={store} {...overrides} />
</ThemeProvider>
);

const mockFetch = fetchMock.get('glob:*/superset/queries/*', {});
const getWrapper = () =>
shallow(<QueryAutoRefresh store={store} />)
.dive()
.dive();
let wrapper;

it('shouldCheckForQueries', () => {
render(setup(), {
useRedux: true,
});

expect(mockFetch.called()).toBe(true);
wrapper = getWrapper();
expect(wrapper.instance().shouldCheckForQueries()).toBe(true);
});

it('setUserOffline', () => {
const spy = jest.spyOn(actions, 'setUserOffline');
wrapper = getWrapper();
const spy = sinon.spy(wrapper.instance().props.actions, 'setUserOffline');

render(setup(), {
useRedux: true,
// state not changed
wrapper.setState({
offline: false,
});
expect(spy.called).toBe(false);

expect(spy).toHaveBeenCalled();
// state is changed
wrapper.setState({
offline: true,
});
expect(spy.callCount).toBe(1);
});
});
86 changes: 47 additions & 39 deletions superset-frontend/src/SqlLab/components/QueryAutoRefresh/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
import { useState, useEffect } from 'react';
import React from 'react';
import PropTypes from 'prop-types';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
Expand All @@ -28,70 +28,78 @@ const QUERY_UPDATE_BUFFER_MS = 5000;
const MAX_QUERY_AGE_TO_POLL = 21600000;
const QUERY_TIMEOUT_LIMIT = 10000;

function QueryAutoRefresh({ offline, queries, queriesLastUpdate, actions }) {
const [offlineState, setOfflineState] = useState(offline);
let timer = null;
class QueryAutoRefresh extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
offline: props.offline,
};
}

UNSAFE_componentWillMount() {
this.startTimer();
}

componentDidUpdate(prevProps) {
if (prevProps.offline !== this.state.offline) {
this.props.actions.setUserOffline(this.state.offline);
}
}

componentWillUnmount() {
this.stopTimer();
}

const shouldCheckForQueries = () => {
shouldCheckForQueries() {
// if there are started or running queries, this method should return true
const { queries } = this.props;
const now = new Date().getTime();
const isQueryRunning = q =>
['running', 'started', 'pending', 'fetching'].indexOf(q.state) >= 0;

return Object.values(queries).some(
q => isQueryRunning(q) && now - q.startDttm < MAX_QUERY_AGE_TO_POLL,
);
};
}

startTimer() {
if (!this.timer) {
this.timer = setInterval(this.stopwatch.bind(this), QUERY_UPDATE_FREQ);
}
}

const stopwatch = () => {
stopTimer() {
clearInterval(this.timer);
this.timer = null;
}

stopwatch() {
// only poll /superset/queries/ if there are started or running queries
if (shouldCheckForQueries()) {
if (this.shouldCheckForQueries()) {
SupersetClient.get({
endpoint: `/superset/queries/${
queriesLastUpdate - QUERY_UPDATE_BUFFER_MS
this.props.queriesLastUpdate - QUERY_UPDATE_BUFFER_MS
}`,
timeout: QUERY_TIMEOUT_LIMIT,
})
.then(({ json }) => {
if (Object.keys(json).length > 0) {
actions.refreshQueries(json);
this.props.actions.refreshQueries(json);
}

setOfflineState(false);
this.setState({ offline: false });
})
.catch(() => {
setOfflineState(true);
this.setState({ offline: true });
});
} else {
setOfflineState(false);
this.setState({ offline: false });
}
};

const startTimer = () => {
if (!timer) {
timer = setInterval(stopwatch(), QUERY_UPDATE_FREQ);
}
};

const stopTimer = () => {
clearInterval(timer);
timer = null;
};

useEffect(() => {
startTimer();
return () => {
stopTimer();
};
}, []);
}

useEffect(() => {
actions.setUserOffline(offlineState);
}, [offlineState]);

return null;
render() {
return null;
}
}

QueryAutoRefresh.propTypes = {
offline: PropTypes.bool.isRequired,
queries: PropTypes.object.isRequired,
Expand Down
Loading

0 comments on commit c6a3966

Please sign in to comment.