in src/data/helper/sourceHelper.ts [354:462]
function doGuessOrdinal(
data: Source['data'],
sourceFormat: Source['sourceFormat'],
seriesLayoutBy: Source['seriesLayoutBy'],
dimensionsDefine: Source['dimensionsDefine'],
startIndex: Source['startIndex'],
dimIndex: DimensionIndex
): BeOrdinalValue {
let result;
// Experience value.
const maxLoop = 5;
if (isTypedArray(data)) {
return BE_ORDINAL.Not;
}
// When sourceType is 'objectRows' or 'keyedColumns', dimensionsDefine
// always exists in source.
let dimName;
let dimType;
if (dimensionsDefine) {
const dimDefItem = dimensionsDefine[dimIndex];
if (isObject(dimDefItem)) {
dimName = dimDefItem.name;
dimType = dimDefItem.type;
}
else if (isString(dimDefItem)) {
dimName = dimDefItem;
}
}
if (dimType != null) {
return dimType === 'ordinal' ? BE_ORDINAL.Must : BE_ORDINAL.Not;
}
if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {
const dataArrayRows = data as OptionSourceDataArrayRows;
if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) {
const sample = dataArrayRows[dimIndex];
for (let i = 0; i < (sample || []).length && i < maxLoop; i++) {
if ((result = detectValue(sample[startIndex + i])) != null) {
return result;
}
}
}
else {
for (let i = 0; i < dataArrayRows.length && i < maxLoop; i++) {
const row = dataArrayRows[startIndex + i];
if (row && (result = detectValue(row[dimIndex])) != null) {
return result;
}
}
}
}
else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {
const dataObjectRows = data as OptionSourceDataObjectRows;
if (!dimName) {
return BE_ORDINAL.Not;
}
for (let i = 0; i < dataObjectRows.length && i < maxLoop; i++) {
const item = dataObjectRows[i];
if (item && (result = detectValue(item[dimName])) != null) {
return result;
}
}
}
else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {
const dataKeyedColumns = data as OptionSourceDataKeyedColumns;
if (!dimName) {
return BE_ORDINAL.Not;
}
const sample = dataKeyedColumns[dimName];
if (!sample || isTypedArray(sample)) {
return BE_ORDINAL.Not;
}
for (let i = 0; i < sample.length && i < maxLoop; i++) {
if ((result = detectValue(sample[i])) != null) {
return result;
}
}
}
else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) {
const dataOriginal = data as OptionSourceDataOriginal;
for (let i = 0; i < dataOriginal.length && i < maxLoop; i++) {
const item = dataOriginal[i];
const val = getDataItemValue(item);
if (!isArray(val)) {
return BE_ORDINAL.Not;
}
if ((result = detectValue(val[dimIndex])) != null) {
return result;
}
}
}
function detectValue(val: OptionDataValue): BeOrdinalValue {
const beStr = isString(val);
// Consider usage convenience, '1', '2' will be treated as "number".
// `Number('')` (or any whitespace) is `0`.
if (val != null && Number.isFinite(Number(val)) && val !== '') {
return beStr ? BE_ORDINAL.Might : BE_ORDINAL.Not;
}
else if (beStr && val !== '-') {
return BE_ORDINAL.Must;
}
}
return BE_ORDINAL.Not;
}