static anchorName(link) { return ( '#' + dasherize(underscore(link.replace(/[A-Z]{2,}(?=[A-Z])/, (v) => camelize(v.toLowerCase())).replace(/#/g, '-'))) ); }
aliasName(name, isPreAggregationName) { const path = name.split('.'); if (path[0] && this.cubeEvaluator.cubeExists(path[0]) && this.cubeEvaluator.cubeFromPath(path[0]).sqlAlias) { const cubeName = path[0]; path.splice(0, 1); path.unshift(this.cubeEvaluator.cubeFromPath(cubeName).sqlAlias); name = this.cubeEvaluator.pathFromArray(path); } // use single underscore for pre-aggregations to avoid fail of pre-aggregation name replace return inflection.underscore(name).replace(/\./g, isPreAggregationName ? '_' : '__'); }
compileTemplate(dashboardTemplate, errorReporter) { return { ...dashboardTemplate, title: dashboardTemplate.title || inlection.titleize(dashboardTemplate.name), items: (dashboardTemplate.items || []).map(item => this.compileItem(item, errorReporter)) }; }
numberMeasures(tableDefinition) { return tableDefinition.filter( column => !column.name.startsWith('_') && (this.columnType(column) === 'number') && this.fromMeasureDictionary(column) ).map(column => ({ name: column.name, types: ['sum', 'avg', 'min', 'max'], title: inflection.titleize(column.name) })); }
conditionSql(columnSql) { const operatorMethod = `${inlection.camelize(this.operator).replace( /[A-Z]/, (c) => (c != null ? c : '').toLowerCase() )}Where`; const sql = this[operatorMethod](columnSql); return this.query.paramAllocator.allocateParamsForQuestionString(sql, this.filterParams()); }
stepSegmentSelect(funnelDefinition, step) { return `SELECT ${this.stepUserIdColumnName(step)} user_id, ${this.stepUserIdColumnName(funnelDefinition.steps[0])} first_step_user_id, t, '${inflection.titleize(step.name)}' step FROM joined_events`; }
tableSchema(tableName, includeJoins) { const [schema, table] = this.parseTableName(tableName); const tableDefinition = this.resolveTableDefinition(tableName); const dimensions = this.dimensions(tableDefinition); return { cube: inflection.camelize(table), tableName, schema, table, measures: this.numberMeasures(tableDefinition), dimensions, drillMembers: this.drillMembers(dimensions), joins: includeJoins ? this.joins(tableName, tableDefinition) : [] }; }
memberTitle(m) { return inflection.titleize(inflection.underscore(this.memberName(m))) !== m.title ? m.title : undefined; }
prepareTableNamesToTables(tableNames) { this.tableNamesToTables = R.pipe( R.unnest, R.groupBy(n => n[0]), R.map(groupedNameToDef => groupedNameToDef.map(nameToDef => nameToDef[1])) )( tableNames.map(tableName => { const [schema, table] = this.parseTableName(tableName); const tableDefinition = this.resolveTableDefinition(tableName); const definition = { schema, table, tableDefinition, tableName }; const tableizeName = inflection.tableize(table); const parts = tableizeName.split('_'); const tableNamesFromParts = R.range(0, parts.length - 1).map(toDrop => inflection.tableize(R.drop(toDrop, parts).join('_'))); const names = R.uniq([table, tableizeName].concat(tableNamesFromParts)); return names.map(n => [n, definition]); }) ); }
// eslint-disable-next-line consistent-return resolveTableName(tableName) { let tableParts; if (Array.isArray(tableName)) { tableParts = tableName; } else { tableParts = tableName.match(/(["`].*?["`]|[^`".]+)+(?=\s*|\s*$)/g); } if (tableParts.length === 2) { this.scaffoldingSchema.resolveTableDefinition(tableName); return tableName; } else if (tableParts.length === 1) { const schema = Object.keys(this.dbSchema).find( tableSchema => this.dbSchema[tableSchema][tableName] || this.dbSchema[tableSchema][inflection.tableize(tableName)] ); if (!schema) { throw new UserError(`Can't find any table with '${tableName}' name`); } if (this.dbSchema[schema][tableName]) { return `${schema}.${tableName}`; } if (this.dbSchema[schema][inflection.tableize(tableName)]) { return `${schema}.${inflection.tableize(tableName)}`; } } else { throw new UserError('Table names should be in <table> or <schema>.<table> format'); } }
dimensions(tableDefinition) { return this.dimensionColumns(tableDefinition).map(column => { const res = { name: column.name, types: [column.columnType || this.columnType(column)], title: inflection.titleize(column.name) }; if (column.columnType !== 'time') { res.isPrimaryKey = column.attributes && column.attributes.indexOf('primaryKey') !== -1 || column.name.toLowerCase() === 'id'; } return res; }); }
memberName(member) { return inflection.camelize(member.title.replace(/[^A-Za-z0-9]+/g, '_').toLowerCase(), true); }
inflect(step) { return inflection.underscore(inflection.camelize(step.name.replace(/[^A-Za-z0-9]+/g, '_'))); }
titleize(name) { return inflection.titleize(inflection.underscore(name)); }
const anchorName = (link) => inflection.dasherize(inflection.underscore(link.replace(/#/g, '-')))