in api/v1/src/datasets/views/sqlBuilder.js [26:71]
async function generateSql(view) {
let sql;
if (Object.prototype.hasOwnProperty.call(view, 'custom')) {
console.log(`Generating query using custom SQL for view '${view.name}'`);
sql = view.custom.query;
// If statement ends with a ';' remove it
if (sql.substring(sql.length - 1) === ";") {
sql = sql.substring(0, sql.length - 1);
}
const accessControlEnabled = (view.accessControl && view.accessControl.enabled) || false;
if (accessControlEnabled === true) {
console.log("Using dataset entitlements");
let newSql = `SELECT * FROM (\n`;
newSql += await prependLines(sql, "\t", 1);
newSql += '\n) s';
let entityFilter = await generateAccessControlSubquery(view);
if (entityFilter) {
newSql += "\nWHERE\n" + entityFilter;
}
sql = newSql.trim();
}
}
else {
if (configUtil.isPublicAccessEnabled(view) === true) {
console.log(`Generating query with public access for view '${view.name}'`);
sql = await generateSqlWithPublicAccess(view);
}
else {
console.log(`Generating query for view '${view.name}'`);
sql = await generateSqlWithoutPublicAccess(view);
}
}
// http://b/139288516 Add support time-based entitlements
// If expiration is specified and delete is non-existant or false
if (Object.prototype.hasOwnProperty.call(view, 'expiration') && view.expiration && !view.expiration.delete) {
const paddedSql = await prependLines(sql.trim(), "\t", 1);
const expirySql = `SELECT * FROM (\n${paddedSql}\n)\nWHERE TIMESTAMP_MILLIS(${view.expiration.time}) > CURRENT_TIMESTAMP()`;
return expirySql.trim();
}
else {
return sql.trim();
}
}