Skip to content
Snippets Groups Projects
Commit 25074a41 authored by Atte Keinänen's avatar Atte Keinänen
Browse files

Rename metadataLoaded to metadataFetched, make it more robust

parent 7e670309
Branches
Tags
No related merge requests found
......@@ -65,7 +65,7 @@ export const fetchData = async ({
const existingData = getIn(getState(), existingStatePath);
const statePath = requestStatePath.concat(['fetch']);
try {
const requestState = getIn(getState(), ["requests", ...statePath]);
const requestState = getIn(getState(), ["requests", "states", ...statePath]);
if (!requestState || requestState.error || reload) {
dispatch(setRequestState({ statePath, state: "LOADING" }));
const data = await getData();
......
......@@ -3,16 +3,16 @@ import { connect } from 'react-redux'
import { fetchMetrics, fetchDatabases } from "metabase/redux/metadata";
import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
import EntitySearch from "metabase/containers/EntitySearch";
import { getMetadata, getMetadataLoaded } from "metabase/selectors/metadata";
import { getMetadata, getMetadataFetched } from "metabase/selectors/metadata";
import type { Metric } from "metabase/meta/types/Metric";
import type Metadata from "metabase-lib/lib/metadata/Metadata";
@connect(state => ({ metadata: getMetadata(state), metadataLoaded: getMetadataLoaded(state) }), { fetchMetrics, fetchDatabases })
@connect(state => ({ metadata: getMetadata(state), metadataFetched: getMetadataFetched(state) }), { fetchMetrics, fetchDatabases })
export default class MetricSearch extends Component {
props: {
metadata: Metadata,
metadataLoaded: any,
metadataFetched: any,
fetchMetrics: () => void,
fetchDatabases: () => void,
onChooseMetric: (Metric) => void
......@@ -24,9 +24,9 @@ export default class MetricSearch extends Component {
}
render() {
const { metadataLoaded, metadata, onChooseMetric } = this.props;
const { metadataFetched, metadata, onChooseMetric } = this.props;
const isLoading = !metadataLoaded.metrics || !metadataLoaded.databases
const isLoading = !metadataFetched.metrics || !metadataFetched.databases
return (
<LoadingAndErrorWrapper loading={isLoading}>
......
......@@ -16,7 +16,7 @@ import Database from "metabase-lib/lib/metadata/Database";
import StructuredQuery from "metabase-lib/lib/queries/StructuredQuery"
import type { TableId } from "metabase/meta/types/Table";
import Metadata from "metabase-lib/lib/metadata/Metadata";
import { getMetadata, getMetadataLoaded } from "metabase/selectors/metadata";
import { getMetadata, getMetadataFetched } from "metabase/selectors/metadata";
import NewQueryOption from "metabase/new_query/components/NewQueryOption";
import NativeQuery from "metabase-lib/lib/queries/NativeQuery";
import { getCurrentQuery, getPlainNativeQuery } from "metabase/new_query/selectors";
......@@ -31,7 +31,7 @@ const mapStateToProps = state => ({
query: getCurrentQuery(state),
plainNativeQuery: getPlainNativeQuery(state),
metadata: getMetadata(state),
metadataLoaded: getMetadataLoaded(state),
metadataFetched: getMetadataFetched(state),
isAdmin: getUserIsAdmin(state)
})
......@@ -129,10 +129,10 @@ export class NewQuery extends Component {
}
render() {
const { query, metadata, metadataLoaded, isAdmin } = this.props
const { query, metadata, metadataFetched, isAdmin } = this.props
const { currentStep } = this.state;
if (!query || !metadataLoaded.metrics || !metadataLoaded.segments) {
if (!query || !metadataFetched.metrics || !metadataFetched.segments) {
return <LoadingAndErrorWrapper loading={true}/>
}
......
......@@ -5,16 +5,16 @@ import { connect } from 'react-redux'
import { fetchDatabases, fetchSegments } from "metabase/redux/metadata";
import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
import EntitySearch from "metabase/containers/EntitySearch";
import { getMetadata, getMetadataLoaded } from "metabase/selectors/metadata";
import { getMetadata, getMetadataFetched } from "metabase/selectors/metadata";
import Metadata from "metabase-lib/lib/metadata/Metadata";
import type { Segment } from "metabase/meta/types/Segment";
@connect(state => ({ metadata: getMetadata(state), metadataLoaded: getMetadataLoaded(state) }), { fetchSegments, fetchDatabases })
@connect(state => ({ metadata: getMetadata(state), metadataFetched: getMetadataFetched(state) }), { fetchSegments, fetchDatabases })
export default class SegmentSearch extends Component {
props: {
metadata: Metadata,
metadataLoaded: any,
metadataFetched: any,
fetchSegments: () => void,
fetchDatabases: () => void,
onChooseSegment: (Segment) => void
......@@ -26,9 +26,9 @@ export default class SegmentSearch extends Component {
}
render() {
const { metadataLoaded, metadata, onChooseSegment } = this.props;
const { metadataFetched, metadata, onChooseSegment } = this.props;
const isLoading = !metadataLoaded.segments || !metadataLoaded.databases
const isLoading = !metadataFetched.segments || !metadataFetched.databases
return (
<LoadingAndErrorWrapper loading={isLoading}>
......
......@@ -81,7 +81,6 @@ export const updateMetricImportantFields = createThunkAction(UPDATE_METRIC_IMPOR
};
});
export const FETCH_SEGMENTS = "metabase/metadata/FETCH_SEGMENTS";
export const fetchSegments = createThunkAction(FETCH_SEGMENTS, (reload = false) => {
return async (dispatch, getState) => {
......
/* @flow weak */
import { handleActions, createAction } from "metabase/lib/redux";
import { assocIn } from "icepick";
import { getIn, assocIn } from "icepick";
import { combineReducers } from "redux";
const SET_REQUEST_STATE = "metabase/requests/SET_REQUEST_STATE";
const CLEAR_REQUEST_STATE = "metabase/requests/CLEAR_REQUEST_STATE";
......@@ -9,7 +10,8 @@ const CLEAR_REQUEST_STATE = "metabase/requests/CLEAR_REQUEST_STATE";
export const setRequestState = createAction(SET_REQUEST_STATE);
export const clearRequestState = createAction(CLEAR_REQUEST_STATE);
export default handleActions({
// For a given state path, returns the current request state ("LOADING", "LOADED" or a request error)
export const states = handleActions({
[SET_REQUEST_STATE]: {
next: (state, { payload }) => assocIn(
state,
......@@ -25,3 +27,26 @@ export default handleActions({
)
}
}, {});
// For given state path, returns true if the data has been successfully fetched at least once
export const fetched = handleActions({
[SET_REQUEST_STATE]: {
next: (state, {payload}) => {
const isFetch = payload.statePath[payload.statePath.length - 1] === "fetch"
if (isFetch) {
const statePathWithoutFetch = payload.statePath.slice(0, -1)
return assocIn(
state,
statePathWithoutFetch,
getIn(state, statePathWithoutFetch) || payload.state === "LOADED"
)
} else {
}
}
}
}, {})
export default combineReducers({ states, fetched })
......@@ -27,8 +27,8 @@ export const getNormalizedTables = state => state.metadata.tables;
export const getNormalizedFields = state => state.metadata.fields;
export const getNormalizedMetrics = state => state.metadata.metrics;
export const getNormalizedSegments = state => state.metadata.segments;
export const getMetadataRequestStates = state => (state.requests && state.requests.metadata) || {};
export const getMetadataFetched = state => state.requests.fetched.metadata || {}
// TODO: these should be denomalized but non-cylical, and only to the same "depth" previous "tableMetadata" was, e.x.
//
......@@ -54,8 +54,6 @@ export const getShallowFields = getNormalizedFields;
export const getShallowMetrics = getNormalizedMetrics;
export const getShallowSegments = getNormalizedSegments;
export const getMetadataLoaded = createSelector([getMetadataRequestStates], getLoadedStatuses);
// fully connected graph of all databases, tables, fields, segments, and metrics
export const getMetadata = createSelector(
[
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment