in src/data/helper/sourceHelper.ts [192:284]
export function makeSeriesEncodeForNameBased(
seriesModel: SeriesModel,
source: Source,
dimCount: number
): SeriesEncodeInternal {
const encode: SeriesEncodeInternal = {};
const datasetModel = querySeriesUpstreamDatasetModel(seriesModel);
// Currently only make default when using dataset, util more reqirements occur.
if (!datasetModel) {
return encode;
}
const sourceFormat = source.sourceFormat;
const dimensionsDefine = source.dimensionsDefine;
let potentialNameDimIndex;
if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {
each(dimensionsDefine, function (dim, idx) {
if ((isObject(dim) ? dim.name : dim) === 'name') {
potentialNameDimIndex = idx;
}
});
}
type IdxResult = { v: number, n: number };
const idxResult = (function () {
const idxRes0 = {} as IdxResult;
const idxRes1 = {} as IdxResult;
const guessRecords = [];
// 5 is an experience value.
for (let i = 0, len = Math.min(5, dimCount); i < len; i++) {
const guessResult = doGuessOrdinal(
source.data, sourceFormat, source.seriesLayoutBy,
dimensionsDefine, source.startIndex, i
);
guessRecords.push(guessResult);
const isPureNumber = guessResult === BE_ORDINAL.Not;
// [Strategy of idxRes0]: find the first BE_ORDINAL.Not as the value dim,
// and then find a name dim with the priority:
// "BE_ORDINAL.Might|BE_ORDINAL.Must" > "other dim" > "the value dim itself".
if (isPureNumber && idxRes0.v == null && i !== potentialNameDimIndex) {
idxRes0.v = i;
}
if (idxRes0.n == null
|| (idxRes0.n === idxRes0.v)
|| (!isPureNumber && guessRecords[idxRes0.n] === BE_ORDINAL.Not)
) {
idxRes0.n = i;
}
if (fulfilled(idxRes0) && guessRecords[idxRes0.n] !== BE_ORDINAL.Not) {
return idxRes0;
}
// [Strategy of idxRes1]: if idxRes0 not satisfied (that is, no BE_ORDINAL.Not),
// find the first BE_ORDINAL.Might as the value dim,
// and then find a name dim with the priority:
// "other dim" > "the value dim itself".
// That is for backward compat: number-like (e.g., `'3'`, `'55'`) can be
// treated as number.
if (!isPureNumber) {
if (guessResult === BE_ORDINAL.Might && idxRes1.v == null && i !== potentialNameDimIndex) {
idxRes1.v = i;
}
if (idxRes1.n == null || (idxRes1.n === idxRes1.v)) {
idxRes1.n = i;
}
}
}
function fulfilled(idxResult: IdxResult) {
return idxResult.v != null && idxResult.n != null;
}
return fulfilled(idxRes0) ? idxRes0 : fulfilled(idxRes1) ? idxRes1 : null;
})();
if (idxResult) {
encode.value = [idxResult.v];
// `potentialNameDimIndex` has highest priority.
const nameDimIndex = potentialNameDimIndex != null ? potentialNameDimIndex : idxResult.n;
// By default, label uses itemName in charts.
// So we don't set encodeLabel here.
encode.itemName = [nameDimIndex];
encode.seriesName = [nameDimIndex];
}
return encode;
}