in src/processors/data-processor.js [546:613]
export function validateInputData(data) {
if (!isPlainObject(data)) {
assert('addDataToMap Error: dataset.data cannot be null');
return null;
} else if (!Array.isArray(data.fields)) {
assert('addDataToMap Error: expect dataset.data.fields to be an array');
return null;
} else if (!Array.isArray(data.rows)) {
assert('addDataToMap Error: expect dataset.data.rows to be an array');
return null;
}
const {fields, rows} = data;
// check if all fields has name, format and type
const allValid = fields.every((f, i) => {
if (!isPlainObject(f)) {
assert(`fields needs to be an array of object, but find ${typeof f}`);
fields[i] = {};
}
if (!f.name) {
assert(`field.name is required but missing in ${JSON.stringify(f)}`);
// assign a name
fields[i].name = `column_${i}`;
}
if (!ALL_FIELD_TYPES[f.type]) {
assert(`unknown field type ${f.type}`);
return false;
}
if (!fields.every(field => field.analyzerType)) {
assert('field missing analyzerType');
return false;
}
// check time format is correct based on first 10 not empty element
if (f.type === ALL_FIELD_TYPES.timestamp) {
const sample = findNonEmptyRowsAtField(rows, i, 10).map(r => ({ts: r[i]}));
const analyzedType = Analyzer.computeColMeta(sample)[0];
return analyzedType.category === 'TIME' && analyzedType.format === f.format;
}
return true;
});
if (allValid) {
return {rows, fields};
}
// if any field has missing type, recalculate it for everyone
// because we simply lost faith in humanity
const sampleData = getSampleForTypeAnalyze({
fields: fields.map(f => f.name),
allData: rows
});
const fieldOrder = fields.map(f => f.name);
const meta = getFieldsFromData(sampleData, fieldOrder);
const updatedFields = fields.map((f, i) => ({
...f,
type: meta[i].type,
format: meta[i].format,
analyzerType: meta[i].analyzerType
}));
return {fields: updatedFields, rows};
}