@synatic/noql
Version:
Convert SQL statements to mongo queries or aggregates
66 lines (63 loc) • 1.93 kB
JavaScript
const $check = require('check-types');
module.exports = {findSchema};
/**
* @param {string} column
* @param {import("../types").NoqlContext}context
* @returns {import("../types").JSONSchema6}
*/
function findSchema(column, context) {
if (!context.schemas) {
return null;
}
// const tableAliases = context.fullAst.ast.from;
const parts = column.split('.');
// const colAlias = parts.length > 1 ? parts[0] : null;
const colName = parts.length > 1 ? parts[1] : column;
// const foundTableAlias = colAlias
// ? tableAliases.find(
// (ta) => ta.as && ta.as.toLowerCase() === colAlias.toLowerCase()
// )
// : null;
// eslint-disable-next-line guard-for-in
const filteredSchemas = Object.keys(context.schemas).filter(
(name) => context.tables.indexOf(name) >= 0
);
for (const collectionName of filteredSchemas) {
const schema = context.schemas[collectionName];
const result = findSubSchema(schema, colName);
if (result) {
return result;
}
}
return null;
}
/**
* @param {import("../types").JSONSchema6} schema
* @param {string} column
* @returns {import("../types").JSONSchema6}
*/
function findSubSchema(schema, column) {
if (!schema.properties) {
return null;
}
// eslint-disable-next-line guard-for-in
for (const key in schema.properties) {
const value = schema.properties[key];
if ($check.boolean(value)) {
continue;
}
if (key.toLowerCase() === column.toLowerCase()) {
return value;
}
if (
value.type === 'object' ||
(Array.isArray(value.type) && value.type.indexOf('object') >= 0)
) {
const res = findSubSchema(value, column);
if (res) {
return res;
}
}
}
return null;
}