var Unibase; (function (Unibase) { let Platform; (function (Platform) { let DataSources; (function (DataSources) { let Components; (function (Components) { class QueryParser extends Unibase.Platform.Core.BaseComponent { constructor() { super(...arguments); this.ErrorThrown = false; this.starCount = 0; } getInitialSelectHtml(SubQuery, Union) { Union && (SubQuery = true); let sub_query_cls = this.getContainerClass(SubQuery, Union); let cls = (SubQuery ? Union ? (sub_query_cls + " union_query") : (sub_query_cls + " sub_query") : "main_query"); return `
${this.getAddColumnHtml()}
${this.getTableHtml()}
${this.getInitialWhereHtml(sub_query_cls)}
${this.getInitialClauseHtml(sub_query_cls)}
${this.getUnionDropDwnHtml()}`; } getContainerClass(SubQuery, Union) { let sub_query_cls = "sub_query_" + ($(".sub_query").length + 1); if (!SubQuery && !Union) sub_query_cls = "main_query"; else if (Union) { Union && (SubQuery = true); sub_query_cls = "union_query_" + ($(".union_query").length + 1); } return sub_query_cls; } getAddColumnHtml() { return `
As
`; } getTableHtml() { return `
from
As
`; } getJoinDropDown() { return ``; } getJoinHtml() { return `
As on =
`; } getInitialWhereHtml(cls) { return `
Where ${this.getWhereHtml(cls)}
`; } getWhereHtml(cls) { return `
${this.getBetweenHtml()}
`; } getBetweenHtml() { return ``; } getInitialClauseHtml(cls) { return `
Clause ${this.getClauseHtml()}
`; } getClauseDwnHtml() { return ``; } getClauseHtml() { return `
${this.getClauseDwnHtml()}
${this.getOrderByAggregationHtml()}
`; } getClauseWrapperWithHavingHtml() { return `
${this.getHavingClauseHtml()}
`; } getOrderByAggregationHtml() { return ` `; } getGroupByClauseHtml() { return ``; } getHavingClauseHtml() { return ` ${this.getBetweenHtml()} `; } getUnionDropDwnHtml() { return ``; } mouseDown(e) { let container = $(e.target).closest(".select_container"); let container_cls = container.attr("id"); if (e.target.closest(".add_datalist_column") || e.target.classList.contains("add_datalist_column")) { container.find(`.${container_cls}.datalist_column_container`).first().children().last().find('.add_datalist_column').addClass("hidden"); container.find(`.${container_cls}.datalist_column_container`).first().children().last().append(this.getCloseBtnHtml()); container.find(`.${container_cls}.datalist_column_container`).first().append(this.getAddColumnHtml()); } else if (e.target.closest(".remove_btn") || e.target.classList.contains("remove_btn")) { let datalistColumnRow = $(e.target).closest(".datalist_column"); let joinRow = $(e.target).closest(".join_row"); let conditionRow = $(e.target).closest(".condition_row"); let clauseRow = $(e.target).closest(".clause_row"); let initialSelect = $(e.target).closest(".initialselect_div").first(); let subquery = $(e.target).closest(".sub_query").first(); let subQueryDiv = $(e.target).closest(".sub_query_div").first(); if (datalistColumnRow.length) datalistColumnRow.remove(); else if (clauseRow.length) clauseRow.remove(); else if (joinRow.length) joinRow.remove(); else if (conditionRow.length) conditionRow.remove(); else if (initialSelect.length) { initialSelect.parent().next().remove(); initialSelect.parent().prev().val("0"); initialSelect.parent().remove(); if (!subQueryDiv.children().length) { subQueryDiv.addClass("hidden"); } } else if (subquery.length && !datalistColumnRow.length && !clauseRow.length && !joinRow.length && !conditionRow.length && !initialSelect.length) { subQueryDiv.empty().addClass("hidden"); } } else if (e.target.closest(".add_join") || e.target.classList.contains("add_join")) { $(e.target).closest(".join_row").append(this.getCloseBtnHtml()); $(e.target).closest(".add_join").remove(); container.find(`.${container_cls}.datalist_tables_container`).first().append(this.getJoinHtml()); } else if (e.target.closest(".add_clause") || e.target.classList.contains("add_clause")) { $(e.target).closest(".clause_row").append(this.getCloseBtnHtml()); container.find(`.${container_cls}.clause_container`).first().append(this.getClauseHtml()); $(e.target).closest(".add_clause").remove(); } else if (e.target.classList.contains("get_tables_star")) { let element; let clst_sub_query = $(e.target).closest(".sub_query"); let clst_main_query = $(e.target).closest("#main_query"); let clst_union_query = $(e.target).closest(".union_query"); if (clst_union_query.length) { element = clst_union_query; } else if (clst_sub_query.length) { element = clst_sub_query; } else if (clst_main_query.length) { element = clst_main_query; } $(e.target).prev().html(this.getStarHtml(element)); } else if (e.target.closest(".is_subquery_chk_box_wrapper") || e.target.classList.contains("is_subquery")) { let checkbox = $(e.target).siblings(".is_subquery").length ? $(e.target).siblings(".is_subquery") : $(e.target).closest(".is_subquery"); let checkbox_wrapper = $(e.target).closest(".is_subquery_chk_box_wrapper"); let is_subquery = !checkbox.data("ischecked"); let sub_query_div = checkbox_wrapper.siblings(".sub_query_div"); checkbox.data("ischecked", is_subquery); if (is_subquery) { sub_query_div.removeClass("hidden"); if (!sub_query_div.children().length) sub_query_div.append(this.getInitialSelectHtml(true)); } else { sub_query_div.addClass("hidden"); } } else if (e.target.closest(".where_subquery_wrapper") || e.target.classList.contains("where_subquery")) { let checkbox = $(e.target).siblings(".where_subquery").length ? $(e.target).siblings(".where_subquery") : $(e.target).closest(".where_subquery"); let checkbox_wrapper = $(e.target).closest(".where_subquery_wrapper"); let is_subquery = !checkbox.data("ischecked"); let sub_query_div = checkbox_wrapper.parent().siblings(".sub_query_div"); checkbox.data("ischecked", is_subquery); if (is_subquery) { sub_query_div.removeClass("hidden"); checkbox.prop("checked", true); if (!sub_query_div.children().length) sub_query_div.append(this.getInitialSelectHtml(true)); } else { sub_query_div.addClass("hidden"); checkbox.prop("checked", false); } } } changeEvent(e) { let container = $(e.target).closest(".select_container"); let cls = container.attr("id"); if (e.target.closest(".aggregation_type_operator") || e.target.classList.contains("aggregation_type_operator")) { if (e.target.selectedIndex + 1 == DataSources.Enums.ExpressionType.Between) { $(e.target.closest(".whr_btw_wrapper")).find(".btw_wrapper").removeClass("hidden"); } else { $(e.target.closest(".whr_btw_wrapper")).find(".btw_wrapper").addClass("hidden"); } if (e.target.selectedIndex + 1 == DataSources.Enums.ExpressionType.IsNull || e.target.selectedIndex + 1 == DataSources.Enums.ExpressionType.IsNotNull) { $(e.target).next().addClass("hidden"); } else { $(e.target).next().removeClass("hidden"); } } else if (e.target.closest(".clause_expression_type") || e.target.classList.contains("clause_expression_type")) { if (e.target.selectedIndex + 1 == DataSources.Enums.ExpressionType.Between) { $(e.target.closest(".clause_wrapper")).find(".btw_wrapper").removeClass("hidden"); } else { $(e.target.closest(".clause_wrapper")).find(".btw_wrapper").addClass("hidden"); } if (e.target.selectedIndex + 1 == DataSources.Enums.ExpressionType.IsNull || e.target.selectedIndex + 1 == DataSources.Enums.ExpressionType.IsNotNull) { $(e.target).next().addClass("hidden"); } else { $(e.target).next().removeClass("hidden"); } } else if (e.target.closest(".clause_type") || e.target.classList.contains("clause_type")) { if (Number(e.target.value) == Unibase.Platform.DataSources.Enums.ClauseType.OrderBy) { $(e.target).closest(".clause_row").find(".clause_wrapper").html(this.getOrderByAggregationHtml()); } else if (Number(e.target.value) == Unibase.Platform.DataSources.Enums.ClauseType.GroupBy) { $(e.target).closest(".clause_row").find(".clause_wrapper").html(this.getGroupByClauseHtml()); } else if (Number(e.target.value) == Unibase.Platform.DataSources.Enums.ClauseType.Having) { $(e.target).closest(".clause_row").find(".clause_wrapper").html(this.getHavingClauseHtml()); } } else if (e.target.closest(".add_condition") || e.target.classList.contains("add_condition")) { let conditionRow = $(e.target).closest(".condition_row"); if (!conditionRow.next(".condition_row").length) { conditionRow.append(this.getCloseBtnHtml()); conditionRow.after(this.getWhereHtml(cls)); } } else if (e.target.closest(".add_having_clause") || e.target.classList.contains("add_having_clause")) { let currentClauseWrapper = $(e.target).closest(".clause_wrapper"); if (Number(e.target.value) != 0 && !currentClauseWrapper.next(".clause_wrapper").length) { currentClauseWrapper.after(this.getClauseWrapperWithHavingHtml()); } } else if (e.target.classList.contains("union_drop_down")) { if (Number(e.target.value) != 0 && !$(e.target).next(".select_container").length) { $(e.target).parent().append(this.getInitialSelectHtml(false, true)); } } } getIsSubOrUnionFromCls(cls) { let IsSub; let IsUni; let IsMain; if (cls) { if (cls.startsWith("main_")) IsMain = false; else if (cls.startsWith("sub_")) IsSub = true; else if (cls.startsWith("union_")) IsUni = true; } return { IsSubQuery: IsSub, IsUnionQuery: IsUni, IsMainQuery: IsMain }; } getOperatorSymbolFromText(text) { let returnString = ""; switch (text) { case "greater than": returnString = ">"; break; case "less than": returnString = "<"; break; case "equal to": returnString = "="; break; case "greater than equal to": returnString = ">="; break; case "less than equal to": returnString = "<="; break; case "not equal to": returnString = "!="; break; } return returnString ? returnString : text; } showError(message) { this.ErrorThrown = true; return MessageHelper.Instance().showError(message, 'bl-datalist_error'); } getCloseBtnHtml() { return ``; } getStarHtml(SelectContainerJqueryEle) { let dataListTables = []; let container_cls = SelectContainerJqueryEle.attr("id"); let tablesContainer = SelectContainerJqueryEle.find(".datalist_tables_container").first().children(); let html = ""; let isGlobalStartSelected; isGlobalStartSelected = SelectContainerJqueryEle.find("." + container_cls + ".query_star").first().prop("checked"); jQuery.each(tablesContainer, (index, column) => { let tableName = $(column).find(".table_name").val(); let aliasName = $(column).find(".alias_name").val(); if (!tableName && !aliasName) return; let table = { DocTableAliasName: aliasName ? aliasName : tableName, DocTypeTableName: tableName, IsMainTable: index == 0 ? true : false, IsSubQuery: false, IsStarSelected: index == 0 ? isGlobalStartSelected : false, }; dataListTables.push(table); }); for (var i = 0; i < dataListTables.length; i++) { html += `
${dataListTables[i].DocTableAliasName}
`; } return html; } generateDynamicQuery(SelectContainerEle) { let dataListColumns = []; let dataListJoins = []; let dataListTables = []; let dataListWhere = []; let dataListClause = []; let dynamicQuery; let select_cls = SelectContainerEle.attr("id"); let unionType = parseInt(SelectContainerEle.next().val()); let unionQuery; let isGlobalStartSelected = SelectContainerEle.find("." + select_cls + ".query_star").first().prop("checked"); let columnsContainer = SelectContainerEle.find("." + select_cls + ".datalist_column_container").first().children(); let tablesContainer = SelectContainerEle.find("." + select_cls + ".datalist_tables_container").first().children(); let whereContainer = SelectContainerEle.find("." + select_cls + ".datalist_where_container").first().find("." + select_cls + ".condition_row"); let clauseContainer = SelectContainerEle.find("." + select_cls + ".clause_container").first().children(".clause_row"); jQuery.each(columnsContainer, (index, column) => { let aliasName = $(column).find(".datalist_column_alias_name").val(); let columnName = $(column).find(".datalist_column_name").val(); if (index == 0 && !aliasName && !columnName) return; let newColumn = { ColumnName: columnName, AliasName: aliasName ? aliasName : columnName, }; if (!columnName) return; dataListColumns.push(newColumn); }); jQuery.each(tablesContainer, (index, column) => { let dynamicSubQuery; let joinType = $(column).find(".join_dropdown").val(); let tableName = $(column).find(".table_name").val(); let aliasName = $(column).find(".alias_name").val(); let table1_clmn = $(column).find(".join_table1_column").val(); let table2_clmn = $(column).find(".join_table2_column").val(); let is_subquery = $(column).find(".is_subquery").first().data("ischecked"); let is_star_selected = false; if (is_subquery) { let subQuerySelectContainer = $(column).children(".is_subquery_chk_box_wrapper").siblings(".sub_query_div").find(".select_container").first(); dynamicSubQuery = this.generateDynamicQuery(subQuerySelectContainer); } let JoinTable = { DocTypeTable1Column: table1_clmn, DocTypeTable2Column: table2_clmn }; let table = { DocTableAliasName: aliasName ? aliasName : tableName, DocTypeTableName: tableName, IsMainTable: index == 0 ? true : false, IsSubQuery: is_subquery, IsStarSelected: is_star_selected, SubQuery: dynamicSubQuery, }; table.IsStarSelected = SelectContainerEle.find("#" + table.DocTableAliasName + "_select_star").is(":checked"); let join = { DocTypeTableName: tableName, DocTableAliasName: aliasName, IsPrimaryKey: false, on: JoinTable, DocJoinType: Number(joinType) || 0, }; if (!table.DocTypeTableName) return; dataListTables.push(table); dataListJoins.push(join); }); jQuery.each(whereContainer, (index, column) => { let columnName = $(column).find(".aggregation_column_name").val(); let value1 = $(column).find(".value1").val(); let value2 = $(column).find(".value2").val(); let aggregation_type = $(column).find(".aggregation_type_operator option:selected").val(); let add_condition = $(column).find(".add_condition option:selected").val(); let isBetween = false; let isSubQuery = $(column).find(".where_subquery").data("ischecked"); let subQuery; Number(aggregation_type) == DataSources.Enums.ExpressionType.Between ? isBetween = true : isBetween = false; if (isSubQuery) { let container_ele = $(column).find(".sub_query_div .select_container").first(); subQuery = this.generateDynamicQuery(container_ele); } let where = { ColumnName: columnName, Value1: value1, Value2: value2, ExpressionType: Number(aggregation_type), IsBetween: isBetween, AddConditionType: Number(add_condition), IsSubQuery: isSubQuery, SubQuery: isSubQuery ? subQuery : null, }; if (!where.ColumnName) return; dataListWhere.push(where); }); jQuery.each(clauseContainer, (index, column) => { let clauseWrappers = $(column).children(".clause_wrapper"); let columns = $(column).find(".columns").val(); let clauseType = $(column).find(".clause_type").val(); let orderByType = $(column).find(".order_by_type").val(); let value1 = $(column).find(".value1").val(); let value2 = $(column).find(".value2").val(); let exp_type = $(column).find(".clause_expression_type option:selected").val(); let add_condition = $(column).find(".add_having_clause option:selected").val(); let isHaving = false; let isBetween = false; Number(clauseType) == DataSources.Enums.ClauseType.Having ? isHaving = true : isHaving = false; Number(exp_type) == DataSources.Enums.ExpressionType.Between ? isBetween = true : isBetween = false; let havingClauseArray = []; if (Number(clauseType) == DataSources.Enums.ClauseType.Having) { $.each(clauseWrappers, (i, ele) => { let column = $(ele).find(".column_name").val(); let value1 = $(ele).find(".value1").val(); let value2 = $(ele).find(".value2").val(); let exp_type = $(ele).find(".clause_expression_type option:selected").val(); let add_condition = $(ele).find(".add_having_clause option:selected").val(); Number(exp_type) == DataSources.Enums.ExpressionType.Between ? isBetween = true : isBetween = false; let havingClause; havingClause = { IsBetween: isBetween, Value1: value1, Value2: value2, ColumnName: column, AddConditionType: Number(add_condition), ExpressionType: Number(exp_type), IsSubQuery: false, SubQuery: null }; havingClauseArray.push(havingClause); }); } let clause = { ClauseType: Number(clauseType), Columns: columns, IsHaving: isHaving, OrderBy: Number(orderByType) || 0, Having: havingClauseArray, }; if ((!clause.IsHaving && !clause.Columns) || (clause.IsHaving && clause.Having.length && !clause.Having[0].ColumnName)) return; dataListClause.push(clause); }); if (!isGlobalStartSelected && !dataListColumns.length) return new DataSources.Requests.DynamicQuery(); if (this.ErrorThrown) return; dynamicQuery = { DataListColumns: dataListColumns, DataListDocTypes: dataListTables, DataListWhere: dataListWhere, DataListJoins: dataListJoins, DataListClause: dataListClause, IsStarSelected: isGlobalStartSelected, IsUnion: false, UnionType: 1, UnionQuery: null, TempName: null, }; if (unionType) { let unionElement = SelectContainerEle.next().next(); unionQuery = this.generateDynamicQuery(unionElement); dynamicQuery.IsUnion = true; dynamicQuery.UnionType = unionType; dynamicQuery.UnionQuery = unionQuery; } return dynamicQuery; } bindDynamicQuery(dynamic, SubQuery, IsUnion) { let queryCls = SubQuery ? ("sub_query_" + ($(".sub_query").length)) : "main_query"; if (IsUnion) queryCls = "union_query_" + ($(".union_query").length); var columnsContainer = $(`.${queryCls}.datalist_column_container`).children(); var tablesContainer = $(`.${queryCls}.datalist_tables_container`).children(); var whereContainer = $(`.${queryCls}.datalist_where_container`).find(`.${queryCls}.condition_row`); var clauseContainer = $(`.${queryCls}.clause_container`).children(`.clause_row`); for (var i = 0; i < dynamic.DataListColumns.length; i++) { $(columnsContainer[i]).find(".datalist_column_name").val(dynamic.DataListColumns[i].ColumnName); if ((dynamic.DataListColumns[i].AliasName != dynamic.DataListColumns[i].ColumnName)) $(columnsContainer[i]).find(".datalist_column_alias_name").val(dynamic.DataListColumns[i].AliasName); if (i != dynamic.DataListColumns.length - 1) { $(columnsContainer[i]).find(".add_datalist_column").click().trigger("mousedown"); columnsContainer = $(`.${queryCls}.datalist_column_container`).children(); } } for (var i = 0; i < dynamic.DataListJoins.length; i++) { $(tablesContainer[i]).find(".table_name").val(dynamic.DataListJoins[i].DocTypeTableName); if ((dynamic.DataListJoins[i].DocTableAliasName != dynamic.DataListJoins[i].DocTypeTableName)) $(tablesContainer[i]).find(".alias_name").val(dynamic.DataListJoins[i].DocTableAliasName); if (i != 0) { $(tablesContainer[i]).find(".join_table1_column").val(dynamic.DataListJoins[i].on.DocTypeTable1Column); $(tablesContainer[i]).find(".join_table2_column").val(dynamic.DataListJoins[i].on.DocTypeTable2Column); $(tablesContainer[i]).find(".join_dropdown").val(dynamic.DataListJoins[i].DocJoinType.toString()); } let table = dynamic.DataListDocTypes.find(x => x.DocTypeTableName == dynamic.DataListJoins[i].DocTypeTableName); if (table && table.IsSubQuery) { $(tablesContainer[i]).find(".is_subquery").click().trigger("mousedown"); this.bindDynamicQuery(table.SubQuery, true); } if (i != dynamic.DataListJoins.length - 1) { $(tablesContainer[i]).find(".add_join").first().click().trigger("mousedown"); tablesContainer = $(`.${queryCls}.datalist_tables_container`).children(); } } for (var i = 0; i < dynamic.DataListWhere.length; i++) { $(whereContainer[i]).find(".aggregation_type_operator").val(dynamic.DataListWhere[i].ExpressionType.toString()).trigger("change"); $(whereContainer[i]).find(".aggregation_column_name").val(dynamic.DataListWhere[i].ColumnName); $(whereContainer[i]).find(".value1").val(dynamic.DataListWhere[i].Value1); if (dynamic.DataListWhere[i].IsBetween) { $(whereContainer[i]).find(".value2").val(dynamic.DataListWhere[i].Value2); } if (i != dynamic.DataListWhere.length - 1) { $(whereContainer[i]).find(".add_condition").first().val(dynamic.DataListWhere[i].AddConditionType.toString()).trigger("change"); whereContainer = $(`.${queryCls}.datalist_where_container`).find(`.${queryCls}.condition_row`); } if (dynamic.DataListWhere[i].IsSubQuery) { $(whereContainer[i]).find(".where_subquery").first().click().trigger("mousedown"); this.bindDynamicQuery(dynamic.DataListWhere[i].SubQuery, true); } } for (var i = 0; i < dynamic.DataListClause.length; i++) { $(clauseContainer[i]).find(".clause_type").val(dynamic.DataListClause[i].ClauseType.toString()).trigger("change"); $(clauseContainer[i]).find(".columns").val(dynamic.DataListClause[i].Columns); if (dynamic.DataListClause[i].ClauseType == DataSources.Enums.ClauseType.OrderBy) { $(clauseContainer[i]).find(".order_by_type").val(dynamic.DataListClause[i].OrderBy.toString()); } else if (dynamic.DataListClause[i].ClauseType == DataSources.Enums.ClauseType.Having) { let clauseWrapper = $(clauseContainer[i]).find(".clause_wrapper"); let havings = dynamic.DataListClause[i].Having; for (var j = 0; j < havings.length; j++) { $(clauseWrapper[j]).find(".column_name").val(havings[j].ColumnName); $(clauseWrapper[j]).find(".clause_expression_type").val(havings[j].ExpressionType.toString()).trigger("change"); $(clauseWrapper[j]).find(".value1").val(havings[j].Value1); if (havings[j].IsBetween) $(clauseWrapper[j]).find(".value2").val(havings[j].Value2); if (i != havings.length - 1) { $(clauseWrapper[j]).find(".add_having_clause").val(havings[j].AddConditionType.toString()).trigger("change"); clauseWrapper = $(clauseContainer[i]).find(".clause_wrapper"); } } } if (i != dynamic.DataListClause.length - 1) { $(clauseContainer[i]).find(".add_clause").click().trigger("mousedown"); clauseContainer = $(`.${queryCls}.clause_container`).children(`.clause_row`); } } $(`.${queryCls} .get_tables_star`).first().click().trigger("mousedown"); for (var i = 0; i < dynamic.DataListDocTypes.length; i++) { if (dynamic.DataListDocTypes[i].IsStarSelected) { let radioClassName = dynamic.DataListDocTypes[i].DocTableAliasName ? dynamic.DataListDocTypes[i].DocTableAliasName : dynamic.DataListDocTypes[i].DocTypeTableName; $(`#${radioClassName}_select_star`).prop("checked", true); } } if (dynamic.IsStarSelected) $("." + queryCls + ".query_star").first().prop("checked", true); else $("." + queryCls + ".query_star").first().prop("checked", false); if (dynamic.IsUnion) { $("#" + queryCls).next().val(dynamic.UnionType).trigger("change"); this.bindDynamicQuery(dynamic.UnionQuery, false, true); } } parseQueryToDynamic(query) { let tempQuery = query; let tables = new Array(); let tempTables = new Array(); let columns = new Array(); let joinsArr = new Array(); let clauseArr = new Array(); let whereArr = new Array(); let dynamicQuery = new DataSources.Requests.DynamicQuery(); let sub_dynamicQuery = new DataSources.Requests.DynamicQuery(); let unionQuery = new DataSources.Requests.DynamicQuery(); let dynamicQueryArr = new Array(); tempQuery = tempQuery.toLowerCase().trim(); let selectStr = "select "; let whereStr = "where "; let openBrac = "("; let indexOfSelect = tempQuery.indexOf(selectStr); let indexOfFrom = tempQuery.indexOf("from "); let indexOfBrac; let remainingQuery = ""; let slctToFrom = ""; let fromToSubQuery = ""; let unionIdx; let unionAllIdx; let unionMinIdx; let whereIdx; let tableNames = []; slctToFrom = tempQuery.substring(indexOfSelect, indexOfFrom + 5); if (slctToFrom.includes(" *")) { dynamicQuery.IsStarSelected = true; slctToFrom = slctToFrom.replace("*", ""); tempQuery = tempQuery.replace("*", "").trim(); } columns = this.getDataListColumnsFromSelectString(slctToFrom); tempQuery = tempQuery.replace(slctToFrom, "").trim(); indexOfSelect = tempQuery.indexOf(selectStr); indexOfBrac = tempQuery.indexOf(openBrac); fromToSubQuery = tempQuery.substring(0, indexOfSelect - 1).trim(); remainingQuery = tempQuery; whereIdx = tempQuery.indexOf(whereStr); unionIdx = tempQuery.indexOf(" union") == -1 ? Infinity : tempQuery.indexOf(" union"); unionAllIdx = tempQuery.indexOf(" union all") == -1 ? Infinity : tempQuery.indexOf(" union all"); unionMinIdx = Math.min(unionIdx, unionAllIdx); if (indexOfBrac != -1 && indexOfSelect != -1) { if (indexOfBrac < indexOfSelect) { while (indexOfSelect != -1) { unionIdx = remainingQuery.indexOf(" union") == -1 ? Infinity : remainingQuery.indexOf(" union"); unionAllIdx = remainingQuery.indexOf(" union all") == -1 ? Infinity : remainingQuery.indexOf(" union all"); indexOfSelect = remainingQuery.indexOf(selectStr); indexOfBrac = remainingQuery.indexOf(openBrac); unionMinIdx = Math.min(unionIdx, unionAllIdx); if (whereIdx > indexOfSelect && unionMinIdx > indexOfSelect) { let table = new DataSources.Requests.DataListTable(); fromToSubQuery = remainingQuery.substring(0, indexOfSelect); remainingQuery = tempQuery.replace(fromToSubQuery, "").trim(); fromToSubQuery = fromToSubQuery.substring(0, fromToSubQuery.lastIndexOf(openBrac)).trim(); let sub_rmng_result = this.getSubQueryAndRmngQuery(remainingQuery); table.SubQuery = sub_rmng_result.SubDynamicQuery; table.DocTableAliasName = sub_rmng_result.SubQueryAliasName; table.DocTypeTableName = `__subquerytable_${++this.subQueryNumber}`; table.IsSubQuery = true; tables.push(table); remainingQuery = fromToSubQuery.trim() + ` __subquerytable_${this.subQueryNumber} ` + sub_rmng_result.RemainingQuery; } else if (whereIdx < indexOfSelect && unionMinIdx > indexOfSelect && unionMinIdx != Infinity) { let whereResult = this.getSubQueriesInWhere(remainingQuery); remainingQuery = whereResult.RemaingQuery; whereArr = whereArr.concat(whereResult.listOfWhere); } else if (indexOfSelect > unionMinIdx && unionMinIdx != Infinity && indexOfSelect != -1) { let unionResult = this.getUnionsAndRemainingQuery(remainingQuery); dynamicQuery.IsUnion = unionResult.IsUnion; dynamicQuery.UnionType = unionResult.UnionType; dynamicQuery.UnionQuery = unionResult.UnionQuery; remainingQuery = unionResult.CurrentRmngQuery; } indexOfSelect = remainingQuery.indexOf(selectStr); whereIdx = remainingQuery.indexOf(whereStr); (whereIdx == -1) && (whereIdx = Infinity); if (indexOfSelect != -1) { fromToSubQuery = remainingQuery.substring(0, indexOfSelect).trim(); tempQuery = remainingQuery.replace(fromToSubQuery, "").trim(); } } if (remainingQuery.length) { let result = this.getTablesJoinsClauses(remainingQuery); whereArr = whereArr.concat(result.Where); joinsArr = joinsArr.concat(result.Joins); clauseArr = clauseArr.concat(result.Clause); tables = tables.concat(result.Tables); } } else if (indexOfBrac < indexOfSelect) { } } else if (indexOfSelect != -1 && unionMinIdx != -1 && indexOfSelect > unionMinIdx) { let unionResult = this.getUnionsAndRemainingQuery(tempQuery); dynamicQuery.IsUnion = unionResult.IsUnion; dynamicQuery.UnionType = unionResult.UnionType; dynamicQuery.UnionQuery = unionResult.UnionQuery; remainingQuery = unionResult.CurrentRmngQuery; let result = this.getTablesJoinsClauses(remainingQuery); whereArr = whereArr.concat(result.Where); joinsArr = joinsArr.concat(result.Joins); clauseArr = clauseArr.concat(result.Clause); tables = tables.concat(result.Tables); } else if (indexOfSelect == -1) { let result = this.getTablesJoinsClauses(tempQuery); whereArr = whereArr.concat(result.Where); joinsArr = joinsArr.concat(result.Joins); clauseArr = clauseArr.concat(result.Clause); tables = tables.concat(result.Tables); } dynamicQuery.DataListDocTypes = tables; dynamicQuery.DataListWhere = whereArr; dynamicQuery.DataListColumns = columns; dynamicQuery.DataListJoins = joinsArr; dynamicQuery.DataListClause = clauseArr; dynamicQuery.TempName = ""; dynamicQuery.DataListJoins.forEach((x) => { if (x.DocTypeTableName.startsWith("__")) { if (x) tableNames.push(x.DocTypeTableName); } }); tempTables = Object.assign([], dynamicQuery.DataListDocTypes); dynamicQuery.DataListDocTypes.filter((x) => { for (var i = 0; i < tableNames.length; i++) { if (tableNames[i] == x.DocTypeTableName && !x.IsSubQuery) { var idx = tempTables.indexOf(x); if (x && idx != -1) tempTables.splice(idx, 1); } } }); dynamicQuery.DataListDocTypes = tempTables; for (var i = 0; i < dynamicQuery.DataListDocTypes.length; i++) { if (slctToFrom.includes(dynamicQuery.DataListDocTypes[i].DocTypeTableName + ".*") || slctToFrom.includes(dynamicQuery.DataListDocTypes[i].DocTableAliasName + ".*")) dynamicQuery.DataListDocTypes[i].IsStarSelected = true; } return dynamicQuery; } getSubQueryAndRmngQuery(tempQuery) { let selectString = "select "; let fromString = "from "; let openBrac = "("; let closingIndex; let subQuery = ""; let remainingQuery = ""; let fromToSubQuery = ""; let subQueryAliasName = ""; let whereIdx; let groubyIdx; let orderbyIdx; let havingIdx; let unionIdx; let unionAllIdx; let minIdx; let indexOfSelect = tempQuery.indexOf(selectString); let indexOfFrom = tempQuery.indexOf(fromString); let sub_dynamicQuery = new DataSources.Requests.DynamicQuery(); closingIndex = this.getIndexOfCorrespondingCloseBracket(tempQuery); subQuery = tempQuery.substring(0, closingIndex - 1); remainingQuery = tempQuery.substring(closingIndex, tempQuery.length).trim(); whereIdx = remainingQuery.indexOf(" where") == -1 ? Infinity : remainingQuery.indexOf(" where"); groubyIdx = remainingQuery.indexOf(" group by") == -1 ? Infinity : remainingQuery.indexOf(" group by"); orderbyIdx = remainingQuery.indexOf(" order by") == -1 ? Infinity : remainingQuery.indexOf(" order by"); havingIdx = remainingQuery.indexOf(" having") == -1 ? Infinity : remainingQuery.indexOf(" having"); unionIdx = remainingQuery.indexOf(" union") == -1 ? Infinity : remainingQuery.indexOf(" union"); unionAllIdx = remainingQuery.indexOf(" union all") == -1 ? Infinity : remainingQuery.indexOf(" union all"); minIdx = Math.min(whereIdx, groubyIdx, orderbyIdx, havingIdx, unionIdx, unionAllIdx); if (minIdx != Infinity) { let rmngSpltedQuery = remainingQuery.split(" "); let joinsArray = []; let lastRelation = ""; let keywords = Object.values(DataSources.Enums.RelationType).filter(x => typeof (x) == "string"); keywords = keywords.concat(Object.values(DataSources.Enums.UnionType).filter(x => typeof (x) == "string")); lastRelation = keywords.pop(); joinsArray = remainingQuery.split(lastRelation.toLowerCase()).map(x => x.trim()); for (var i = 0; i < keywords.length; i++) { for (var j = 0; j < joinsArray.length; j++) { let split = joinsArray[j].split(keywords[i].toLowerCase()).map(x => x.trim()); if (split.length > 1) { joinsArray.splice(j, 1); for (var k = 0; k < split.length; k++) { joinsArray.splice(j + k, 0, split[k]); } } } } if (rmngSpltedQuery[1] && rmngSpltedQuery[1].toLowerCase() == "on") { subQueryAliasName = rmngSpltedQuery[0]; } else if (joinsArray[0].split(" ").length == 1) subQueryAliasName = joinsArray[0]; else subQueryAliasName = remainingQuery.substring(0, minIdx).trim(); } else if (remainingQuery.length) { let andIdx = remainingQuery.indexOf("and ") == -1 ? Infinity : remainingQuery.indexOf("and "); let orIdx = remainingQuery.indexOf("or ") == -1 ? Infinity : remainingQuery.indexOf("or "); minIdx = Math.min(orIdx, andIdx); if (minIdx != Infinity && minIdx != 0) { subQueryAliasName = remainingQuery.substring(0, minIdx); } else if (remainingQuery.split(" ")[0].trim() == "as") { subQueryAliasName = remainingQuery.split(" ")[1]; } else if (minIdx != 0) subQueryAliasName = remainingQuery; } if (fromToSubQuery.length > 1 && fromToSubQuery != openBrac) remainingQuery = fromToSubQuery + remainingQuery; indexOfSelect = subQuery.indexOf(selectString); if (indexOfSelect != -1) { sub_dynamicQuery = this.parseQueryToDynamic(subQuery); } return { SubDynamicQuery: sub_dynamicQuery, RemainingQuery: remainingQuery, SubQueryAliasName: subQueryAliasName }; } getTablesJoinsClauses(tempQuery) { tempQuery = tempQuery.toLowerCase().trim(); let joinsArr = new Array(); let clauseArr = new Array(); let whereArr = new Array(); let tables = new Array(); let whereStr = "where "; let orderByStr = "order by"; let groupByStr = "group by"; let havingStr = "having "; let whereConditionStr = ""; let groupByConditionStr = ""; let havingConditionStr = ""; let orderByConditionStr = ""; let tablesQuery = ""; let joinsArray = []; let lastRelation = ""; let relations = Object.values(DataSources.Enums.RelationType).filter(x => typeof (x) == "string"); let whereIdx = tempQuery.indexOf(whereStr) == -1 ? Infinity : tempQuery.indexOf(whereStr); let groubyIdx = tempQuery.indexOf(groupByStr) == -1 ? Infinity : tempQuery.indexOf(groupByStr); let orderbyIdx = tempQuery.indexOf(orderByStr) == -1 ? Infinity : tempQuery.indexOf(orderByStr); let havingIdx = tempQuery.indexOf(havingStr) == -1 ? Infinity : tempQuery.indexOf(havingStr); let clauseIdx = Math.min(whereIdx, groubyIdx, orderbyIdx, havingIdx); if (clauseIdx != Infinity) tablesQuery = tempQuery.substring(0, clauseIdx); else tablesQuery = tempQuery; lastRelation = relations.pop(); joinsArray = tablesQuery.split(lastRelation.toLowerCase()).map(x => x.trim()); if (joinsArray.length > 1) { for (var i = 0; i < joinsArray.length; i++) { if (i && !joinsArray[i].startsWith("__")) { joinsArray[i] = `__Cross ` + joinsArray[i]; } } } for (var i = 0; i < relations.length; i++) { for (var j = 0; j < joinsArray.length; j++) { let split = joinsArray[j].split(relations[i].toLowerCase()).map(x => x.trim()); if (split.length > 1) { joinsArray.splice(j, 1); for (var k = 0; k < split.length; k++) { joinsArray.splice(j + k, 0, split[k]); } } } if (joinsArray.length > 1) { for (var j = 0; j < joinsArray.length; j++) { if (j && !joinsArray[j].startsWith("__")) { joinsArray[j] = `__${relations[i]} ` + joinsArray[j]; } } } } for (var j = 0; j < joinsArray.length; j++) { let currentEle = joinsArray[j]; let index = currentEle.indexOf(" join ", 8); if (index != -1) { joinsArray.splice(j + 1, 0, "__Inner" + currentEle.substring(index, currentEle.length)); joinsArray[j] = currentEle.substring(0, index); } } for (var j = 0; j < joinsArray.length; j++) { let table = new DataSources.Requests.DataListTable(); let join = new DataSources.Requests.DataListJoin(); let joinOn = new DataSources.Requests.DataListJoinOn(); if (!j) { let minIdx = Math.min(whereIdx, groubyIdx, orderbyIdx, havingIdx); if (minIdx != Infinity) joinsArray[j] = joinsArray[j].substring(0, minIdx); let tableArr = []; if (joinsArray[j].includes("(")) { tableArr = [joinsArray[j]]; } else { tableArr = joinsArray[j].split(" "); if (joinsArray[j].includes("as ")) tableArr = joinsArray[j].split("as ").map(x => x.trim()); } join.DocTypeTableName = tableArr[0]; join.DocTableAliasName = tableArr[1] ? tableArr[1] : tableArr[0]; table.DocTypeTableName = tableArr[0]; table.DocTableAliasName = tableArr[1] ? tableArr[1] : tableArr[0]; } else { if (joinsArray[j].includes("join ")) joinsArray[j] = joinsArray[j].replace("join ", ""); let joinType = joinsArray[j].split(" ")[0].slice(2); join.DocJoinType = parseInt(DataSources.Enums.RelationType[joinType]); joinsArray[j] = joinsArray[j].split(" ").slice(1).join(" "); let joinArr = joinsArray[j].split(" on "); let tableSplit = joinArr[0].split(" ").map(x => x.trim()); let tableColumnsSplit = joinArr[1].split("=").map(x => x.trim()); if (tableSplit.length == 2) { join.DocTypeTableName = tableSplit[0]; join.DocTableAliasName = tableSplit[1]; table.DocTypeTableName = tableSplit[0]; table.DocTableAliasName = tableSplit[1]; } else { join.DocTypeTableName = tableSplit[0]; join.DocTableAliasName = tableSplit[0]; table.DocTypeTableName = tableSplit[0]; table.DocTableAliasName = tableSplit[0]; } joinOn.DocTypeTable1Column = tableColumnsSplit[0]; joinOn.DocTypeTable2Column = tableColumnsSplit[1]; join.on = joinOn; } joinsArr.push(join); tables.push(table); } whereIdx = tempQuery.indexOf(whereStr) == -1 ? Infinity : tempQuery.indexOf(whereStr); groubyIdx = tempQuery.indexOf(groupByStr) == -1 ? Infinity : tempQuery.indexOf(groupByStr); orderbyIdx = tempQuery.indexOf(orderByStr) == -1 ? Infinity : tempQuery.indexOf(orderByStr); havingIdx = tempQuery.indexOf(havingStr) == -1 ? Infinity : tempQuery.indexOf(havingStr); if (whereIdx != Infinity) { let minIdx = Math.min(groubyIdx, orderbyIdx, havingIdx) == Infinity ? tempQuery.length : Math.min(groubyIdx, orderbyIdx, havingIdx); whereConditionStr = tempQuery.substring(whereIdx + 5, minIdx).trim(); whereArr = this.getWhereConditionsFromQuery(whereConditionStr); } if (groubyIdx != Infinity) { let clause = new DataSources.Requests.DataListClause(); let minIdx = Math.min(orderbyIdx, havingIdx) == Infinity ? tempQuery.length : Math.min(orderbyIdx, havingIdx); groupByConditionStr = tempQuery.substring(groubyIdx + 8, minIdx).trim(); clause.ClauseType = DataSources.Enums.ClauseType.GroupBy; clause.Columns = groupByConditionStr; clauseArr.push(clause); } if (havingIdx != Infinity) { let clause = new DataSources.Requests.DataListClause(); havingConditionStr = tempQuery.substring(havingIdx + 6, orderbyIdx == Infinity ? tempQuery.length : orderbyIdx).trim(); clause.ClauseType = DataSources.Enums.ClauseType.Having; clause.Columns = ""; clause.Having = this.getWhereConditionsFromQuery(whereConditionStr); clauseArr.push(clause); } if (orderbyIdx != Infinity) { let clause = new DataSources.Requests.DataListClause(); let orderByArr = Object.values(DataSources.Enums.OrderBy).filter(x => typeof (x) == "string"); orderByConditionStr = tempQuery.substring(orderbyIdx + 8, tempQuery.length).trim(); clause.ClauseType = DataSources.Enums.ClauseType.OrderBy; clause.Columns = orderByConditionStr; for (var i = 0; i < orderByArr.length; i++) { if (orderByConditionStr.includes(orderByArr[i].toLowerCase())) clause.OrderBy = parseInt(DataSources.Enums.OrderBy[orderByArr[i]]); } clauseArr.push(clause); } return { Tables: tables, Joins: joinsArr, Where: whereArr, Clause: clauseArr }; } getIndexOfCorrespondingCloseBracket(query) { let counter = 1; let openBrac = "("; let closeBrac = ")"; let index = 1; while (counter > 0) { let openIndex = query.indexOf(openBrac, index); let closeIndex = query.indexOf(closeBrac, index); if (openIndex != -1 && closeIndex != -1) { if (openIndex < closeIndex) { counter++; index = openIndex + 1; } else if (openIndex > closeIndex) { counter--; index = closeIndex + 1; } } else if (openIndex == -1 && closeIndex != -1) { counter--; index = closeIndex + 1; } else if (closeIndex == -1) { } } return index; } getDataListColumnsFromSelectString(query) { let columns = new Array(); let indexOfSelect = query.indexOf("select "); let indexOfFrom = query.indexOf("from "); let columnsStr = ""; if (indexOfSelect != -1 && indexOfFrom != -1) { columnsStr = query.trim().substring(indexOfSelect + 6, indexOfFrom).trim(); columnsStr.indexOf(",") == 0 && (columnsStr = columnsStr.slice(1)); columnsStr = this.removeParanthesisBetweenColumns(columnsStr); if (columnsStr.length) { let colsArray = columnsStr.trim().split(",").map(x => x.trim()); for (var i = 0; i < colsArray.length; i++) { let column = new DataSources.Requests.DataListColumn(); if (colsArray[i].includes(" as")) { let col_alias = colsArray[i].split(" as").map(x => x.trim()); column.ColumnName = col_alias[0]; column.AliasName = col_alias[1]; } else { let clmn = colsArray[i].trim(); column.ColumnName = clmn; column.AliasName = clmn; } columns.push(column); } } } columns = this.addParanthesisBtwColumns(columns); return columns; } getWhereConditionsFromQuery(query) { query = query.trim().toLowerCase(); let splitedArray = this.getWhereQueryAsConditionsArray(query); let WhereArr = new Array(); for (var i = 0; i < splitedArray.length; i++) { let where = new DataSources.Requests.DataListWhere(); if (i) { let clmnSplit = splitedArray[i].split(" "); clmnSplit.shift(); splitedArray[i] = clmnSplit.join(" "); } if (splitedArray[i].includes("between ")) { let split = splitedArray[i].split(" "); where.ColumnName = split[0]; where.IsBetween = true; where.Value1 = split[2]; where.Value2 = split[4]; where.ExpressionType = DataSources.Enums.ExpressionType.Between; } else if (splitedArray[i].includes(">=")) { let split = splitedArray[i].split(">="); where.ColumnName = split[0].trim(); where.Value1 = split[1].trim(); where.ExpressionType = DataSources.Enums.ExpressionType.GreaterThanEqualTo; } else if (splitedArray[i].includes("<=")) { let split = splitedArray[i].split("<="); where.ColumnName = split[0].trim(); where.Value1 = split[1].trim(); where.ExpressionType = DataSources.Enums.ExpressionType.LessThanEqualTo; } else if (splitedArray[i].includes("!=")) { let split = splitedArray[i].split("!="); where.ColumnName = split[0].trim(); where.Value1 = split[1].trim(); where.ExpressionType = DataSources.Enums.ExpressionType.NotEqualTo; } else if (splitedArray[i].includes(">")) { let split = splitedArray[i].split(">"); where.ColumnName = split[0].trim(); where.Value1 = split[1].trim(); where.ExpressionType = DataSources.Enums.ExpressionType.GreaterThan; } else if (splitedArray[i].includes("<")) { let split = splitedArray[i].split("<"); where.ColumnName = split[0].trim(); where.Value1 = split[1].trim(); where.ExpressionType = DataSources.Enums.ExpressionType.LessThan; } else if (splitedArray[i].includes("=")) { let split = splitedArray[i].split("="); where.ColumnName = split[0].trim(); where.Value1 = split[1].trim(); where.ExpressionType = DataSources.Enums.ExpressionType.EqualTo; } else if (splitedArray[i].includes("not in ")) { let split = splitedArray[i].split("not in "); where.ColumnName = split[0].trim(); where.Value1 = split[1].trim(); where.ExpressionType = DataSources.Enums.ExpressionType.NotIn; } else if (splitedArray[i].includes(" in")) { let split = splitedArray[i].split(" in"); if (split.length > 2) split[1] = split.slice(1).join(" "); where.ColumnName = split[0].trim(); where.Value1 = split[1].trim(); where.ExpressionType = DataSources.Enums.ExpressionType.In; } else if (splitedArray[i].includes("is not")) { let split = splitedArray[i].split("is not"); where.ColumnName = split[0].trim(); where.Value1 = split[1].trim(); where.ExpressionType = DataSources.Enums.ExpressionType.IsNotNull; } else if (splitedArray[i].includes(" is")) { let split = splitedArray[i].split(" is"); where.ColumnName = split[0].trim(); where.Value1 = split[1].trim(); where.ExpressionType = DataSources.Enums.ExpressionType.IsNull; } if (i + 1 < splitedArray.length) { where.AddConditionType = DataSources.Enums.ConditionJoinType[(splitedArray[i + 1].split(" ").shift().slice(2))]; } WhereArr.push(where); } return WhereArr; } removeParanthesisBetweenColumns(columnsStr) { let openPranStr = "("; let indexOfOpenPranthesis = columnsStr.indexOf(openPranStr); let indexOfClosedParan = -1; let strBtwnParanthesis = ""; let modifiedStr = ""; let tempStr = ""; while (indexOfOpenPranthesis != -1) { tempStr = columnsStr.substring(indexOfOpenPranthesis + 1, columnsStr.length); indexOfClosedParan = this.getIndexOfCorrespondingCloseBracket(tempStr); strBtwnParanthesis = columnsStr.substring(indexOfOpenPranthesis, indexOfOpenPranthesis + indexOfClosedParan + 1); modifiedStr = strBtwnParanthesis.replaceAll(openPranStr, "_& "); modifiedStr = modifiedStr.replaceAll(",", "__"); modifiedStr = modifiedStr.replaceAll(")", " &_"); columnsStr = columnsStr.replace(strBtwnParanthesis, modifiedStr); indexOfOpenPranthesis = columnsStr.indexOf(openPranStr); } return columnsStr; } addParanthesisBtwColumns(columns) { for (var i = 0; i < columns.length; i++) { let colname = columns[i].ColumnName; let aliasName = columns[i].AliasName; if (colname.includes("_& ")) { colname = colname.replaceAll("_& ", "("); colname = colname.replaceAll("__", ","); colname = colname.replaceAll(" &_", ")"); aliasName = aliasName.replaceAll("_& ", "("); aliasName = aliasName.replaceAll("__", ","); aliasName = aliasName.replaceAll(" &_", ")"); columns[i].ColumnName = colname; columns[i].AliasName = aliasName; } } return columns; } getUnionsAndRemainingQuery(tempQuery) { tempQuery = tempQuery.trim(); let unionQuery; let currentRmngQuery = ""; let newUnionQuery = ""; let unionIdx; let unionAllIdx; let unionType; let isUnion; unionAllIdx = tempQuery.indexOf(" union all") == -1 ? Infinity : tempQuery.indexOf(" union all"); unionIdx = tempQuery.indexOf(" union") == -1 ? Infinity : tempQuery.indexOf(" union"); if (unionIdx < unionAllIdx) { currentRmngQuery = tempQuery.substring(0, unionIdx); newUnionQuery = tempQuery.substring(unionIdx + 6, tempQuery.length); unionType = DataSources.Enums.UnionType.Union; } else if (unionIdx > unionAllIdx) { currentRmngQuery = tempQuery.substring(0, unionAllIdx); newUnionQuery = tempQuery.substring(unionAllIdx + 10, tempQuery.length); unionType = DataSources.Enums.UnionType.UnionAll; } unionQuery = this.parseQueryToDynamic(newUnionQuery); isUnion = true; return { UnionType: unionType, IsUnion: isUnion, UnionQuery: unionQuery, CurrentRmngQuery: currentRmngQuery }; } getWhereQueryAsConditionsArray(query) { var splitArray = query.split("and "); var keywords = ["and ", "or "]; if (splitArray.length > 1) { for (var i = 0; i < splitArray.length; i++) { if (i && !splitArray[i].startsWith("__")) { splitArray[i] = `__And ` + splitArray[i]; } } } keywords.shift(); for (var i = 0; i < keywords.length; i++) { for (var j = 0; j < splitArray.length; j++) { let split = splitArray[j].split((keywords[i]).toLowerCase()).map(x => x.trim()); if (split.length > 1) { splitArray.splice(j, 1); for (var k = 0; k < split.length; k++) { splitArray.splice(j + k, 0, split[k]); } } } for (var k = 0; k < splitArray.length; k++) { if (k && !splitArray[k].startsWith("__")) { splitArray[k] = `__Or ` + splitArray[k]; } } } splitArray = splitArray.map(x => x.trim()); for (var i = 0; i < splitArray.length; i++) { if (splitArray[i].includes("between ")) { let nextElemntArr = splitArray[i + 1].split(" "); nextElemntArr.shift(); splitArray[i + 1] = nextElemntArr.map(x => x.trim()).join(" "); splitArray[i] = splitArray[i] + " and " + splitArray[i + 1]; splitArray.splice(i + 1, 1); } } return splitArray; } someFn(joinArr) { if (joinArr.length == 3 && joinArr[2].includes("=")) { let tablesSeperatedArr = joinArr[2].split("="); joinArr.splice(2, 1); for (var l = 0; l < tablesSeperatedArr.length; l++) { joinArr.push(tablesSeperatedArr[l]); if (!l) joinArr.push("="); } } else if (joinArr.length == 4 && joinArr[2].includes("=")) { joinArr[2] = joinArr[2].replace("=", ""); joinArr.splice(3, 0, "="); } else if (joinArr.length == 4 && joinArr[3].includes("=")) { joinArr[3] = joinArr[3].replace("=", ""); joinArr.splice(3, 0, "="); } else if (joinArr.length == 4 && joinArr[3].includes("=")) { let tablesSeperatedArr = joinArr[3].split("="); joinArr.splice(3, 1); for (var l = 0; l < tablesSeperatedArr.length; l++) { joinArr.push(tablesSeperatedArr[l]); if (!l) joinArr.push("="); } } else if (joinArr.length == 4 && joinArr[2].includes("=")) { joinArr[2] = joinArr[2].replace("=", ""); joinArr.splice(3, 0, "="); } else if (joinArr.length == 4 && joinArr[3].includes("=")) { joinArr[3] = joinArr[3].replace("=", ""); joinArr.splice(3, 0, "="); } return joinArr; } getSubQueriesInWhere(clauseQuery) { clauseQuery = clauseQuery.trim(); let whereIdx; let groubyIdx; let orderbyIdx; let havingIdx; let clauseIdx; let unionIdx; let whereQuery = ""; let queryBfWhr = ""; let tempQuery = ""; let closingIdx; let selectIdx; let subQueryStr = ""; let whereInitialStr = ""; let otherClauseQuery = ""; let subQueryArr = []; let whereArr = []; selectIdx = clauseQuery.indexOf("select "); while (selectIdx != -1) { let subquery = new DataSources.Requests.DynamicQuery(); whereInitialStr = clauseQuery.substring(0, selectIdx).trim(); whereInitialStr = whereInitialStr.substring(0, whereInitialStr.lastIndexOf("(")).trim(); tempQuery = clauseQuery.substring(selectIdx, clauseQuery.length); closingIdx = this.getIndexOfCorrespondingCloseBracket(tempQuery); subQueryStr = tempQuery.substring(0, closingIdx - 1); clauseQuery = tempQuery.substring(closingIdx, tempQuery.length).trim(); selectIdx = subQueryStr.indexOf("select "); if (selectIdx != -1) { subquery = this.parseQueryToDynamic(subQueryStr); } clauseQuery = whereInitialStr + ` __subquerytable_${++this.subQueryNumber} ` + clauseQuery; selectIdx = clauseQuery.indexOf("select "); unionIdx = clauseQuery.indexOf("union "); if (unionIdx < selectIdx) selectIdx = -1; subquery.TempName = `__subquerytable_${this.subQueryNumber}`; subQueryArr.push(subquery); } groubyIdx = clauseQuery.indexOf("group by") == -1 ? Infinity : clauseQuery.indexOf("group by"); orderbyIdx = clauseQuery.indexOf("order by") == -1 ? Infinity : clauseQuery.indexOf("order by"); havingIdx = clauseQuery.indexOf("having ") == -1 ? Infinity : clauseQuery.indexOf("having "); unionIdx = clauseQuery.indexOf("union ") == -1 ? Infinity : clauseQuery.indexOf("union "); clauseIdx = Math.min(groubyIdx, orderbyIdx, havingIdx, unionIdx); whereIdx = clauseQuery.indexOf("where "); if (clauseIdx != Infinity) { whereQuery = clauseQuery.substring(clauseQuery.indexOf("where ") + 6, clauseIdx); otherClauseQuery = clauseQuery.substring(clauseIdx, clauseQuery.length); } else { whereQuery = clauseQuery.substring(clauseQuery.indexOf("where ") + 6, clauseQuery.length); } whereQuery = whereQuery.trim(); let idx = whereQuery.indexOf("("); if (idx == 0) { let clseIdx = this.getIndexOfCorrespondingCloseBracket(whereQuery.slice(idx)); whereQuery = whereQuery.substring(0, clseIdx - 1).slice(idx + 1).trim(); } queryBfWhr = clauseQuery.substring(0, whereIdx); otherClauseQuery = otherClauseQuery.replace(whereQuery, "").trim(); otherClauseQuery = queryBfWhr + otherClauseQuery; whereArr = this.getWhereConditionsFromQuery(whereQuery); for (var i = 0; i < whereArr.length; i++) { let subQuery = subQueryArr.find(x => x.TempName == whereArr[i].Value1); if (subQuery) { whereArr[i].IsSubQuery = true; whereArr[i].SubQuery = subQuery; } } return { listOfWhere: whereArr, RemaingQuery: otherClauseQuery }; } static Instance() { if (this.instance === undefined) { this.instance = new QueryParser(); } return this.instance; } } Components.QueryParser = QueryParser; })(Components = DataSources.Components || (DataSources.Components = {})); })(DataSources = Platform.DataSources || (Platform.DataSources = {})); })(Platform = Unibase.Platform || (Unibase.Platform = {})); })(Unibase || (Unibase = {}));