Skip to content

Commit 2982d59

Browse files
authored
Firefly-1978: Merge PR #1935 from FIREFLY-1978-viz-upload
Firefly-1978: fixed VizieR upload
2 parents 9e75674 + d23d816 commit 2982d59

21 files changed

Lines changed: 171 additions & 134 deletions

src/firefly/js/metaConvert/vo/ServDescConverter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,5 +112,5 @@ export async function getServiceDescRelatedDataProduct(table, row, threeColorOps
112112

113113

114114
export const findDataLinkServeDescs= (sdAry=[]) =>
115-
sdAry?.filter( (serDef) => isDataLinkServiceDesc(serDef) ?? []);
115+
sdAry?.filter( (serDef) => Boolean(isDataLinkServiceDesc(serDef)));
116116

src/firefly/js/ui/tap/AdvancedADQL.jsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,8 @@ export function AdvancedADQL({adqlKey, defAdqlKey, serviceUrl, capabilities, sty
197197
let insertTname= tname;
198198
if (upload) {
199199
insertTname= TAP_UPLOAD_SCHEMA+'.'+tname;
200-
const asTable= Object.values(uploadSchema).find( (o) => o.table===tname)?.asTable;
201-
if (asTable) insertTname+= ' AS '+asTable;
200+
const uploadTableAlias= Object.values(uploadSchema).find( (o) => o.table===tname)?.uploadTableAlias;
201+
if (uploadTableAlias) insertTname+= ' AS '+uploadTableAlias;
202202
}
203203
setVal(adqlKey, `SELECT TOP 1000 * FROM ${maybeQuote(insertTname,true)}`);
204204
window.setTimeout( () => prismLiveRef.current.syncStyles?.(), 10);
@@ -484,7 +484,7 @@ function expandColumns(serviceUrl, title, schema, uploadSchema, treeData, eventK
484484
const schemaEntry=uploadSchema[tableKey];
485485
if (!schemaEntry) return Promise.resolve();
486486
const cols= schemaEntry.columns
487-
.map( ({name}) => ( {key:makeColKey(key,schemaEntry.asTable?? schemaEntry.table,name),c: name, title:name, isLeaf:true}));
487+
.map( ({name}) => ( {key:makeColKey(key,schemaEntry.uploadTableAlias?? schemaEntry.table,name),c: name, title:name, isLeaf:true}));
488488
addChildNodes(treeData, eventKey, cols);
489489
setTreeData(cloneDeep(treeData));
490490
return Promise.resolve();

src/firefly/js/ui/tap/Constraints.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React from 'react';
2+
import {makeFullyQualifiedColumn} from './TapUtil';
23

34

45
export const ConstraintContext = React.createContext({});

src/firefly/js/ui/tap/ObjectIDSearch.jsx

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import {useFieldGroupRerender, useFieldGroupValue, useFieldGroupWatch} from 'fir
66
import {
77
DebugObsCore, getPanelPrefix, makeCollapsibleCheckHeader, makeFieldErrorList, makePanelStatusUpdater
88
} from 'firefly/ui/tap/TableSearchHelpers';
9-
import { ADQL_LINE_LENGTH, getAsEntryForTableName, makeUploadSchema, tapHelpId } from 'firefly/ui/tap/TapUtil';
9+
import {
10+
makeFullyQualifiedColumn, ADQL_LINE_LENGTH, getTableNameAlias, makeUploadSchema, tapHelpId
11+
} from 'firefly/ui/tap/TapUtil';
1012
import {bool,string,object} from 'prop-types';
1113
import {ColsShape, getColValidator} from 'firefly/charts/ui/ColumnOrExpression';
1214
import {CheckboxGroupInputField} from '../CheckboxGroupInputField.jsx';
@@ -53,7 +55,7 @@ export function ObjectIDSearch({cols, capabilities, tableName, columnsModel, use
5355
const entryType= useFieldGroupValue(ENTRY_TYPE)[0]();
5456
const objIdEntry= useFieldGroupValue(OBJ_ID_ENTRY)[0]();
5557
const [working,setWorking]= useState(false);
56-
const {setConstraintFragment}= useContext(ConstraintContext);
58+
const {setConstraintFragment, doingUpload:anotherComponentUpload}= useContext(ConstraintContext);
5759
const {canUpload=false}= capabilities ?? {};
5860
const [openMsg, setOpenMsg]= useState(TAB_COLUMNS_MSG);
5961
const {setVal,getVal,makeFldObj}= useContext(FieldGroupCtx);
@@ -114,7 +116,7 @@ export function ObjectIDSearch({cols, capabilities, tableName, columnsModel, use
114116

115117
useEffect(() => {
116118
const constraints= makeObjectIDConstraints(makeFldObj(fldListAry), uploadInfo, tableName, canUpload,
117-
getSelectInObjList(), getUseSelectIn()==='use', useSIAv2);
119+
getSelectInObjList(), getUseSelectIn()==='use', anotherComponentUpload,useSIAv2);
118120
updatePanelStatus(constraints, constraintResult, setConstraintResult,useSIAv2);
119121
});
120122

@@ -134,12 +136,12 @@ export function ObjectIDSearch({cols, capabilities, tableName, columnsModel, use
134136
{!canUpload && !useSIAv2 && <Typography level='body-xs'>This search uses "Select IN" style SQL as this service does not support uploads.</Typography>}
135137
<RadioGroupInputField {...{
136138
fieldKey:ENTRY_TYPE, options:objIdEntryType, initialState:{value: 'enter'},
137-
orientation:'horizontal', tooltip:`Enter object ID's as list or load from a table`,
139+
orientation:'horizontal', tooltip:`Enter object ID's as list or load from a table`, // eslint-disable-line @stylistic/js/quotes
138140
}} />
139141

140142
{entryType===ENTER ?
141143
<InputAreaFieldConnected {...{ fieldKey:OBJ_ID_ENTRY, placeholderHighlight: true,
142-
placeholder:`Enter one or more object id's separated by commas, semi-colon or space`,
144+
placeholder:`Enter one or more object id's separated by commas, semi-colon or space`, // eslint-disable-line @stylistic/js/quotes
143145
}}/> :
144146
<UploadTableSelectorObjectID {...{uploadInfo,setUploadInfo, setSelectInObjList, getUseSelectIn, setWorking}}/>
145147
}
@@ -238,7 +240,7 @@ function loadTableColumn(singleCol,serverFile,setSelectInObjList,setWorking) {
238240
loadedColumns.set(serverFile + '---' + singleCol, list);
239241
setSelectInObjList(list);
240242
setWorking(false);
241-
} catch (e) {
243+
} catch (e) { // eslint-disable-line no-unused-vars
242244
setWorking(false);
243245
setSelectInObjList(undefined);
244246
}
@@ -251,7 +253,8 @@ function loadTableColumn(singleCol,serverFile,setSelectInObjList,setWorking) {
251253
}
252254

253255

254-
function makeObjectIDConstraints(fldObj, uploadInfo, tableName, canUpload, selectInObjList, useSelectIn, useSIAv2) {
256+
function makeObjectIDConstraints(fldObj, uploadInfo, tableName, canUpload, selectInObjList,
257+
useSelectIn, anotherComponentUpload, useSIAv2) {
255258
const {fileName,serverFile, columns:uploadColumns, totalRows, fileSize}= uploadInfo ?? {};
256259
const { [UploadSingleColumn]:uploadObjectIDCol, [ObjectIDColumn]:objectIDCol, [ENTRY_TYPE]:entryType }= fldObj;
257260
const errList= makeFieldErrorList();
@@ -270,22 +273,25 @@ function makeObjectIDConstraints(fldObj, uploadInfo, tableName, canUpload, selec
270273
}
271274
else if (!useSIAv2) {
272275
if (!objectID) errList.addError('Selected Table (on the right) Object ID is not set');
273-
else if (!selectInObjList?.length) errList.addError(`Object id's are not set`);
276+
else if (!selectInObjList?.length) errList.addError(`Object id's are not set`); // eslint-disable-line @stylistic/js/quotes
274277
}
275278

276279
if (useSelectIn || type===ENTER) {
280+
281+
const preFix= anotherComponentUpload ? getTableNameAlias(tableName) : '';
282+
const objectIdCol= makeFullyQualifiedColumn(preFix,objectID);
277283
if (selectInObjList?.length) {
278284
const str= makeColsLines(selectInObjList);
279-
adqlConstraint = `${objectID} IN (${str})`;
285+
adqlConstraint = `${objectIdCol} IN (${str})`;
280286
siaConstraints= selectInObjList.map( (id) => `ID=${encodeURIComponent(id)}`);
281287
}
282288
else {
283289
errList.addError(`Enter at least one ${useSIAv2?'observation ID':'object ID'}`);
284290
}
285291
}
286292
else if (!useSIAv2) {
287-
const preFix= (serverFile && canUpload) ? `${getAsEntryForTableName(tableName)}` : '';
288-
adqlConstraint = `(ut.${uploadedObjectID} = ${preFix}.${objectID})`;
293+
const preFix= (serverFile && canUpload) ? getTableNameAlias(tableName) : '';
294+
adqlConstraint = `(ut.${uploadedObjectID} = ${makeFullyQualifiedColumn(preFix,objectID)})`;
289295
}
290296

291297
const errAry= errList.getErrors();

src/firefly/js/ui/tap/ObsCore.jsx

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
makeFieldErrorList, getPanelPrefix, LableSaptail, makePanelStatusUpdater,
88
Width_Column, DebugObsCore, makeCollapsibleCheckHeader, SpatialWidth
99
} from 'firefly/ui/tap/TableSearchHelpers';
10-
import {tapHelpId} from 'firefly/ui/tap/TapUtil';
10+
import {getTableNameAlias, makeFullyQualifiedColumn, tapHelpId} from 'firefly/ui/tap/TapUtil';
1111
import {ValidationField} from 'firefly/ui/ValidationField';
1212
import PropTypes, {bool, string, object, shape, arrayOf} from 'prop-types';
1313
import {FieldGroupCtx, ForceFieldGroupValid} from '../FieldGroup.jsx';
@@ -22,15 +22,16 @@ const panelValue = 'ObsCore';
2222
const panelPrefix = getPanelPrefix(panelValue);
2323

2424

25-
const multiConstraint = (value, columnName, siaName, quote, checkForNull) => {
25+
const multiConstraint = (value, preFix, columnName, siaName, quote, checkForNull) => {
2626
const multiConstraint = [];
2727
const siaConstraints = [];
2828
const valueList = value.split(',');
29+
const col= makeFullyQualifiedColumn(preFix,columnName);
2930
valueList.forEach((value) => {
3031
if (checkForNull && value === 'null'){
31-
multiConstraint.push(`${columnName} IS NULL`);
32+
multiConstraint.push(`${col} IS NULL`);
3233
} else {
33-
multiConstraint.push(`${columnName} = ${quote}${value}${quote}`);
34+
multiConstraint.push(`${col} = ${quote}${value}${quote}`);
3435
}
3536
siaConstraints.push(`${siaName}=${value}`);
3637
});
@@ -44,9 +45,11 @@ const multiConstraint = (value, columnName, siaName, quote, checkForNull) => {
4445
*
4546
* @param hasSubType
4647
* @param fldObj
48+
* @param {boolean} doingUpload
49+
* @param {string} tableName
4750
* @returns {InputConstraints}
4851
*/
49-
const makeConstraints = function(hasSubType, fldObj) {
52+
const makeConstraints = function(hasSubType, fldObj, doingUpload, tableName) {
5053
const errList= makeFieldErrorList();
5154
const adqlConstraintsAry = [];
5255
const siaConstraints = [];
@@ -58,16 +61,17 @@ const makeConstraints = function(hasSubType, fldObj) {
5861
obsCoreSubType, obsCoreInstrumentName, siaFacility}=fldObj;
5962

6063
// const {obsCoreCollection, obsCoreCalibrationLevel, obsCoreTypeSelection, obsCoreSubType, obsCoreInstrumentName} = fields;
64+
const preFix= doingUpload ? getTableNameAlias(tableName) : '';
6165
errList.checkForError(obsCoreCollection);
6266
if (obsCoreCollection?.value?.length > 0) {
63-
const mcResult = multiConstraint(obsCoreCollection.value, 'obs_collection', 'COLLECTION', '\'');
67+
const mcResult = multiConstraint(obsCoreCollection.value, preFix, 'obs_collection', 'COLLECTION', '\'');
6468
adqlConstraintsAry.push(mcResult.adqlConstraint);
6569
siaConstraints.push(...mcResult.siaConstraints);
6670
}
6771

6872
errList.checkForError(obsCoreCalibrationLevel);
6973
if (obsCoreCalibrationLevel?.value) {
70-
const mcResult = multiConstraint(obsCoreCalibrationLevel.value, 'calib_level', 'CALIB', '');
74+
const mcResult = multiConstraint(obsCoreCalibrationLevel.value, preFix, 'calib_level', 'CALIB', '');
7175
adqlConstraintsAry.push(mcResult.adqlConstraint);
7276
siaConstraints.push(...mcResult.siaConstraints);
7377
}
@@ -76,15 +80,15 @@ const makeConstraints = function(hasSubType, fldObj) {
7680
if (siaFacility) {
7781
errList.checkForError(siaFacility);
7882
if (siaFacility?.value) {
79-
const mcResult = multiConstraint(siaFacility.value, 'facility', 'FACILITY', '');
83+
const mcResult = multiConstraint(siaFacility.value, preFix, 'facility', 'FACILITY', '');
8084
adqlConstraintsAry.push(mcResult.adqlConstraint);
8185
siaConstraints.push(...mcResult.siaConstraints);
8286
}
8387
}
8488

8589
errList.checkForError(obsCoreTypeSelection);
8690
if (obsCoreTypeSelection?.value) {
87-
const mcResult = multiConstraint(obsCoreTypeSelection.value, 'dataproduct_type', 'DPTYPE', '\'', true);
91+
const mcResult = multiConstraint(obsCoreTypeSelection.value, preFix, 'dataproduct_type', 'DPTYPE', '\'', true);
8892
adqlConstraintsAry.push(mcResult.adqlConstraint);
8993

9094
const siaErrorFields = ['visibility', 'event', 'null'];
@@ -95,7 +99,7 @@ const makeConstraints = function(hasSubType, fldObj) {
9599

96100
errList.checkForError(obsCoreInstrumentName);
97101
if (obsCoreInstrumentName?.value?.length) {
98-
const mcResult = multiConstraint(obsCoreInstrumentName.value, 'instrument_name', 'INSTRUMENT', '\'', true);
102+
const mcResult = multiConstraint(obsCoreInstrumentName.value, preFix, 'instrument_name', 'INSTRUMENT', '\'', true);
99103
adqlConstraintsAry.push(mcResult.adqlConstraint);
100104
siaHasErrors(obsCoreInstrumentName.value, ['null'])
101105
? siaConstraintErrors.push('null is not a valid SIA INSTRUMENT option')
@@ -105,7 +109,7 @@ const makeConstraints = function(hasSubType, fldObj) {
105109
if (hasSubType){
106110
errList.checkForError(obsCoreSubType);
107111
if (obsCoreSubType?.value?.length > 0) {
108-
const mcResult = multiConstraint(obsCoreSubType.value, 'dataproduct_subtype', 'DPSUBTYPE', '\'');
112+
const mcResult = multiConstraint(obsCoreSubType.value, preFix, 'dataproduct_subtype', 'DPSUBTYPE', '\'');
109113
adqlConstraintsAry.push(mcResult.adqlConstraint);
110114
siaConstraints.push(...mcResult.siaConstraints);
111115
}
@@ -162,11 +166,11 @@ const fldListAry= ['obsCoreCalibrationLevel', 'obsCoreTypeSelection', 'obsCoreSu
162166

163167
export function ObsCoreSearch({sx, cols, obsCoreMetadataModel, serviceId,
164168
useCalibrationLevel=true, useProductType=true, useFacility=true,
165-
useSubtype= true,
169+
useSubtype= true, tableName,
166170
useInstrumentName=true, useCollection=true,
167171
initArgs={}, useSIAv2, slotProps={}}) {
168172
const {urlApi={}}= initArgs;
169-
const {setConstraintFragment}= useContext(ConstraintContext);
173+
const {setConstraintFragment, doingUpload=false}= useContext(ConstraintContext);
170174
const {makeFldObj}= useContext(FieldGroupCtx);
171175
const obsCoreCollectionOptions = getDataServiceOption('obsCoreCollection',serviceId,{});
172176
const obsCoreCalibrationLevelOptions = getDataServiceOption('obsCoreCalibrationLevel',serviceId,{});
@@ -204,7 +208,7 @@ export function ObsCoreSearch({sx, cols, obsCoreMetadataModel, serviceId,
204208

205209

206210
useEffect(() => {
207-
updatePanelStatus(makeConstraints(hasSubType,makeFldObj(fldListAry)), constraintResult, setConstraintResult,useSIAv2);
211+
updatePanelStatus(makeConstraints(hasSubType,makeFldObj(fldListAry), doingUpload, tableName), constraintResult, setConstraintResult,useSIAv2);
208212
});
209213

210214
useEffect(() => {

src/firefly/js/ui/tap/ObsCoreExposureDuration.jsx

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {Divider, FormControl, FormLabel, Stack, Typography} from '@mui/joy';
2-
import PropTypes from 'prop-types';
2+
import {bool, shape, string, object} from 'prop-types';
33
import React, {useContext, useEffect, useState} from 'react';
44
import Validate, {maximumPositiveFloatValidator, minimumPositiveFloatValidator} from '../../util/Validate.js';
55
import {FieldGroupCtx, ForceFieldGroupValid} from '../FieldGroup.jsx';
@@ -14,7 +14,7 @@ import {
1414
makePanelStatusUpdater,
1515
SmallFloatNumericWidth
1616
} from './TableSearchHelpers.jsx';
17-
import {tapHelpId} from './TapUtil.js';
17+
import {getTableNameAlias, makeFullyQualifiedColumn, tapHelpId} from './TapUtil.js';
1818

1919
const START_EXP_GREATER_MSG= 'exposure time max must be greater than time min';
2020
const ONE_POPULATED= 'at least one field must be populated';
@@ -60,7 +60,7 @@ function checkExposureDuration(expLenMin, expLenMax) {
6060
* @param fldObj
6161
* @returns {InputConstraints}
6262
*/
63-
function makeExposureConstraints(rangeType, fldObj) {
63+
function makeExposureConstraints(rangeType, fldObj, doingUpload, tableName) {
6464
const errList= makeFieldErrorList();
6565
const siaConstraints= [];
6666
const adqlConstraintsAry = [];
@@ -72,14 +72,18 @@ function makeExposureConstraints(rangeType, fldObj) {
7272
const expLenMax = expLenMaxField?.value;
7373

7474
let seenValue = false;
75+
const preFix= doingUpload ? getTableNameAlias(tableName) : '';
76+
const tminCol= makeFullyQualifiedColumn(preFix,'t_min');
77+
const tmaxCol= makeFullyQualifiedColumn(preFix,'t_max');
78+
const tExpTimeCol= makeFullyQualifiedColumn(preFix,'t_exptime');
7579
if (rangeType === 'range') {
7680
if (exposureMin?.value || exposureMax?.value) {
7781
const {minValue, maxValue}= checkExposureTime(exposureMin,exposureMax);
7882
errList.checkForError(exposureMin);
7983
errList.checkForError(exposureMax);
8084
if (exposureMin?.valid && exposureMax?.valid) {
8185
const rangeList = [[minValue, maxValue]];
82-
adqlConstraintsAry.push(makeAdqlQueryRangeFragment('t_min', 't_max', rangeList, false));
86+
adqlConstraintsAry.push(makeAdqlQueryRangeFragment(tminCol, tmaxCol, rangeList, false));
8387
siaConstraints.push(...siaQueryRange('TIME', rangeList));
8488
}
8589
seenValue = true;
@@ -88,15 +92,15 @@ function makeExposureConstraints(rangeType, fldObj) {
8892
errList.checkForError(expSince);
8993
if (expSince?.valid) {
9094
const rangeList = [[`${checkSinceTimeInMjd(expSince?.value, exposureSinceOptions?.value)}`, '+Inf']];
91-
adqlConstraintsAry.push(makeAdqlQueryRangeFragment('t_min', 't_max', rangeList));
95+
adqlConstraintsAry.push(makeAdqlQueryRangeFragment(tminCol, tmaxCol, rangeList));
9296
siaConstraints.push(...siaQueryRange('TIME', rangeList));
9397
}
9498
seenValue = true;
9599
}
96100
if (expLenMin || expLenMax) {
97101
const {rangeList, minGreaterThanMax}= checkExposureDuration(expLenMin,expLenMax);
98102
if (!minGreaterThanMax) {
99-
adqlConstraintsAry.push(makeAdqlQueryRangeFragment('t_exptime', 't_exptime', rangeList, true));
103+
adqlConstraintsAry.push(makeAdqlQueryRangeFragment(tExpTimeCol, tExpTimeCol, rangeList, true));
100104
siaConstraints.push(...siaQueryRange('EXPTIME', rangeList));
101105
}
102106
seenValue = true;
@@ -117,9 +121,9 @@ const {CollapsibleCheckHeader, collapsibleCheckHeaderKeys}= checkHeaderCtl;
117121
const fldListAry= ['exposureSinceValue', 'exposureLengthMin', 'exposureLengthMax',
118122
'exposureMin', 'exposureMax', 'exposureSinceOptions', 'exposureRangeType'];
119123

120-
export function ExposureDurationSearch({initArgs, slotProps,useSIAv2, showLengthInput=true}) {
124+
export function ExposureDurationSearch({initArgs, slotProps,useSIAv2, showLengthInput=true, tableName}) {
121125
const {getVal,makeFldObj}= useContext(FieldGroupCtx);
122-
const {setConstraintFragment}= useContext(ConstraintContext);
126+
const {setConstraintFragment, doingUpload=false}= useContext(ConstraintContext);
123127
const [constraintResult, setConstraintResult] = useState({});
124128
useFieldGroupRerender([...fldListAry, ...collapsibleCheckHeaderKeys] ); // force rerender on any change
125129

@@ -129,7 +133,7 @@ export function ExposureDurationSearch({initArgs, slotProps,useSIAv2, showLength
129133
const updatePanelStatus= makePanelStatusUpdater(checkHeaderCtl.isPanelActive(), panelValue);
130134

131135
useEffect(() => {
132-
const constraints= makeExposureConstraints(getVal('exposureRangeType'), makeFldObj( fldListAry));
136+
const constraints= makeExposureConstraints(getVal('exposureRangeType'), makeFldObj( fldListAry), doingUpload, tableName);
133137
updatePanelStatus(constraints, constraintResult, setConstraintResult,useSIAv2);
134138
});
135139

@@ -169,14 +173,16 @@ export function ExposureDurationSearch({initArgs, slotProps,useSIAv2, showLength
169173
}
170174

171175
ExposureDurationSearch.propTypes = {
172-
initArgs: PropTypes.object,
173-
useSIAv2: PropTypes.bool,
174-
slotProps: PropTypes.shape({
175-
exposureRangeType: PropTypes.object,
176-
exposureTimeRange: PropTypes.object,
177-
exposureSince: PropTypes.object,
176+
initArgs: object,
177+
useSIAv2: bool,
178+
tableName: string,
179+
slotProps: shape({
180+
exposureRangeType: object,
181+
exposureTimeRange: object,
182+
exposureSince: object,
178183
}),
179-
showLengthInput: PropTypes.bool,
184+
doingUpload: bool,
185+
showLengthInput: bool,
180186
};
181187

182188

0 commit comments

Comments
 (0)