mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-09-28 06:48:11 +08:00
* revert all commits to before Typescript migration * update compat workflow to match latest deps (#2335) * update compat workflow to match latest deps * attempt to debug * attempt to debug * remove debugging code * typo * update deps to match desktop (#2340) * fix: don't run lint with `--fix` on push tests (#2273) * fix: don't run lint with `--fix` on push tests * npx Co-authored-by: maniarathi <mani.arathi@gmail.com> Co-authored-by: Madison Dunitz <madison.dunitz@chanzuckerberg.com> * rename X_approx_distribution to X_approximate_distribution (#2337) * Correctly handle non-finite numbers in heuristic determination of X distribution (#2342) * handle non-finites explicitly * improve and test edge case handling for distribution estimation * revert debugging changes * code readability * clean up type inferencing (#2332) * unit tests for 64 bit conversion * clean up type handling * type inference tests * more type inference fixes * use schema to determine user intent for data typing * stop using deprecated API * fbs type encoding test * add missing test * add more tests * correctly infer X type for CXG adaptor * lint * fix typo * ts migration * cleanup from PR review * lint * PR review changes * remove unused packages from client (#2359) * remove unused packages from client * add missing peer dep * fix: disable FE auth testing on compatibility tests (#2377) * update: release process (#2277) Co-authored-by: maniarathi <mani.arathi@gmail.com> * fix: remove spaces in param setup (#2380) * delete deploy workflow (#2396) * undo reformatting which now does not pass lint * fix snapshots which changed due to npm dep changes * add missing quoting to snapshot * another snapshot typo fix * TS Revert (2) - replay PR #2347 and #2354 (#2403) * replay edits from PR 2347 * TS Revert (3) - replay edits in PR #2327 (#2404) * replay edits in PR 2327 * TS Revert (4) - replay PR #2355 (#2405) * replay edits in PR 2355 * add additional babel config * reformat with new prettier config Co-authored-by: Severiano Badajoz <sbadajoz@chanzuckerberg.com> Co-authored-by: maniarathi <mani.arathi@gmail.com> Co-authored-by: Madison Dunitz <madison.dunitz@chanzuckerberg.com>
127 lines
3.4 KiB
JavaScript
127 lines
3.4 KiB
JavaScript
import sha1 from "sha1";
|
|
import { _dubEncURIComp } from "./fetchHelpers";
|
|
|
|
/**
|
|
* Query utilities, mostly for debugging support and validation.
|
|
*/
|
|
|
|
/**
|
|
* Normalize & error check the query.
|
|
* @param {object | string} query - the query
|
|
* @returns {object | string} - the normalized query
|
|
*/
|
|
export function _queryValidate(query) {
|
|
if (typeof query !== "object") return query;
|
|
|
|
if (query.where && query.summarize)
|
|
throw new Error("query may not specify both where and summarize");
|
|
if (query.where) {
|
|
const {
|
|
field: queryField,
|
|
column: queryColumn,
|
|
value: queryValue,
|
|
} = query.where;
|
|
if (!queryField || !queryColumn || !queryValue)
|
|
throw new Error("Incomplete where query");
|
|
return query;
|
|
}
|
|
if (query.summarize) {
|
|
const {
|
|
field: queryField,
|
|
column: queryColumn,
|
|
values: queryValues,
|
|
} = query.summarize;
|
|
if (!queryField || !queryColumn || !queryValues)
|
|
throw new Error("Incomplete where query");
|
|
if (!Array.isArray(queryValues))
|
|
throw new Error("Summarize query values must be an array");
|
|
return query;
|
|
}
|
|
throw new Error("query must specify one of where or summarize");
|
|
}
|
|
|
|
export function _expectSimpleQuery(query) {
|
|
if (typeof query === "object") throw new Error("expected simple query");
|
|
}
|
|
|
|
export function _expectComplexQuery(query) {
|
|
if (typeof query !== "object") throw new Error("expected complex query");
|
|
}
|
|
|
|
/**
|
|
* Generate a unique key which can be used to reference this query.
|
|
*
|
|
* @param {string} field
|
|
* @param {string|object} query
|
|
* @returns the key
|
|
*/
|
|
export function _queryCacheKey(field, query) {
|
|
if (typeof query === "object") {
|
|
// complex query
|
|
if (query.where) {
|
|
const {
|
|
field: queryField,
|
|
column: queryColumn,
|
|
value: queryValue,
|
|
} = query.where;
|
|
return `${field}/${queryField}/${queryColumn}/${queryValue}`;
|
|
}
|
|
if (query.summarize) {
|
|
const {
|
|
method,
|
|
field: queryField,
|
|
column: queryColumn,
|
|
values: queryValues,
|
|
} = query.summarize;
|
|
return `${field}/${method}/${queryField}/${queryColumn}/${queryValues.join(
|
|
","
|
|
)}`;
|
|
}
|
|
throw new Error("Unrecognized complex query type");
|
|
}
|
|
|
|
// simple query
|
|
return `${field}/${query}`;
|
|
}
|
|
|
|
function _urlEncodeWhereQuery(q) {
|
|
const { field: queryField, column: queryColumn, value: queryValue } = q;
|
|
return `${_dubEncURIComp(queryField)}:${_dubEncURIComp(
|
|
queryColumn
|
|
)}=${_dubEncURIComp(queryValue)}`;
|
|
}
|
|
|
|
function _urlEncodeSummarizeQuery(q) {
|
|
const { method, field, column, values } = q;
|
|
const filter = values
|
|
.map((value) => _urlEncodeWhereQuery({ field, column, value }))
|
|
.join("&");
|
|
return `method=${method}&${filter}`;
|
|
}
|
|
|
|
export function _urlEncodeComplexQuery(q) {
|
|
if (typeof q === "object") {
|
|
if (q.where) {
|
|
return _urlEncodeWhereQuery(q.where);
|
|
}
|
|
if (q.summarize) {
|
|
return _urlEncodeSummarizeQuery(q.summarize);
|
|
}
|
|
}
|
|
throw new Error("Unrecognized complex query type");
|
|
}
|
|
|
|
export function _urlEncodeLabelQuery(colKey, q) {
|
|
if (!colKey) throw new Error("Unsupported query by name");
|
|
if (typeof q !== "string") throw new Error("Query must be a simple label.");
|
|
return `${colKey}=${encodeURIComponent(q)}`;
|
|
}
|
|
|
|
/**
|
|
* Generate the column key the server will send us for this query.
|
|
*/
|
|
export function _hashStringValues(arrayOfString) {
|
|
const hash = sha1(arrayOfString.join(""));
|
|
return hash;
|
|
}
|