Skip to content

Commit

Permalink
RC 1
Browse files Browse the repository at this point in the history
  • Loading branch information
Juanjo Ortilles authored and Juanjo Ortilles committed Apr 9, 2024
1 parent 6d4e3b0 commit 7dbaa42
Show file tree
Hide file tree
Showing 3 changed files with 228 additions and 87 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ export class MySqlBuilderService extends QueryBuilderService {

public normalQuery(columns: string[], origin: string, dest: any[], joinTree: any[], grouping: any[], filters: any[], havingFilters: any[],
tables: Array<any>, limit: number, joinType: string, valueListJoins: Array<any> ,schema: string, database: string, forSelector: any ) {

let o = tables.filter(table => table.name === origin).map(table => { return table.query ? table.query : table.name })[0];
let myQuery = `SELECT ${columns.join(', ')} \nFROM ${o}`;

Expand All @@ -22,8 +21,19 @@ export class MySqlBuilderService extends QueryBuilderService {
myQuery = `SELECT DISTINCT ${columns.join(', ')} \nFROM ${o}`;
}


// JOINS
const joinString = this.getJoins(joinTree, dest, tables, joinType, valueListJoins);
let joinString: any[];
let alias: any;
if (this.queryTODO.joined) {
const responseJoins = this.setJoins(joinTree, joinType, schema, valueListJoins);
joinString = responseJoins.joinString;
alias = responseJoins.aliasTables;
} else {
joinString = this.getJoins(joinTree, dest, tables, joinType, valueListJoins, schema);
}



joinString.forEach(x => {
myQuery = myQuery + '\n' + x;
Expand All @@ -40,7 +50,7 @@ export class MySqlBuilderService extends QueryBuilderService {
}

//HAVING
myQuery += this.getHavingFilters(havingFilters, 'having');
myQuery += this.getHavingFilters(havingFilters);

// OrderBy
const orderColumns = this.queryTODO.fields.map(col => {
Expand Down Expand Up @@ -115,7 +125,7 @@ export class MySqlBuilderService extends QueryBuilderService {
}
}

public getJoins(joinTree: any[], dest: any[], tables: Array<any>, joinType:string, valueListJoins:Array<any>): any {
public getJoins(joinTree: any[], dest: any[], tables: Array<any>, joinType:string, valueListJoins:Array<any>, schema:string): any {

let joins = [];
let joined = [];
Expand Down Expand Up @@ -176,6 +186,64 @@ export class MySqlBuilderService extends QueryBuilderService {

}



public setJoins(joinTree: any[], joinType: string, schema: string, valueListJoins: string[]) {

// Inicialización de variables
const joinExists = new Set();
const aliasTables = {};
const joinString = [];
const targetTableJoin = [];

for (const join of joinTree) {
// División de las partes de la join
const [sourceTable, sourceColumn] = join[0].split('.');
const [targetTable, targetColumn] = join[1].split('.');

// Construcción de las partes de la join
const sourceJoin = `\`${sourceTable}\`.\`${sourceColumn}\``;
let targetJoin = `\`${targetTable}\`.\`${targetColumn}\``;

// Si la join no existe ya, se añade
if (!joinExists.has(`${sourceJoin}=${targetJoin}`)) {
joinExists.add(`${sourceJoin}=${targetJoin}`);

// Construcción de los alias
const alias = `\`${targetTable}.${targetColumn}\``;
aliasTables[alias] = targetTable;

let aliasTargetTable: string;
if (targetTableJoin.includes(targetTable)) {
aliasTargetTable = `${targetTable}${targetTableJoin.indexOf(targetTable)}`;
aliasTables[alias] = aliasTargetTable;
}

let joinStr: string;

joinType = valueListJoins.includes(targetTable) ? 'LEFT' : joinType;

if (aliasTargetTable) {
targetJoin = `\`${aliasTargetTable}\`.\`${targetColumn}\``;
joinStr = `${joinType} JOIN \`${targetTable}\` \`${aliasTargetTable}\` ON \`${sourceJoin}\` = \`${targetJoin}\``;
} else {
joinStr = `${joinType} JOIN \`${targetTable}\` ON \`${sourceJoin}\` = \`${targetJoin}\``;
}

// Si la join no se ha incluido ya, se añade al array
if (!joinString.includes(joinStr)) {
targetTableJoin.push(aliasTargetTable || targetTable);
joinString.push(joinStr);
}
}
}

return {
joinString,
aliasTables
};
}

/*SDA CUSTOM*/ @custom.muSqlBuilderServiceCustomGetMinFractionDigits
public getMinFractionDigits(el:any): any{
if (!el.hasOwnProperty('minimumFractionDigits')) {
Expand All @@ -192,6 +260,12 @@ export class MySqlBuilderService extends QueryBuilderService {
this.queryTODO.fields.forEach(el => {
el.order !== 0 && el.table_id !== origin && !dest.includes(el.table_id) ? dest.push(el.table_id) : false;

const table_column = `\`${el.table_id}\`.\`${el.column_name}\``;

let whatIfExpression = '';
if (el.whatif_column) whatIfExpression = `${el.whatif.operator} ${el.whatif.value}`;


el = this.getMinFractionDigits(el);

// Aqui se manejan las columnas calculadas
Expand Down Expand Up @@ -236,72 +310,72 @@ export class MySqlBuilderService extends QueryBuilderService {
} else {
if (el.aggregation_type !== 'none') {
if (el.aggregation_type === 'count_distinct') {
columns.push(`cast( count( distinct \`${el.table_id}\`.\`${el.column_name}\`) as decimal(32,${el.minimumFractionDigits||0}) ) as \`${el.display_name}\``);
columns.push(`cast( count( distinct ${table_column}) as decimal(32,${el.minimumFractionDigits||0}) ) as \`${el.display_name}\``);
} else {
columns.push(`cast(${el.aggregation_type}(\`${el.table_id}\`.\`${el.column_name}\`) as decimal(32,${el.minimumFractionDigits||0}) ) as \`${el.display_name}\``);
columns.push(`cast(${el.aggregation_type}(${table_column}) as decimal(32,${el.minimumFractionDigits||0}) ) as \`${el.display_name}\``);
}
} else {
if (el.column_type === 'numeric') {
columns.push(`cast(\`${el.table_id}\`.\`${el.column_name}\` as decimal(32,${el.minimumFractionDigits})) as \`${el.display_name}\``);
columns.push(`cast(${table_column} as decimal(32,${el.minimumFractionDigits})) as \`${el.display_name}\``);
} else if (el.column_type === 'date') {
if (el.format) {
if (_.isEqual(el.format, 'year')) {
columns.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%Y') as \`${el.display_name}\``);
columns.push(`DATE_FORMAT(${table_column}, '%Y') as \`${el.display_name}\``);
} else if (_.isEqual(el.format, 'quarter')) {
columns.push( `concat( concat( year(\`${el.table_id}\`.\`${el.column_name}\`),'-Q' ), quarter(\`${el.table_id}\`.\`${el.column_name}\`) ) as \`${el.display_name}\`` );
columns.push( `concat( concat( year(${table_column}),'-Q' ), quarter(${table_column}) ) as \`${el.display_name}\`` );
} else if (_.isEqual(el.format, 'month')) {
columns.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%Y-%m') as \`${el.display_name}\``);
columns.push(`DATE_FORMAT(${table_column}, '%Y-%m') as \`${el.display_name}\``);
} else if (_.isEqual(el.format, 'week')) {
columns.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%x-%v') as \`${el.display_name}\``);
columns.push(`DATE_FORMAT(${table_column}, '%x-%v') as \`${el.display_name}\``);
} else if (_.isEqual(el.format, 'day')) {
columns.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%Y-%m-%d') as \`${el.display_name}\``);
columns.push(`DATE_FORMAT(${table_column}, '%Y-%m-%d') as \`${el.display_name}\``);
} else if (_.isEqual(el.format, 'week_day')) {
columns.push(`WEEKDAY(\`${el.table_id}\`.\`${el.column_name}\`) + 1 as \`${el.display_name}\``);
columns.push(`WEEKDAY(${table_column}) + 1 as \`${el.display_name}\``);
}else if (_.isEqual(el.format, 'day_hour')) {
columns.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%Y-%m-%d %H') as \`${el.display_name}\``);
columns.push(`DATE_FORMAT(${table_column}, '%Y-%m-%d %H') as \`${el.display_name}\``);
}else if (_.isEqual(el.format, 'day_hour_minute')) {
columns.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%Y-%m-%d %H:%i') as \`${el.display_name}\``);
columns.push(`DATE_FORMAT(${table_column}, '%Y-%m-%d %H:%i') as \`${el.display_name}\``);
}else if (_.isEqual(el.format, 'timestamp')) {
columns.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%Y-%m-%d %H:%i:%s') as \`${el.display_name}\``);
columns.push(`DATE_FORMAT(${table_column}, '%Y-%m-%d %H:%i:%s') as \`${el.display_name}\``);
} else {
columns.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%Y-%m-%d') as \`${el.display_name}\``);
columns.push(`DATE_FORMAT(${table_column}, '%Y-%m-%d') as \`${el.display_name}\``);
}
} else {
columns.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%Y-%m-%d') as \`${el.display_name}\``);
columns.push(`DATE_FORMAT(${table_column}, '%Y-%m-%d') as \`${el.display_name}\``);
}
} else {

columns.push(`\`${el.table_id}\`.\`${el.column_name}\` as \`${el.display_name}\``);
columns.push(`${table_column} as \`${el.display_name}\``);

}

// GROUP BY
if (el.format) {
if (_.isEqual(el.format, 'year')) {
grouping.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%Y')`);
grouping.push(`DATE_FORMAT(${table_column}, '%Y')`);
} else if (_.isEqual(el.format, 'quarter')) {
grouping.push( `concat( concat( year(\`${el.table_id}\`.\`${el.column_name}\`),'-Q' ), quarter(\`${el.table_id}\`.\`${el.column_name}\`) ) ` );
grouping.push( `concat( concat( year(${table_column}),'-Q' ), quarter(${table_column}) ) ` );
} else if (_.isEqual(el.format, 'month')) {
grouping.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%Y-%m')`);
grouping.push(`DATE_FORMAT(${table_column}, '%Y-%m')`);
} else if (_.isEqual(el.format, 'week')) {
grouping.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%x-%v')`);
grouping.push(`DATE_FORMAT(${table_column}, '%x-%v')`);
} else if (_.isEqual(el.format, 'week_day')) {
grouping.push(`WEEKDAY(\`${el.table_id}\`.\`${el.column_name}\`) + 1`);
grouping.push(`WEEKDAY(${table_column}) + 1`);
} else if (_.isEqual(el.format, 'day')) {
grouping.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%Y-%m-%d')`);
grouping.push(`DATE_FORMAT(${table_column}, '%Y-%m-%d')`);
}else if (_.isEqual(el.format, 'day_hour')) {
columns.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%Y-%m-%d %H') `);
columns.push(`DATE_FORMAT(${table_column}, '%Y-%m-%d %H') `);
}else if (_.isEqual(el.format, 'day_hour_minute')) {
grouping.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%Y-%m-%d %H:%i') `);
grouping.push(`DATE_FORMAT(${table_column}, '%Y-%m-%d %H:%i') `);
}else if (_.isEqual(el.format, 'timestamp')) {
grouping.push(`DATE_FORMAT(\`${el.table_id}\`.\`${el.column_name}\`, '%Y-%m-%d %H:%i:%s')`);
grouping.push(`DATE_FORMAT(${table_column}, '%Y-%m-%d %H:%i:%s')`);
} else {
grouping.push(`\`${el.table_id}\`.\`${el.column_name}\``);
grouping.push(`${table_column}`);
}
} else {
// Si es una única columna numérica no se agrega.
if( this.queryTODO.fields.length > 1 || el.column_type != 'numeric' ){
grouping.push(`\`${el.table_id}\`.\`${el.column_name}\``);
grouping.push(`${table_column}`);
}
}
}
Expand Down Expand Up @@ -354,8 +428,6 @@ export class MySqlBuilderService extends QueryBuilderService {
*/
public getFilterColname(column: any){
let colname:String ;
console.log('la columna es ')
console.log(column);
if( column.computed_column == 'no' || ! column.hasOwnProperty('computed_column') ){
colname = `\`${column.table_id}\`.\`${column.column_name}\`` ;
}else{
Expand All @@ -374,11 +446,11 @@ export class MySqlBuilderService extends QueryBuilderService {
* @param filterObject
* @returns clausula having en un string.
*/
public getHavingFilters(filters, type: string): any {
public getHavingFilters(filters ): any {

if (filters.length) {

let filtersString = `\n${type} 1 = 1 `;
let filtersString = `\nhaving 1=1 `;

filters.forEach(f => {

Expand Down
Loading

0 comments on commit 7dbaa42

Please sign in to comment.