mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-10-05 19:58:12 +08:00
move schema sniffer to util
This commit is contained in:
Vendored
+1
-40
@@ -1,48 +1,9 @@
|
|||||||
// jshint esversion: 6
|
// jshint esversion: 6
|
||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
import { parseRGB } from "../util/parseRGB";
|
import { parseRGB } from "../util/parseRGB";
|
||||||
|
import { createSchemaByDataSniffing } from "../util/schema";
|
||||||
var crossfilter = require("../util/typedCrossfilter");
|
var crossfilter = require("../util/typedCrossfilter");
|
||||||
|
|
||||||
// In the case where the REST server does not implement data schema
|
|
||||||
// declaration, we attempt to deduce it by sniffing the data.
|
|
||||||
//
|
|
||||||
function createSchemaByDataSniffing(ranges) {
|
|
||||||
let schema = {};
|
|
||||||
_.forEach(ranges, (value, key) => {
|
|
||||||
schema[key] = {
|
|
||||||
displayname: key,
|
|
||||||
variabletype: value.options ? "categorical" : "continuous"
|
|
||||||
};
|
|
||||||
|
|
||||||
// Metadata field type is inferred by sniffing the data. This has some risks.
|
|
||||||
// Caveats:
|
|
||||||
// * Values have been converted to native JS objects by the JSON parser.
|
|
||||||
// * Lots of assumptions about he REST API behaving properly (eg, min/max
|
|
||||||
// are the same type, etc).
|
|
||||||
let type;
|
|
||||||
if (schema[key].variabletype === "continuous" && value.range) {
|
|
||||||
// Use min/max as a proxy for all data.
|
|
||||||
const min = value.range.min;
|
|
||||||
const max = value.range.max;
|
|
||||||
type =
|
|
||||||
typeof min !== "number" || typeof max !== "number"
|
|
||||||
? "string"
|
|
||||||
: Number.isSafeInteger(min) && Number.isSafeInteger(max)
|
|
||||||
? "int"
|
|
||||||
: "float";
|
|
||||||
} else {
|
|
||||||
// use an option value as a proxy for all data
|
|
||||||
const aVal = value.options[0];
|
|
||||||
type =
|
|
||||||
typeof aVal !== "number"
|
|
||||||
? "string"
|
|
||||||
: Number.isSafeInteger(aVal) ? "int" : "float";
|
|
||||||
}
|
|
||||||
schema[key].type = type;
|
|
||||||
});
|
|
||||||
return schema;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deduce the correct crossfilter dimension type from a metadata
|
// Deduce the correct crossfilter dimension type from a metadata
|
||||||
// schema description.
|
// schema description.
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
// jshint esversion: 6
|
||||||
|
|
||||||
|
// In the case where the REST server does not implement data schema
|
||||||
|
// declaration, we attempt to deduce it by sniffing the data.
|
||||||
|
//
|
||||||
|
export function createSchemaByDataSniffing(ranges) {
|
||||||
|
let schema = {};
|
||||||
|
_.forEach(ranges, (value, key) => {
|
||||||
|
schema[key] = {
|
||||||
|
displayname: key,
|
||||||
|
variabletype: value.options ? "categorical" : "continuous"
|
||||||
|
};
|
||||||
|
|
||||||
|
// Metadata field type is inferred by sniffing the data. This has some risks.
|
||||||
|
// Caveats:
|
||||||
|
// * Values have been converted to native JS objects by the JSON parser.
|
||||||
|
// * Lots of assumptions about he REST API behaving properly (eg, min/max
|
||||||
|
// are the same type, etc).
|
||||||
|
let type;
|
||||||
|
if (schema[key].variabletype === "continuous" && value.range) {
|
||||||
|
// Use min/max as a proxy for all data.
|
||||||
|
const min = value.range.min;
|
||||||
|
const max = value.range.max;
|
||||||
|
type =
|
||||||
|
typeof min !== "number" || typeof max !== "number"
|
||||||
|
? "string"
|
||||||
|
: Number.isSafeInteger(min) && Number.isSafeInteger(max)
|
||||||
|
? "int"
|
||||||
|
: "float";
|
||||||
|
} else {
|
||||||
|
// use an option value as a proxy for all data
|
||||||
|
const aVal = value.options[0];
|
||||||
|
type =
|
||||||
|
typeof aVal !== "number"
|
||||||
|
? "string"
|
||||||
|
: Number.isSafeInteger(aVal) ? "int" : "float";
|
||||||
|
}
|
||||||
|
schema[key].type = type;
|
||||||
|
});
|
||||||
|
return schema;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user