/* * License information at https://github.com/Caltech-IPAC/firefly/blob/master/License.txt */ import {get, set, unset, cloneDeep, omit, omitBy, isNil} from 'lodash'; import {uniqueTblId} from './TableUtil.js'; import {Keys} from '../core/background/BackgroundStatus.js'; import {SelectInfo} from './SelectInfo.js'; import {ServerParams} from '../data/ServerParams.js'; import {WS_HOME} from '../visualize/WorkspaceCntlr.js'; export const MAX_ROW = Math.pow(2,31) - 1; export const DataTagMeta = ['META_INFO', Keys.DATA_TAG]; // a tag describing the content of this table. ie. 'catalog', 'imagemeta' /* TABLE_REQUEST should match QueryUtil on the server-side */ /** * Creates a table request object for the given id. * @param {string} id required. SearchProcessor ID. * @param {string} [title] title to display with this table. * @param {object} [params] the parameters to include with this request. * @param {TableRequest} [options] more options. see TableRequest for details. * @returns {TableRequest} * @public * @func makeTblRequest * @memberof firefly.util.table */ export function makeTblRequest(id, title, params={}, options={}) { var req = {startIdx: 0, pageSize: 100}; title = title || id; const tbl_id = options.tbl_id || uniqueTblId(); var META_INFO = Object.assign(options.META_INFO || {}, {title, tbl_id}); options = omit(options, 'tbl_id'); return omitBy(Object.assign(req, options, params, {META_INFO, tbl_id, id}), isNil); } /** * Creates a table request for tabular data from a file or url. Source of file may be * from a url or an absolute path on the server. * @param {string} [title] title to display with this table. * @param {string} source required; location of the ipac table. url or file path. * @param {string} [alt_source] use this if source does not exists. * @param {TableRequest} [options] more options. see TableRequest for details. * @returns {TableRequest} * @public * @func makeFileRequest * @memberof firefly.util.table */ export function makeFileRequest(title, source, alt_source, options={}) { const id = 'IpacTableFromSource'; var req = {startIdx: 0, pageSize: 100}; title = title || source; const tbl_id = options.tbl_id || uniqueTblId(); options = omit(options, 'tbl_id'); var META_INFO = Object.assign(options.META_INFO || {}, {title, tbl_id}); return omitBy(Object.assign(req, options, {source, alt_source, META_INFO, tbl_id, id}), isNil); } /** * Creates a table request for tabular data from IRSA workspace. * Source should be an IRSA workspace path. i.e value returned from WorkspaceViewer * @param {string} source required; IRSA workspace path. * @param {string} [title] title to display with this table. * @param {TableRequest} [options] more options. see TableRequest for details. * @returns {TableRequest} * @public * @func makeIrsaWorkspaceRequest * @memberof firefly.util.table */ export function makeIrsaWorkspaceRequest(source, title, options={}) { source = source.replace(WS_HOME, ''); const request = makeFileRequest(title, source, undefined, options); request[ServerParams.SOURCE_FROM] = ServerParams.IS_WS; return request; } /** * Parameters for cone search * @typedef {object} ConeParams * @global * @prop {string} SearchMethod 'Cone'. * @prop {string} position name or coordinates of the search * @prop {string} radius radius of the search in arcsec * */ /** * Parameters for eliptical search * @typedef {object} ElipParams * @global * @prop {string} SearchMethod 'Eliptical'. * @prop {string} position name or coordinates of the search * @prop {string} radius radius of the search in arcsec * @prop {string} radunits the units for the radius or side, must be arcsec,arcmin,degree, default arcsec * @prop {string} ratio ratio for elliptical request * @prop {string} posang pa for elliptical request * */ /** * Parameters for box search * @typedef {object} BoxParams * @global * @prop {string} SearchMethod 'Eliptical'. * @prop {string} position name or coordinates of the search * @prop {string} size the length of a side for a box search * */ /** * creates the request to query IRSA catalogs. * @param {string} title title to be displayed with this table result * @param {string} project * @param {string} catalog the catalog name to search * @param {ConeParams|BoxParams|ElipParams} params one of 'Cone','Eliptical','Box','Polygon','Table','AllSky'. * @param {TableRequest} [options] * @returns {TableRequest} * @public * @func makeIrsaCatalogRequest * @memberof firefly.util.table */ export function makeIrsaCatalogRequest(title, project, catalog, params={}, options={}) { var req = {startIdx: 0, pageSize: 100}; title = title || catalog; const tbl_id = options.tbl_id || uniqueTblId(); const id = 'GatorQuery'; const UserTargetWorldPt = params.UserTargetWorldPt || params.position; // may need to convert to worldpt. const catalogProject = project; var META_INFO = Object.assign(options.META_INFO || {}, {title, tbl_id}); options = omit(options, 'tbl_id'); params = omit(params, 'position'); return omitBy(Object.assign(req, options, params, {id, tbl_id, META_INFO, UserTargetWorldPt, catalogProject, catalog}), isNil); } /** * creates the request to query LSST catalogs. // TODO: more detail to be updated based on the LSST catalog DD content * @param {string} title title to be displayed with this table result * @param {string} project * @param {string} catalog the catalog name to search * @param {ConeParams|BoxParams|ElipParams} params one of 'Cone','Eliptical','Box','Polygon','Table','AllSky'. * @param {TableRequest} [options] * @returns {TableRequest} * @func makeLsstCatalogRequest * @memberof firefly.util.table */ export function makeLsstCatalogRequest(title, project, catalog, params={}, options={}) { const req = {startIdx: 0, pageSize: 100}; title = title || catalog; const tbl_id = options.tbl_id || uniqueTblId(); const id = get(params, 'SearchMethod')==='Table'?'LSSTMultiObjectSearch':'LSSTCatalogSearch'; const UserTargetWorldPt = params.UserTargetWorldPt || params.position; // may need to convert to worldpt. const table_name = catalog; const meta_table = catalog; const META_INFO = Object.assign(options.META_INFO || {}, {title, tbl_id}); options = omit(options, 'tbl_id'); params = omit(params, 'position'); return omitBy(Object.assign(req, options, params, {id, tbl_id, META_INFO, UserTargetWorldPt, table_name, meta_table, project}), isNil); } /** * creates the request to query VO catalogmakeLsstCatalogRequest * @param {string} title title to be displayed with this table result * @param {ConeParams|BoxParams|ElipParams} params one of 'Cone','Eliptical','Box','Polygon','Table','AllSky'. * @param {TableRequest} [options] * @returns {TableRequest} * @func makeVOCatalogRequest * @memberof firefly.util.table */ export function makeVOCatalogRequest(title, params={}, options={}) { var req = {startIdx: 0, pageSize: 100}; const tbl_id = options.tbl_id || uniqueTblId(); const providerid = voProviders[params.providerName]; const id = providerid || 'ConeSearchByURL'; const UserTargetWorldPt = params.UserTargetWorldPt || params.position; // may need to convert to worldpt. var META_INFO = Object.assign(options.META_INFO || {}, {title, tbl_id}); options = omit(options, 'tbl_id'); params = omit(params, 'position'); return omitBy(Object.assign(req, options, params, {id, tbl_id, META_INFO, UserTargetWorldPt}), isNil); } const voProviders = {'NED':'NedSearch'}; /** * create a deep clone of the given request. tbl_id is removed from the cloned request. * @param {TableRequest} request the original request to clone * @param {Object} params additional parameters to add to the cloned request * @returns {TableRequest} * @public * @func cloneRequest * @memberof firefly.util.table */ export function cloneRequest(request, params = {}) { const req = cloneDeep(omit(request, 'tbl_id')); unset(req, 'META_INFO.tbl_id'); return Object.assign(req, params); } /** * create a request which will perform a function on the given searchRequest * @param {TableRequest} searchRequest required. the table's request this function should operate on * @param {string} id required. SearchProcessor ID. * @param {string} [title] title to display with this table. * @param {object} [params] the parameters to include with this request. * @param {TableRequest} [options] more options. see TableRequest for details. * @returns {TableRequest} * @public * @func makeTableFunctionRequest * @memberof firefly.util.table */ export function makeTableFunctionRequest(searchRequest, id, title, params={}, options={}) { const req = makeTblRequest(id, title, params, options); req.searchRequest = JSON.stringify(searchRequest); return req; } /** * return the tbl_id from the request object * @param {TableRequest} request * @returns {string} */ export function getTblId(request) { return get(request, 'META_INFO.tbl_id') || get(request, 'tbl_id'); } /** * set the resultSetID into the request object * @param {TableRequest} request * @param {string} resultSetID */ export function setResultSetID(request, resultSetID) { set(request, 'META_INFO.resultSetID', resultSetID); } /** * set the resultSetRequest into the request object * @param {TableRequest} request * @param {string} resultSetRequest */ export function setResultSetRequest(request, resultSetRequest) { set(request, 'META_INFO.resultSetRequest', resultSetRequest); } /** * set selectInfo * @param {TableRequest} request * @param {object} selectInfo */ export function setSelectInfo(request, selectInfo) { if (selectInfo) { set(request, 'META_INFO.selectInfo', SelectInfo.newInstance(selectInfo).toString()); } } /** * set timestamp parameter to prevent search results from caching * @param {TableRequest} request */ export function setNoCache(request) { set(request, '__searchID', Date.now()); }