async function validateDatasetView()

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] };
    }
}