Skip to content

Commit fc44c82

Browse files
committed
Firefly-1469: Update DCE to support rubin needs
- support sia wavelength - support dataServiceId - clean up
1 parent 0c31c2e commit fc44c82

10 files changed

+289
-187
lines changed

src/firefly/js/metaConvert/AnalysisUtils.js

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import {
1414
} from './DataProductsType.js';
1515
import {createGridImagesActivate} from './ImageDataProductsUtil.js';
1616
import {doUploadAndAnalysis} from './UploadAndAnalysis.js';
17-
import {getObsCoreDataProduct} from './vo/ObsCoreConverter';
1817

1918
const LOADING_MSG= 'Loading...';
2019

src/firefly/js/ui/dynamic/DLGenAnalyzeSearch.js

+9-9
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {CIRCLE, POINT, POLYGON} from './DynamicDef.js';
99
import {
1010
convertCircleToPointArea, convertPointAreaToCircle, isCircleSearch, isPointAreaSearch, isPolySearch
1111
} from './DynamicUISearchPanel.jsx';
12-
import {findFieldDefType, makeFieldDefs, makeServiceDescriptorSearchRequest} from './ServiceDefTools.js';
12+
import { findFieldDefType, makeServiceDescriptorSearchRequest, sdToFieldDefAry } from './ServiceDefTools.js';
1313

1414

1515

@@ -44,8 +44,8 @@ export function analyzeQueries(tbl_id) {
4444
}
4545

4646

47-
export function makeAllSearchRequest(request, primeSd, concurrentSDAry, primaryFdAry, extraPrimaryMeta) {
48-
const primeRequest= makeServiceDescriptorSearchRequest(request,primeSd,extraPrimaryMeta);
47+
export function makeAllSearchRequest(request, siaConstraints, primeSd, concurrentSDAry, primaryFdAry, extraPrimaryMeta) {
48+
const primeRequest= makeServiceDescriptorSearchRequest(request,siaConstraints, primeSd,extraPrimaryMeta);
4949
const concurrentRequestAry= concurrentSDAry
5050
.map( (sd) => {
5151
const newR= convertRequestToSecondary(request, primaryFdAry?.[0], sd.serviceDef, primeSd.standardID);
@@ -59,14 +59,14 @@ export function makeAllSearchRequest(request, primeSd, concurrentSDAry, primaryF
5959
/**
6060
* Do all the searches defined
6161
* @param request
62+
* @param siaConstraints
6263
* @param {QueryAnalysis} qAna
6364
* @param primaryFdAry
6465
* @param idx
6566
* @param {object} extraMeta // additional table meta to include with the TableSearch
6667
* @param {String} selectedConcurrent - space separated name of searches to execute
67-
* @param docRows URLs to documentation
6868
*/
69-
export function handleSearch(request, qAna, primaryFdAry, idx, extraMeta={}, selectedConcurrent) {
69+
export function handleSearch(request, siaConstraints, qAna, primaryFdAry, idx, extraMeta={}, selectedConcurrent) {
7070
const primeSd= qAna.primarySearchDef[idx].serviceDef;
7171
const {coverage,bandDesc}= qAna.primarySearchDef[idx];
7272
const {cisxUI}= qAna.primarySearchDef[0].serviceDef;
@@ -81,7 +81,7 @@ export function handleSearch(request, qAna, primaryFdAry, idx, extraMeta={}, sel
8181
extraMeta= {coverage,bandDesc, ...extraMeta};
8282
if (preferredHips) extraMeta[MetaConst.COVERAGE_HIPS]=preferredHips;
8383

84-
const tableRequestAry= makeAllSearchRequest(request, primeSd,concurrentSDAry, primaryFdAry, extraMeta);
84+
const tableRequestAry= makeAllSearchRequest(request, siaConstraints, primeSd,concurrentSDAry, primaryFdAry, extraMeta);
8585

8686
tableRequestAry.forEach( (dataTableReq) => {
8787
Logger('DLGeneratedDropDown').debug(dataTableReq);
@@ -92,7 +92,7 @@ export function handleSearch(request, qAna, primaryFdAry, idx, extraMeta={}, sel
9292
}
9393

9494
function convertRequestToSecondary(request, primaryFdAry, secondServDef, primStandardID) {
95-
const sFdAry= makeFieldDefs(secondServDef.serDefParams);
95+
const sFdAry= sdToFieldDefAry({serviceDef:secondServDef});
9696
if (isCircleSearch(primaryFdAry) || isPointAreaSearch(sFdAry)) {
9797
return convertCircleToPointArea(request, primaryFdAry, sFdAry, primStandardID, secondServDef.standardID);
9898
}
@@ -103,7 +103,7 @@ function convertRequestToSecondary(request, primaryFdAry, secondServDef, primSta
103103
}
104104

105105
function getServiceDefSpacialSupports(serviceDef) {
106-
const fdAry= makeFieldDefs(serviceDef.serDefParams);
106+
const fdAry= sdToFieldDefAry({serviceDef});
107107
const retAry=[];
108108
if (isCircleSearch(fdAry)) retAry.push(CIRCLE);
109109
if (isPointAreaSearch(fdAry)) retAry.push(POINT);
@@ -116,7 +116,7 @@ export function hasSpatialTypes(serviceDef) {
116116
}
117117

118118
export function isSpatialTypeSupported(serviceDef, spacialType) {
119-
const fdAry= makeFieldDefs(serviceDef.serDefParams);
119+
const fdAry= sdToFieldDefAry({serviceDef});
120120
if (spacialType===CONE_CHOICE_KEY) {
121121
return isCircleSearch(fdAry) || isPointAreaSearch(fdAry) || Boolean(findFieldDefType(fdAry,POINT));
122122
}

src/firefly/js/ui/dynamic/DLGeneratedDropDown.js

+58-30
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ import {analyzeQueries, handleSearch} from './DLGenAnalyzeSearch.js';
3232
import {SideBarAnimation, SideBarTable} from './DLuiDecoration.jsx';
3333
import {DLuiServDescPanel, DLuiTabView} from './DLuiServDescPanel.jsx';
3434
import {CIRCLE, POINT, POSITION, RANGE} from './DynamicDef.js';
35-
import {convertRequest, findTargetFromRequest} from './DynamicUISearchPanel.jsx';
35+
import {convertRequest, DEFER_TO_CONTEXT, findTargetFromRequest} from './DynamicUISearchPanel.jsx';
3636
import {getSpacialSearchType, hasValidSpacialSearch} from './DynComponents.jsx';
3737
import {confirmDLMenuItem} from './FetchDatalinkTable.js';
38-
import { getStandardIdType, ingestInitArgs, makeFieldDefsWithOptions, makeSearchAreaInfo } from './ServiceDefTools.js';
38+
import { getStandardIdType, ingestInitArgs, sdToFieldDefAry, makeSearchAreaInfo } from './ServiceDefTools.js';
3939

4040

4141
export const DL_UI_LIST= 'DL_UI_LIST';
@@ -280,7 +280,7 @@ const executeInitTargetOnce= makeSearchOnce(false);
280280

281281

282282
function DLGeneratedTableSearch({currentTblId, qAna, groupKey, initArgs, sideBar, regHasUrl, url,
283-
sideBarShowing, slotProps, regLoaded, dataServiceId,
283+
sideBarShowing, slotProps, regLoaded, dataServiceId:inDataServiceId,
284284
setSideBarShowing, defaultMaxMOCFetchDepth}) {
285285
const [,setCallId]= useState('none');
286286
const [{onClick},setClickFuncImpl]= useState({});
@@ -291,6 +291,7 @@ function DLGeneratedTableSearch({currentTblId, qAna, groupKey, initArgs, sideBar
291291
if (obj?.onClick && !onClick) setClickFuncImpl(obj);
292292
};
293293

294+
const dataServiceId= getCisxUIValue(qAna, 'data_service_id') ?? inDataServiceId;
294295

295296
useEffect(() => {
296297
if (initArgs?.urlApi?.execute && onClick && matchUrl) {
@@ -328,7 +329,11 @@ function DLGeneratedTableSearch({currentTblId, qAna, groupKey, initArgs, sideBar
328329

329330
const isAllSky= toBoolean(getCisxUI(qAna)?.find( (e) => e.name==='data_covers_allsky')?.value);
330331
const docRows= qAna?.urlRows.filter( ({semantic}) => semantic?.toLowerCase().endsWith('documentation'));
331-
const submitSearch= (request) => doSubmitSearch(request,dataServiceId, docRows,qAna,fdAry,searchObjFds,tabsKey);
332+
333+
const submitSearch= (request,siaCtx) =>
334+
doSubmitSearch(request,siaCtx,dataServiceId, docRows,qAna,fdAry,searchObjFds,tabsKey);
335+
336+
332337

333338
return (
334339
<Sheet sx={{width:1,height:1}}>
@@ -338,10 +343,10 @@ function DLGeneratedTableSearch({currentTblId, qAna, groupKey, initArgs, sideBar
338343
<FieldGroup groupKey={groupKey} keepState={true} style={{width:'100%'}}>
339344
{(regLoaded && qAna) ? searchObjFds.length===1 ?
340345
<DLuiServDescPanel{...{initArgs, setSideBarShowing, sideBarShowing, fds:searchObjFds[0].fds,
341-
setClickFunc, submitSearch, isAllSky, qAna, slotProps,
346+
setClickFunc, submitSearch, isAllSky, qAna, slotProps,dataServiceId,
342347
sx:{width:1,height:1}, desc:searchObjFds[0].desc, docRows}} /> :
343348
<DLuiTabView{...{initArgs, tabsKey, setSideBarShowing, sideBarShowing, searchObjFds, qAna,
344-
docRows, isAllSky, setClickFunc, submitSearch, slotProps}}/>
349+
docRows, isAllSky, setClickFunc, submitSearch, slotProps, dataServiceId}}/>
345350
:
346351
<NotLoaded {...{regHasUrl,regLoaded,url}}/>
347352
}
@@ -370,11 +375,11 @@ function alignHiPS(currentTblId, qAna, groupKey, fieldDefAry) {
370375
const tgt= findTargetFromRequest(request,fieldDefAry);
371376
if (tgt) return;
372377

373-
const cisxUI= getCisxUI(qAna);
374-
const raStr= cisxUI.find( (e) => e.name==='hips_initial_ra')?.value;
375-
const decStr= cisxUI.find( (e) => e.name==='hips_initial_dec')?.value;
376-
const ucdStr= cisxUI.find( (e) => e.name==='hips_initial_ra')?.UCD;
377-
const fovStr= cisxUI.find( (e) => e.name==='hips_initial_fov')?.value;
378+
const raStr= getCisxUIValue(qAna, 'hips_initial_ra');
379+
const decStr= getCisxUIValue(qAna, 'hips_initial_dec');
380+
const ucdStr= getCisxUIUCD('hips_initial_ra');
381+
const fovStr=getCisxUIValue(qAna, 'hips_initial_fov');
382+
378383
const coordSys= ucdStr==='pos.galactic.lon' ? CoordSys.GALACTIC : CoordSys.EQ_J2000;
379384
const centerProjPt= makeWorldPt(raStr, decStr, coordSys);
380385
if (!centerProjPt) return;
@@ -403,6 +408,17 @@ function getCisxUI(qAnaOrSd) {
403408
}
404409
return [];
405410
}
411+
412+
function getCisxUIValue(qAnaOrSd, name) {
413+
return getCisxUI(qAnaOrSd).find( (e) => e.name===name)?.value;
414+
}
415+
416+
function getCisxUIUCD(qAnaOrSd, name) {
417+
return getCisxUI(qAnaOrSd).find( (e) => e.name===name)?.UCD;
418+
}
419+
420+
421+
406422
/**
407423
* map the primarySearchDef (a SearchDefinition) array in QueryAnalysis to an array of FieldDef arrays.
408424
* Usually there is only one primarySearchDef
@@ -416,21 +432,21 @@ function makePrimarySearchFieldDefAry(qAna, initArgs, defaultMaxMOCFetchDepth) {
416432
return qAna?.primarySearchDef.map( (fd) => {
417433
const {serviceDef}= fd; //todo handle case with only an access url
418434
if (!serviceDef) return;
419-
const standId= getStandardId(serviceDef);
420-
const utype= getUtype(serviceDef);
421-
let fdEntryAry;
422-
if (utype===cisxAdhocServiceUtype && standId.startsWith(standardIDs.tap) && serviceDef.cisxTokenSub) {
423-
fdEntryAry= makeFieldDefsWithOptions({
424-
serDefParams:serviceDef.cisxTokenSub,
425-
searchAreaInfo:makeSearchAreaInfo(getCisxUI(serviceDef), defaultMaxMOCFetchDepth),
426-
hidePredefinedStringFields:false});
427-
}
428-
else {
429-
fdEntryAry= makeFieldDefsWithOptions({
430-
serDefParams:serviceDef.serDefParams,
431-
searchAreaInfo:makeSearchAreaInfo(getCisxUI(serviceDef), defaultMaxMOCFetchDepth)
435+
// const standId= getStandardId(serviceDef);
436+
// const utype= getUtype(serviceDef);
437+
// let fdEntryAry;
438+
// TODO: figure out how to better do TAP support
439+
// if (utype===cisxAdhocServiceUtype && standId.startsWith(standardIDs.tap) && serviceDef.cisxTokenSub) {
440+
// fdEntryAry= sdParamsToFieldDefAry({
441+
// serDefParams:serviceDef.cisxTokenSub,
442+
// searchAreaInfo:makeSearchAreaInfo(getCisxUI(serviceDef), defaultMaxMOCFetchDepth),
443+
// hidePredefinedStringFields:false});
444+
// }
445+
// else {
446+
const fdEntryAry= sdToFieldDefAry({
447+
serviceDef, searchAreaInfo:makeSearchAreaInfo(getCisxUI(serviceDef), defaultMaxMOCFetchDepth)
432448
});
433-
}
449+
// }
434450
if (!isEmpty(initArgs.urlApi)) {
435451
const originalWp= fdEntryAry.find((fd) => fd.type===POSITION)?.initValue ?? fdEntryAry.find((fd) => fd.type===CIRCLE)?.targetDetails?.centerPt;
436452
const initFdEntryAry= ingestInitArgs(fdEntryAry,initArgs.urlApi);
@@ -463,7 +479,7 @@ const NotLoaded= ({regHasUrl,regLoaded, url}) => (
463479
);
464480

465481

466-
const doSubmitSearch= (r,dataServiceId, docRows,qAna,fdAry,searchObjFds,tabsKey) => {
482+
function doSubmitSearch(r,siaCtx,dataServiceId, docRows,qAna,fdAry,searchObjFds,tabsKey) {
467483
const {fds, standardID, idx}=
468484
searchObjFds.length===1 ? searchObjFds[0] : searchObjFds.find(({ID}) => ID===r[tabsKey]) ?? {};
469485

@@ -475,17 +491,29 @@ const doSubmitSearch= (r,dataServiceId, docRows,qAna,fdAry,searchObjFds,tabsKey)
475491
return false;
476492
}
477493

478-
const convertedR= convertRequest(r,fds,getStandardIdType(standardID));
494+
const outReq= convertRequest(r,fds,getStandardIdType(standardID));
495+
const requestKeyCnt= Object.keys(outReq).length;
496+
const convertedR= Object.fromEntries(Object.entries(outReq).filter(([k,v]) => v!==DEFER_TO_CONTEXT));
479497
const selectedConcurrent= r.searchOptions ?? '';
480498

499+
500+
let siaContraints= [];
501+
if (siaCtx) {
502+
const cAry= [...siaCtx.values()];
503+
siaContraints= cAry.map( (f) => f.siaConstraints).filter( (c) => c?.length).flat();
504+
}
505+
481506
const numKeys= [...new Set(fds.map( ({key}) => key))].length;
482-
if (Object.keys(convertedR).length<numKeys) {
507+
if (requestKeyCnt<numKeys) {
483508
showInfoPopup('Please enter all of the fields', 'Error');
484509
return false;
485510
}
511+
512+
513+
486514
const extraMeta = docRows?.[0] ? {[META.doclink.url]: docRows[0].accessUrl, [META.doclink.desc]: docRows[0].desc} : {};
487515
extraMeta[MetaConst.DATA_SERVICE_ID]= dataServiceId;
488-
handleSearch(convertedR,qAna,fdAry, idx, extraMeta, selectedConcurrent);
516+
handleSearch(convertedR,siaContraints, qAna,fdAry, idx, extraMeta, selectedConcurrent);
489517
return true;
490-
};
518+
}
491519

src/firefly/js/ui/dynamic/DLuiServDescPanel.jsx

+48-32
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import {Box, Link, Stack, Typography} from '@mui/joy';
22
import {array, arrayOf, bool, func, node, object, oneOfType, string} from 'prop-types';
3-
import React from 'react';
3+
import React, {useContext} from 'react';
44
import {CONE_CHOICE_KEY} from '../../visualize/ui/CommonUIKeys.js';
55
import {CheckboxGroupInputField} from '../CheckboxGroupInputField.jsx';
6+
import {FieldGroupCtx} from '../FieldGroup';
67
import {FieldGroupTabs, Tab} from '../panel/TabPanel';
78
import {showInfoPopup} from '../PopupUtil.jsx';
89
import {useFieldGroupValue} from '../SimpleComponent.jsx';
910
import {hasSpatialTypes, isSpatialTypeSupported} from './DLGenAnalyzeSearch.js';
1011
import {DLSearchTitle} from './DLuiDecoration';
1112
import {CONE_AREA_KEY} from './DynamicDef.js';
1213
import {DynLayoutPanelTypes} from './DynamicUISearchPanel';
14+
import {ConstraintContext} from '../tap/Constraints';
1315

1416

1517
const HIPS_PLOT_ID= 'dlGeneratedHipsPlotId';
@@ -29,7 +31,8 @@ const DocRows= ({docRows=[], showLabel=true}) => (
2931

3032

3133
export function DLuiServDescPanel({fds, sx, desc, setSideBarShowing, sideBarShowing, docRows, setClickFunc,
32-
submitSearch, isAllSky, qAna={},slotProps}) {
34+
submitSearch, isAllSky, qAna={},dataServiceId, slotProps}) {
35+
const {getVal,setVal} = useContext(FieldGroupCtx);
3336
const {concurrentSearchDef}= qAna;
3437

3538
const coneAreaChoice = useFieldGroupValue(CONE_AREA_KEY)?.[0]() ?? CONE_CHOICE_KEY;
@@ -45,6 +48,14 @@ export function DLuiServDescPanel({fds, sx, desc, setSideBarShowing, sideBarShow
4548

4649
const disDesc = coneAreaChoice === CONE_AREA_KEY ? 'w/ cone' : 'w/ polygon';
4750

51+
const constraintCtx= {
52+
setConstraintFragment: (key,value) => {
53+
const fragments= getVal('SIA_CTX') ?? new Map();
54+
value ? fragments.set(key,value) : fragments.delete(key);
55+
setVal('SIA_CTX',fragments);
56+
}
57+
};
58+
4859
const options = (cNames || disableNames) ? (
4960
<Stack {...{alignItems: 'flex-start',}}>
5061
{Boolean(cNames?.length) &&
@@ -70,25 +81,28 @@ export function DLuiServDescPanel({fds, sx, desc, setSideBarShowing, sideBarShow
7081
return (
7182
<Stack {...{justifyContent:'space-between', sx}}>
7283
<DLSearchTitle {...{desc,isAllSky,sideBarShowing,setSideBarShowing,...slotProps.searchTitle}}/>
73-
<DynLayoutPanelTypes.Inset {...{fieldDefAry:fds, plotId:HIPS_PLOT_ID, style:{height:'100%', marginTop:4},
74-
toolbarHelpId:'dlGenerated.VisualSelection',
75-
slotProps:{
76-
FormPanel: {
77-
onSuccess:submitSearch,
78-
onError: () => showInfoPopup('Fix errors and search again', 'Error'),
79-
help_id:'search-collections-general',
80-
slotProps:{
81-
input: {border:0, p:0, mb:1},
82-
searchBar: {actions: <DocRows key='root' docRows={docRows}/>},
83-
completeBtn: {
84-
getDoOnClickFunc:(f) => setClickFunc({onClick: f})
84+
<ConstraintContext.Provider value={constraintCtx}>
85+
<DynLayoutPanelTypes.Inset {...{fieldDefAry:fds, plotId:HIPS_PLOT_ID, style:{height:'100%', marginTop:4},
86+
dataServiceId,
87+
toolbarHelpId:'dlGenerated.VisualSelection',
88+
slotProps:{
89+
FormPanel: {
90+
onSuccess: (r) => submitSearch(r,getVal('SIA_CTX') ?? new Map()),
91+
onError: () => showInfoPopup('Fix errors and search again', 'Error'),
92+
help_id:'search-collections-general',
93+
slotProps:{
94+
input: {border:0, p:0, mb:1},
95+
searchBar: {actions: <DocRows key='root' docRows={docRows}/>},
96+
completeBtn: {
97+
getDoOnClickFunc:(f) => setClickFunc({onClick: f})
98+
}
8599
}
86-
}
87-
}} }}>
88-
<Stack {...{alignItems: 'flex-start',}}>
89-
{options}
90-
</Stack>
91-
</DynLayoutPanelTypes.Inset>
100+
}} }}>
101+
<Stack {...{alignItems: 'flex-start',}}>
102+
{options}
103+
</Stack>
104+
</DynLayoutPanelTypes.Inset>
105+
</ConstraintContext.Provider>
92106
</Stack>
93107
);
94108
}
@@ -105,23 +119,25 @@ DLuiServDescPanel.propTypes= {
105119
fds: array,
106120
sx: object,
107121
desc: string,
122+
dataServiceId: string,
108123
setSideBarShowing: func,
109124
sideBarShowing: bool,
110125
};
111126

112127

113128
export const DLuiTabView = ({
114-
tabsKey,
115-
setSideBarShowing,
116-
sideBarShowing,
117-
searchObjFds,
118-
qAna,
119-
docRows,
120-
isAllSky,
121-
setClickFunc,
122-
submitSearch,
123-
slotProps
124-
}) => (
129+
tabsKey,
130+
setSideBarShowing,
131+
sideBarShowing,
132+
searchObjFds,
133+
qAna,
134+
docRows,
135+
isAllSky,
136+
setClickFunc,
137+
submitSearch,
138+
slotProps,
139+
dataServiceId
140+
}) => (
125141
<FieldGroupTabs style={{height: '100%', width: '100%'}} initialState={{value: searchObjFds[0]?.ID}}
126142
fieldKey={tabsKey}>
127143
{
@@ -131,7 +147,7 @@ export const DLuiTabView = ({
131147
<Tab name={`${qAna.primarySearchDef[idx].desc}`} id={ID} key={idx + ''}>
132148
<DLuiServDescPanel{...{
133149
fds, setSideBarShowing, sideBarShowing, sx: {width: 1}, desc, docRows,
134-
isAllSky, setClickFunc, submitSearch, qAna, slotProps
150+
isAllSky, setClickFunc, submitSearch, qAna, slotProps, dataServiceId,
135151
}}/>
136152
</Tab>
137153
);

0 commit comments

Comments
 (0)