in api/v1/src/datasets/dataManager.js [363:427]
async function validateDatasetView(projectId, datasetId, view, includeSampleData) {
if (view.authorizedViewId) {
const currentView = await getDatasetView(projectId, datasetId, view.authorizedViewId);
if (currentView.success && currentView.data.rowId !== view.rowId) {
return { success: false, code: 500, errors: ["STALE"] };
}
}
try {
let configValidator = new ConfigValidator();
const result = await configValidator.validate(view);
console.log(result);
let response = { success: result.isValid, data: result, code: result.isValid ? 200 : 400 };
if (result.isValid && includeSampleData) {
let deepClone = JSON.parse(JSON.stringify(view));
// Disable access control for the sample data
if (!deepClone.accessControl) {
deepClone.accessControl = { enabled: false };
} else {
deepClone.accessControl.enabled = false;
}
const sql = await sqlBuilder.generateSql(deepClone, false);
console.log(sql);
const bigqueryUtil = new BigQueryUtil(projectId);
const validateQueryResponse = await bigqueryUtil.validateQuery(sql, 20, includeSampleData);
if (validateQueryResponse.rows.length > 0) {
response.data.rows = validateQueryResponse.rows;
let columns = [];
let keys = [];
validateQueryResponse.rows.forEach(row => {
Object.keys(row).forEach(function (key) {
const val = row[key];
if (
typeof val === 'object' &&
!Array.isArray(val) &&
val !== null
) {
const valKey = `${key}.value`;
if (!keys.includes(valKey)) {
keys.push(valKey);
columns.push({ name: key, path: valKey });
}
} else {
if (!keys.includes(key)) {
keys.push(key);
columns.push({ name: key, path: key });
}
}
});
});
response.data.columns = columns;
} else {
response.data.rows = [];
response.data.columns = [];
}
}
return response;
} catch (err) {
console.log(err);
const message = `Failed to validate view`;
return { success: false, isValid: false, code: 500, errors: [message] };
}
}