From 2ca7d724ca4512461d51ff44c419f5ff7d3c4a9d Mon Sep 17 00:00:00 2001 From: Nico Vermaas <vermaas@astron.nl> Date: Mon, 1 Nov 2021 14:14:03 +0100 Subject: [PATCH] adding multiple archive query (under construction) --- src/components/query/QueryMultipleArchives.js | 205 +++++++++++------- src/contexts/MAQContext.js | 3 +- 2 files changed, 123 insertions(+), 85 deletions(-) diff --git a/src/components/query/QueryMultipleArchives.js b/src/components/query/QueryMultipleArchives.js index 6b3b2e0..b4405f9 100644 --- a/src/components/query/QueryMultipleArchives.js +++ b/src/components/query/QueryMultipleArchives.js @@ -7,7 +7,8 @@ import { GlobalContext } from "../../contexts/GlobalContext"; import { QueryContext } from "../../contexts/QueryContext"; import parseQueryForm from "../../utils/form/parseQueryForm"; import { MAQContext, - CREATE_QUERY_PARAMS, + QUERY_FORM, + CREATE_QUERIES, QUERIES_SELECTED, FETCHING_CREATE_QUERY, FETCHED_CREATE_QUERY, @@ -19,7 +20,7 @@ import { MAQContext, import CreateMultiQueryResults from "../services/query_results/CreateMultiQueryResults"; import RunMultiQueryResults from "../services/query_results/RunMultiQueryResults"; import { getQueryIcon } from "../../utils/styling"; - +import LoadingSpinner from "../LoadingSpinner"; export default function QueryMultipleArchives() { @@ -34,132 +35,142 @@ export default function QueryMultipleArchives() { status, setStatus } = useContext(MAQContext); const maqContext = useContext(MAQContext); - // set ConfigName for archive - useEffect(() => { - setConfigName("multiple_archives"); - return () => { - console.log("cleaned up"); - //queryMap.clear(); - setFormData(); - setConfigName(defaultConf); - }; - }, []); - // load the GUI for this configuration - // should useEffect be used at all? Shouldn't this code just be in the body of the function? + // call to the ESAP API 'create-query' endpoint to construct a query based on esap common parameters + function fetchCreateQueries() { - useEffect(() => { - console.log("query schema:", config.query_schema); if (!formData) return; - console.log("formData:", formData); const query_schema_name = config.query_schema.name; + let queries = []; let archive_queries = [] - if (status === CREATE_QUERY_PARAMS) { + // create a list of queries based on the filled in form + queries = parseQueryForm(query_schema_name, formData); - // create a list of queries based on the filled in form - queries = parseQueryForm(query_schema_name, formData); + console.log("queries:", queries); - console.log("queries:", queries); + // iterate through the query per archive + queries.forEach((query) => { - // iterate through the query per archive - queries.forEach((query) => { + let url = api_host + "query/create-query?" + query.esap_query; - let url = api_host + "query/create-query?" + query.esap_query; + setStatus(FETCHING_CREATE_QUERY) + console.log('status = '+status) - setStatus(FETCHING_CREATE_QUERY) - console.log('status = '+status) + axios + .get(url) + .then((response) => { + // the 'create-query' call will return an archive specific query for each of the + // defined 'esap datasets' within that 'esap archive' - axios - .get(url) - .then((response) => { - // the 'create-query' call will return an archive specific query for each of the - // defined 'esap datasets' within that 'esap archive' + let dataset_queries = response.data.query_input + dataset_queries.forEach((dataset_query) => { - let dataset_queries = response.data.query_input - dataset_queries.forEach((dataset_query) => { + dataset_query['archive'] = query.archive + archive_queries.push(dataset_query) - dataset_query['archive'] = query.archive - archive_queries.push(dataset_query) + }) + setStatus(FETCHING_CREATE_QUERY) + setStatus(FETCHED_CREATE_QUERY) + // WARNING: status does not get updated here, why? + //alert('fetched query: status = '+status) - }) + // q: how do I trigger a render after this - setStatus(FETCHED_CREATE_QUERY) - // WARNING: status does not get updated here, why? - //alert('fetched query: status = '+status) + }) + .catch((error) => { + alert(error) - // q: how do I trigger a render after this + }); + }); - }) - .catch((error) => { - alert(error) + // push all the gathered archive_queries to the central store + // WARNING: this happens before the '.then' promise is solved. + setArchiveQueries(archive_queries) + } - }); - }); + // call to the ESAP API 'query' endpoint + function fetchRunQueries() { + let query_results = [] - // push all the gathered archive_queries to the central store - alert('fetched all create-queries: status = '+status) - // WARNING: this happens before the '.then' promise is solved. - setArchiveQueries(archive_queries) - } + selectedQueries.forEach((query) => { - let query_results = [] - if (status === RUN_SELECTED_QUERIES) { + let dataset_query = query.result.query - selectedQueries.forEach((query) => { + // cut off the service_url and only leave the query part + if (dataset_query.includes('&QUERY=')) { + dataset_query = query.result.query.split('&QUERY=')[1] + } - let dataset_query = query.result.query + let url = api_host + "query/query?archive_uri=" + query.result.archive + "&collection=" + query.result.collection - // cut off the service_url and only leave the query part - if (dataset_query.includes('&QUERY=')) { - dataset_query = query.result.query.split('&QUERY=')[1] - } + setStatus(FETCHING_SELECTED_QUERIES) + console.log('status = '+status) - let url = api_host + "query/query?archive_uri=" + query.result.archive + "&collection=" + query.result.collection + axios + .get(url) + .then((response) => { - setStatus(FETCHING_SELECTED_QUERIES) - console.log('status = '+status) + let results = response.data.results - axios - .get(url) - .then((response) => { + results.forEach((result) => { + query_results.push(result) - let results = response.data.results + }) - results.forEach((result) => { - query_results.push(result) + setStatus(FETCHED_SELECTED_QUERIES) + // WARNING: status does not get updated here, why? + //alert('fetched selected query: status = '+status) - }) + // q: how do I trigger a render after this - setStatus(FETCHED_SELECTED_QUERIES) - // WARNING: status does not get updated here, why? - //alert('fetched selected query: status = '+status) + }) + .catch((error) => { + alert(error) - // q: how do I trigger a render after this + }); + }) - }) - .catch((error) => { - alert(error) + // push all the gathered archive_queries to the central store + // WARNING: this happens before the '.then' promise is solved. + setQueryResults(query_results) - }); - }) + console.log('status = '+status) + } - // push all the gathered archive_queries to the central store - alert('ran and fetched all queries: status = '+status) - // WARNING: this happens before the '.then' promise is solved. - setQueryResults(query_results) + // set ConfigName for archive + // load the GUI for this configuration - console.log('status = '+status) + useEffect(() => { + setConfigName("multiple_archives"); + return () => { + console.log("cleaned up"); + //queryMap.clear(); + setFormData(); + setConfigName(defaultConf); + }; + }, []); + + + useEffect(() => { + + if (status === CREATE_QUERIES) { + fetchCreateQueries() + } + + if (status === RUN_SELECTED_QUERIES) { + fetchRunQueries() } //alert('archiveQueries: ',archiveQueries) }, [queryStep, formData]); + // this function is executed when the 'Create Queries' button is clicked function handleCreateQueries() { - setStatus(CREATE_QUERY_PARAMS) + setStatus(CREATE_QUERIES) console.log('handleCreateQueries: status = '+status) setQueryStep('create-query') } @@ -187,12 +198,31 @@ export default function QueryMultipleArchives() { </div> )} + // RENDER + if (!config) return <LoadingSpinner /> + const uiSchemaProp = config.ui_schema ? { uiSchema: config.ui_schema } : {}; + console.log("Form Data:", formData); + //alert('render: '+status) + + if (status === CREATE_QUERIES) { + //fetchCreateQueries() + } + + if (status === RUN_SELECTED_QUERIES) { + //fetchRunQueries() + } + + + let renderForm + if (status === QUERY_FORM) { + renderForm=<h1>Render Form</h1> + } // the logic to construct the GUI let renderCreateQueryButton - //if (status === CREATE_QUERY_PARAMS) { + //if (status === CREATE_QUERIES) { renderCreateQueryButton = <Button type="submit" onClick={() => {handleCreateQueries();}}>{getQueryIcon()} Create Queries</Button> //} @@ -202,11 +232,17 @@ export default function QueryMultipleArchives() { } let renderCreateQueryResults + if (status === FETCHING_CREATE_QUERY) { + renderCreateQueryResults = <LoadingSpinner />; + } if (status === FETCHED_CREATE_QUERY || status === QUERIES_SELECTED) { renderCreateQueryResults = <CreateMultiQueryResults results={archiveQueries} /> } let renderQueryResults + if (status === FETCHING_SELECTED_QUERIES) { + renderQueryResults = <LoadingSpinner />; + } if (status === FETCHED_SELECTED_QUERIES) { renderQueryResults = <RunMultiQueryResults results={queryResults} /> } @@ -214,6 +250,7 @@ export default function QueryMultipleArchives() { return ( <Container fluid> <h2>Status - {status}</h2> + {renderForm} <Form schema={config.query_schema} ObjectFieldTemplate={myObjectFieldTemplate} diff --git a/src/contexts/MAQContext.js b/src/contexts/MAQContext.js index 0f4b5df..609c55d 100644 --- a/src/contexts/MAQContext.js +++ b/src/contexts/MAQContext.js @@ -3,7 +3,8 @@ import React, { createContext, useState, useEffect, useContext } from "react"; // Multiple Archives Query (MAQ) context // statusses -export const CREATE_QUERY_PARAMS = 'create-query-params' +export const QUERY_FORM = 'query-form' +export const CREATE_QUERIES = 'create-queries' export const FETCHING_CREATE_QUERY = 'fetching-create-query' export const FETCHED_CREATE_QUERY = 'fetched-create-query' export const QUERIES_SELECTED = 'queries-selected' -- GitLab