Built files from Bizgaze WebServer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

queryparser.js 97KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466
  1. var Unibase;
  2. (function (Unibase) {
  3. let Platform;
  4. (function (Platform) {
  5. let DataSources;
  6. (function (DataSources) {
  7. let Components;
  8. (function (Components) {
  9. class QueryParser extends Unibase.Platform.Core.BaseComponent {
  10. constructor() {
  11. super(...arguments);
  12. this.ErrorThrown = false;
  13. this.starCount = 0;
  14. }
  15. getInitialSelectHtml(SubQuery, Union) {
  16. Union && (SubQuery = true);
  17. let sub_query_cls = this.getContainerClass(SubQuery, Union);
  18. let cls = (SubQuery ? Union ? (sub_query_cls + " union_query") : (sub_query_cls + " sub_query") : "main_query");
  19. return `<div class="${cls} select_container" id= "${sub_query_cls}">
  20. <a class="btn remove_btn ${!SubQuery && "hidden"} pull-right" href="javascript:;"><i class="las la-times font-18"></i></a>
  21. <div class='initialselect_div row'>
  22. <div class="row star_container ${sub_query_cls}">
  23. <strong>select * </strong>
  24. <div class="custom-control custom-checkbox checkbox-primary ml-10">
  25. <input type="checkbox" class="custom-control-input ${sub_query_cls} query_star" id="query_select_star_${++this.starCount}" checked="">
  26. <label class="custom-control-label" for="query_select_star_${this.starCount}"></label>
  27. </div>
  28. <div class="tables_star_container row">
  29. </div>
  30. <a href="javascript:;" class="get_tables_star"> refresh tables star's </a>
  31. <a class="btn remove_btn ${!SubQuery && "hidden"}" href="javascript:;"><i class="las la-times font-18"></i></a>
  32. </div>
  33. </div>
  34. <div class="datalist_column_container ${sub_query_cls} row">
  35. ${this.getAddColumnHtml()}
  36. </div>
  37. <div class="datalist_tables_container ${sub_query_cls}" >
  38. ${this.getTableHtml()}
  39. </div>
  40. <div class="datalist_where_container row mt-40 ${sub_query_cls}">
  41. ${this.getInitialWhereHtml(sub_query_cls)}
  42. </div>
  43. <div class="datalist_ord_grp_hav_container row mt-40 ${sub_query_cls}">
  44. ${this.getInitialClauseHtml(sub_query_cls)}
  45. </div>
  46. </div>
  47. ${this.getUnionDropDwnHtml()}`;
  48. }
  49. getContainerClass(SubQuery, Union) {
  50. let sub_query_cls = "sub_query_" + ($(".sub_query").length + 1);
  51. if (!SubQuery && !Union)
  52. sub_query_cls = "main_query";
  53. else if (Union) {
  54. Union && (SubQuery = true);
  55. sub_query_cls = "union_query_" + ($(".union_query").length + 1);
  56. }
  57. return sub_query_cls;
  58. }
  59. getAddColumnHtml() {
  60. return ` <div class='datalist_column row col-6'>
  61. <input type="text" class="form-control col-5 datalist_column_name" placeholder="Column Name">
  62. <strong class="">As</strong>
  63. <input type="text" class="form-control col-2 datalist_column_alias_name" placeholder="Alias Name">
  64. <button class="btn btn-icon btn-secondary add_datalist_column">
  65. <span class="btn-icon-wrap"><i class="icon-plus"></i></span></button>
  66. </div>`;
  67. }
  68. getTableHtml() {
  69. return `<div class='datalist_tablename_container row'>
  70. <strong>from</strong>
  71. <input type="text" class="form-control col-5 table_name" placeholder="Table Name">
  72. <div class="custom-control is_subquery_chk_box_wrapper custom-checkbox checkbox-primary ml-10">
  73. <input type="checkbox" class="custom-control-input is_subquery" id="is_subquery_${++this.starCount}" data-ischecked=false>
  74. <label class="custom-control-label" for="is_subquery_${this.starCount}"></label>
  75. </div>
  76. <strong>As</strong>
  77. <input type="text" class="form-control col-3 alias_name" placeholder="Alias Name">
  78. <button class="btn btn-icon btn-secondary add_join">
  79. <span class="btn-icon-wrap"><i class="icon-plus"></i></span>
  80. </button>
  81. <div class="sub_query_div hidden w-100" ></div>
  82. </div>`;
  83. }
  84. getJoinDropDown() {
  85. return `<select class="form-control custom-select join_dropdown col-1">
  86. <option value="1" selected>Inner Join</option>
  87. <option value="2">Outer Join</option>
  88. <option value="3">Left Join</option>
  89. <option value="4">Full JOin</option>
  90. <option value="5">Right Join</option>
  91. <option value="6">Cross Join</option>
  92. </select>`;
  93. }
  94. getJoinHtml() {
  95. return `<div class="join_row row">
  96. <select class="form-control custom-select join_dropdown col-1">
  97. <option value="1" selected>Inner Join</option>
  98. <option value="2">Outer Join</option>
  99. <option value="3">Left Join</option>
  100. <option value="4">Full JOin</option>
  101. <option value="5">Right Join</option>
  102. <option value="6">Cross Join</option>
  103. </select>
  104. <input type="text" class="form-control table_name col-2" placeholder="Join table">
  105. <div class="custom-control is_subquery_chk_box_wrapper custom-checkbox checkbox-primary ml-10">
  106. <input type="checkbox" class="custom-control-input is_subquery" id="is_subquery_${++this.starCount}" data-ischecked=false >
  107. <label class="custom-control-label" for="is_subquery_${this.starCount}"></label>
  108. </div>
  109. <strong>As</strong>
  110. <input type="text" class="form-control alias_name col-1" placeholder="Alias Name">
  111. <strong>on</strong>
  112. <input type="text" class="form-control join_table1_column col-2" placeholder="Condition">
  113. <strong>=</strong>
  114. <input type="text" class="form-control join_table2_column col-2" placeholder="Condition">
  115. <button class="btn btn-icon btn-secondary add_join">
  116. <span class="btn-icon-wrap"><i class="icon-plus"></i></span>
  117. </button>
  118. <div class="sub_query_div hidden w-100" ></div>
  119. </div>`;
  120. }
  121. getInitialWhereHtml(cls) {
  122. return `<div class="div_where_container ${cls}">
  123. <strong>Where </strong>
  124. ${this.getWhereHtml(cls)}
  125. </div>`;
  126. }
  127. getWhereHtml(cls) {
  128. return ` <div class ='condition_row ${cls} row'>
  129. <input type="text" class="form-control col-3 aggregation_column_name" placeholder="Column Name">
  130. <div class="whr_btw_wrapper row col-7">
  131. <select class="form-control custom-select aggregation_type_operator col-3">
  132. <option value="1" selected>Equal to</option>
  133. <option value="2">Greater Than</option>
  134. <option value="3">Less Than</option>
  135. <option value="4">Between</option>
  136. <option value="5">Greater Than Equal to</option>
  137. <option value="6">Less Than Equal to</option>
  138. <option value="7">Not Equal to</option>
  139. <option value="8">Less Than Column</option>
  140. <option value="9">Greater Than Column</option>
  141. <option value="10">In</option>
  142. <option value="11">Not In</option>
  143. <option value="12">Is Null</option>
  144. <option value="13">!Is Null</option>
  145. </select>
  146. <input type="text" class="form-control col-4 value1" placeholder="Enter Value">
  147. ${this.getBetweenHtml()}
  148. <div class="custom-control where_subquery_wrapper custom-checkbox checkbox-primary ml-10">
  149. <input type="checkbox" class="custom-control-input where_subquery" id="is_subquery_${++this.starCount}"" data-ischecked="false">
  150. <label class="custom-control-label" for="is_subquery_${this.starCount}""></label>
  151. </div>
  152. </div>
  153. <select class="form-control custom-select add_condition col-1">
  154. <option value="0" selected>Add Conditon</option>
  155. <option value="1">And</option>
  156. <option value="2">Or</option>
  157. </select>
  158. <div class="sub_query_div hidden w-100" ></div>
  159. </div>`;
  160. }
  161. getBetweenHtml() {
  162. return `<div class="btw_wrapper row hidden col-5"> <strong>And</strong>
  163. <input type="text" class="form-control col-10 value2" placeholder="Enter Value">
  164. </div>`;
  165. }
  166. getInitialClauseHtml(cls) {
  167. return `<div class="clause_container ${cls} col-12" >
  168. <strong>Clause</strong>
  169. ${this.getClauseHtml()}
  170. </div>`;
  171. }
  172. getClauseDwnHtml() {
  173. return `<select class="form-control custom-select clause_type col-1">
  174. <option value="1">Order by</option>
  175. <option value="2">Group by</option>
  176. <option value="3">Having</option>
  177. </select>`;
  178. }
  179. getClauseHtml() {
  180. return `<div class="clause_row row">
  181. ${this.getClauseDwnHtml()}
  182. <div class="clause_wrapper row col-8">
  183. ${this.getOrderByAggregationHtml()}
  184. </div>
  185. <button class="btn btn-icon btn-secondary add_clause">
  186. <span class="btn-icon-wrap"><i class="icon-plus"></i></span>
  187. </button>
  188. </div>`;
  189. }
  190. getClauseWrapperWithHavingHtml() {
  191. return ` <div class="clause_wrapper row col-8">
  192. ${this.getHavingClauseHtml()}
  193. </div>`;
  194. }
  195. getOrderByAggregationHtml() {
  196. return `<input type="text" class="form-control col-8 columns" placeholder="columns seperated by (,)">
  197. <select class="form-control custom-select order_by_type col-2">
  198. <option value="1" selected>Asc</option>
  199. <option value="2">Desc</option>
  200. </select>`;
  201. }
  202. getGroupByClauseHtml() {
  203. return `<input type="text" class="form-control col-8 columns" placeholder="columns seperated by (,)">`;
  204. }
  205. getHavingClauseHtml() {
  206. return `<input type="text" class="form-control col-2 column_name" placeholder="Enter Column">
  207. <select class="form-control custom-select clause_expression_type col-2">
  208. <option value="1" selected>Equal to</option>
  209. <option value="2">Greater Than</option>
  210. <option value="3">Less Than</option>
  211. <option value="4">Between</option>
  212. <option value="5">Greater Than Equal to</option>
  213. <option value="6">Less Than Equal to</option>
  214. <option value="7">Not Equal to</option>
  215. <option value="8">Less Than Column</option>
  216. <option value="9">Greater Than Column</option>
  217. <option value="10">In</option>
  218. <option value="11">Not In</option>
  219. <option value="12">Is Null</option>
  220. <option value="13">!Is Null</option>
  221. </select>
  222. <input type="text" class="form-control col-2 value1" placeholder="Enter Value">
  223. ${this.getBetweenHtml()}
  224. <select class="form-control custom-select add_having_clause col-1">
  225. <option value="0" selected>Add Having</option>
  226. <option value="1">And</option>
  227. <option value="2">Or</option>
  228. </select>
  229. `;
  230. }
  231. getUnionDropDwnHtml() {
  232. return `<select class="form-control custom-select union_drop_down col-1">
  233. <option value="0" selected>select</option>
  234. <option value="1"> Union </option>
  235. <option value="2"> Union All </option>
  236. </select>`;
  237. }
  238. mouseDown(e) {
  239. let container = $(e.target).closest(".select_container");
  240. let container_cls = container.attr("id");
  241. if (e.target.closest(".add_datalist_column") || e.target.classList.contains("add_datalist_column")) {
  242. container.find(`.${container_cls}.datalist_column_container`).first().children().last().find('.add_datalist_column').addClass("hidden");
  243. container.find(`.${container_cls}.datalist_column_container`).first().children().last().append(this.getCloseBtnHtml());
  244. container.find(`.${container_cls}.datalist_column_container`).first().append(this.getAddColumnHtml());
  245. }
  246. else if (e.target.closest(".remove_btn") || e.target.classList.contains("remove_btn")) {
  247. let datalistColumnRow = $(e.target).closest(".datalist_column");
  248. let joinRow = $(e.target).closest(".join_row");
  249. let conditionRow = $(e.target).closest(".condition_row");
  250. let clauseRow = $(e.target).closest(".clause_row");
  251. let initialSelect = $(e.target).closest(".initialselect_div").first();
  252. let subquery = $(e.target).closest(".sub_query").first();
  253. let subQueryDiv = $(e.target).closest(".sub_query_div").first();
  254. if (datalistColumnRow.length)
  255. datalistColumnRow.remove();
  256. else if (clauseRow.length)
  257. clauseRow.remove();
  258. else if (joinRow.length)
  259. joinRow.remove();
  260. else if (conditionRow.length)
  261. conditionRow.remove();
  262. else if (initialSelect.length) {
  263. initialSelect.parent().next().remove();
  264. initialSelect.parent().prev().val("0");
  265. initialSelect.parent().remove();
  266. if (!subQueryDiv.children().length) {
  267. subQueryDiv.addClass("hidden");
  268. }
  269. }
  270. else if (subquery.length && !datalistColumnRow.length && !clauseRow.length && !joinRow.length && !conditionRow.length && !initialSelect.length) {
  271. subQueryDiv.empty().addClass("hidden");
  272. }
  273. }
  274. else if (e.target.closest(".add_join") || e.target.classList.contains("add_join")) {
  275. $(e.target).closest(".join_row").append(this.getCloseBtnHtml());
  276. $(e.target).closest(".add_join").remove();
  277. container.find(`.${container_cls}.datalist_tables_container`).first().append(this.getJoinHtml());
  278. }
  279. else if (e.target.closest(".add_clause") || e.target.classList.contains("add_clause")) {
  280. $(e.target).closest(".clause_row").append(this.getCloseBtnHtml());
  281. container.find(`.${container_cls}.clause_container`).first().append(this.getClauseHtml());
  282. $(e.target).closest(".add_clause").remove();
  283. }
  284. else if (e.target.classList.contains("get_tables_star")) {
  285. let element;
  286. let clst_sub_query = $(e.target).closest(".sub_query");
  287. let clst_main_query = $(e.target).closest("#main_query");
  288. let clst_union_query = $(e.target).closest(".union_query");
  289. if (clst_union_query.length) {
  290. element = clst_union_query;
  291. }
  292. else if (clst_sub_query.length) {
  293. element = clst_sub_query;
  294. }
  295. else if (clst_main_query.length) {
  296. element = clst_main_query;
  297. }
  298. $(e.target).prev().html(this.getStarHtml(element));
  299. }
  300. else if (e.target.closest(".is_subquery_chk_box_wrapper") || e.target.classList.contains("is_subquery")) {
  301. let checkbox = $(e.target).siblings(".is_subquery").length ? $(e.target).siblings(".is_subquery") : $(e.target).closest(".is_subquery");
  302. let checkbox_wrapper = $(e.target).closest(".is_subquery_chk_box_wrapper");
  303. let is_subquery = !checkbox.data("ischecked");
  304. let sub_query_div = checkbox_wrapper.siblings(".sub_query_div");
  305. checkbox.data("ischecked", is_subquery);
  306. if (is_subquery) {
  307. sub_query_div.removeClass("hidden");
  308. if (!sub_query_div.children().length)
  309. sub_query_div.append(this.getInitialSelectHtml(true));
  310. }
  311. else {
  312. sub_query_div.addClass("hidden");
  313. }
  314. }
  315. else if (e.target.closest(".where_subquery_wrapper") || e.target.classList.contains("where_subquery")) {
  316. let checkbox = $(e.target).siblings(".where_subquery").length ? $(e.target).siblings(".where_subquery") : $(e.target).closest(".where_subquery");
  317. let checkbox_wrapper = $(e.target).closest(".where_subquery_wrapper");
  318. let is_subquery = !checkbox.data("ischecked");
  319. let sub_query_div = checkbox_wrapper.parent().siblings(".sub_query_div");
  320. checkbox.data("ischecked", is_subquery);
  321. if (is_subquery) {
  322. sub_query_div.removeClass("hidden");
  323. checkbox.prop("checked", true);
  324. if (!sub_query_div.children().length)
  325. sub_query_div.append(this.getInitialSelectHtml(true));
  326. }
  327. else {
  328. sub_query_div.addClass("hidden");
  329. checkbox.prop("checked", false);
  330. }
  331. }
  332. }
  333. changeEvent(e) {
  334. let container = $(e.target).closest(".select_container");
  335. let cls = container.attr("id");
  336. if (e.target.closest(".aggregation_type_operator") || e.target.classList.contains("aggregation_type_operator")) {
  337. if (e.target.selectedIndex + 1 == DataSources.Enums.ExpressionType.Between) {
  338. $(e.target.closest(".whr_btw_wrapper")).find(".btw_wrapper").removeClass("hidden");
  339. }
  340. else {
  341. $(e.target.closest(".whr_btw_wrapper")).find(".btw_wrapper").addClass("hidden");
  342. }
  343. if (e.target.selectedIndex + 1 == DataSources.Enums.ExpressionType.IsNull || e.target.selectedIndex + 1 == DataSources.Enums.ExpressionType.IsNotNull) {
  344. $(e.target).next().addClass("hidden");
  345. }
  346. else {
  347. $(e.target).next().removeClass("hidden");
  348. }
  349. }
  350. else if (e.target.closest(".clause_expression_type") || e.target.classList.contains("clause_expression_type")) {
  351. if (e.target.selectedIndex + 1 == DataSources.Enums.ExpressionType.Between) {
  352. $(e.target.closest(".clause_wrapper")).find(".btw_wrapper").removeClass("hidden");
  353. }
  354. else {
  355. $(e.target.closest(".clause_wrapper")).find(".btw_wrapper").addClass("hidden");
  356. }
  357. if (e.target.selectedIndex + 1 == DataSources.Enums.ExpressionType.IsNull || e.target.selectedIndex + 1 == DataSources.Enums.ExpressionType.IsNotNull) {
  358. $(e.target).next().addClass("hidden");
  359. }
  360. else {
  361. $(e.target).next().removeClass("hidden");
  362. }
  363. }
  364. else if (e.target.closest(".clause_type") || e.target.classList.contains("clause_type")) {
  365. if (Number(e.target.value) == Unibase.Platform.DataSources.Enums.ClauseType.OrderBy) {
  366. $(e.target).closest(".clause_row").find(".clause_wrapper").html(this.getOrderByAggregationHtml());
  367. }
  368. else if (Number(e.target.value) == Unibase.Platform.DataSources.Enums.ClauseType.GroupBy) {
  369. $(e.target).closest(".clause_row").find(".clause_wrapper").html(this.getGroupByClauseHtml());
  370. }
  371. else if (Number(e.target.value) == Unibase.Platform.DataSources.Enums.ClauseType.Having) {
  372. $(e.target).closest(".clause_row").find(".clause_wrapper").html(this.getHavingClauseHtml());
  373. }
  374. }
  375. else if (e.target.closest(".add_condition") || e.target.classList.contains("add_condition")) {
  376. let conditionRow = $(e.target).closest(".condition_row");
  377. if (!conditionRow.next(".condition_row").length) {
  378. conditionRow.append(this.getCloseBtnHtml());
  379. conditionRow.after(this.getWhereHtml(cls));
  380. }
  381. }
  382. else if (e.target.closest(".add_having_clause") || e.target.classList.contains("add_having_clause")) {
  383. let currentClauseWrapper = $(e.target).closest(".clause_wrapper");
  384. if (Number(e.target.value) != 0 && !currentClauseWrapper.next(".clause_wrapper").length) {
  385. currentClauseWrapper.after(this.getClauseWrapperWithHavingHtml());
  386. }
  387. }
  388. else if (e.target.classList.contains("union_drop_down")) {
  389. if (Number(e.target.value) != 0 && !$(e.target).next(".select_container").length) {
  390. $(e.target).parent().append(this.getInitialSelectHtml(false, true));
  391. }
  392. }
  393. }
  394. getIsSubOrUnionFromCls(cls) {
  395. let IsSub;
  396. let IsUni;
  397. let IsMain;
  398. if (cls) {
  399. if (cls.startsWith("main_"))
  400. IsMain = false;
  401. else if (cls.startsWith("sub_"))
  402. IsSub = true;
  403. else if (cls.startsWith("union_"))
  404. IsUni = true;
  405. }
  406. return { IsSubQuery: IsSub, IsUnionQuery: IsUni, IsMainQuery: IsMain };
  407. }
  408. getOperatorSymbolFromText(text) {
  409. let returnString = "";
  410. switch (text) {
  411. case "greater than":
  412. returnString = ">";
  413. break;
  414. case "less than":
  415. returnString = "<";
  416. break;
  417. case "equal to":
  418. returnString = "=";
  419. break;
  420. case "greater than equal to":
  421. returnString = ">=";
  422. break;
  423. case "less than equal to":
  424. returnString = "<=";
  425. break;
  426. case "not equal to":
  427. returnString = "!=";
  428. break;
  429. }
  430. return returnString ? returnString : text;
  431. }
  432. showError(message) {
  433. this.ErrorThrown = true;
  434. return MessageHelper.Instance().showError(message, 'bl-datalist_error');
  435. }
  436. getCloseBtnHtml() {
  437. return `<a class="btn remove_btn" href="javascript:;"><i class="las la-times font-18"></i></a>`;
  438. }
  439. getStarHtml(SelectContainerJqueryEle) {
  440. let dataListTables = [];
  441. let container_cls = SelectContainerJqueryEle.attr("id");
  442. let tablesContainer = SelectContainerJqueryEle.find(".datalist_tables_container").first().children();
  443. let html = "";
  444. let isGlobalStartSelected;
  445. isGlobalStartSelected = SelectContainerJqueryEle.find("." + container_cls + ".query_star").first().prop("checked");
  446. jQuery.each(tablesContainer, (index, column) => {
  447. let tableName = $(column).find(".table_name").val();
  448. let aliasName = $(column).find(".alias_name").val();
  449. if (!tableName && !aliasName)
  450. return;
  451. let table = {
  452. DocTableAliasName: aliasName ? aliasName : tableName,
  453. DocTypeTableName: tableName,
  454. IsMainTable: index == 0 ? true : false,
  455. IsSubQuery: false,
  456. IsStarSelected: index == 0 ? isGlobalStartSelected : false,
  457. };
  458. dataListTables.push(table);
  459. });
  460. for (var i = 0; i < dataListTables.length; i++) {
  461. html += `<div class="select_star_wrapper"><strong>${dataListTables[i].DocTableAliasName}</strong>
  462. <div class="custom-control custom-checkbox checkbox-primary ml-10">
  463. <input type="checkbox" class="custom-control-input table_star" id="${(dataListTables[i].DocTableAliasName + "_select_star")}" >
  464. <label class="custom-control-label" for="${(dataListTables[i].DocTableAliasName + "_select_star")}"></label>
  465. </div></div>`;
  466. }
  467. return html;
  468. }
  469. generateDynamicQuery(SelectContainerEle) {
  470. let dataListColumns = [];
  471. let dataListJoins = [];
  472. let dataListTables = [];
  473. let dataListWhere = [];
  474. let dataListClause = [];
  475. let dynamicQuery;
  476. let select_cls = SelectContainerEle.attr("id");
  477. let unionType = parseInt(SelectContainerEle.next().val());
  478. let unionQuery;
  479. let isGlobalStartSelected = SelectContainerEle.find("." + select_cls + ".query_star").first().prop("checked");
  480. let columnsContainer = SelectContainerEle.find("." + select_cls + ".datalist_column_container").first().children();
  481. let tablesContainer = SelectContainerEle.find("." + select_cls + ".datalist_tables_container").first().children();
  482. let whereContainer = SelectContainerEle.find("." + select_cls + ".datalist_where_container").first().find("." + select_cls + ".condition_row");
  483. let clauseContainer = SelectContainerEle.find("." + select_cls + ".clause_container").first().children(".clause_row");
  484. jQuery.each(columnsContainer, (index, column) => {
  485. let aliasName = $(column).find(".datalist_column_alias_name").val();
  486. let columnName = $(column).find(".datalist_column_name").val();
  487. if (index == 0 && !aliasName && !columnName)
  488. return;
  489. let newColumn = {
  490. ColumnName: columnName,
  491. AliasName: aliasName ? aliasName : columnName,
  492. };
  493. if (!columnName)
  494. return;
  495. dataListColumns.push(newColumn);
  496. });
  497. jQuery.each(tablesContainer, (index, column) => {
  498. let dynamicSubQuery;
  499. let joinType = $(column).find(".join_dropdown").val();
  500. let tableName = $(column).find(".table_name").val();
  501. let aliasName = $(column).find(".alias_name").val();
  502. let table1_clmn = $(column).find(".join_table1_column").val();
  503. let table2_clmn = $(column).find(".join_table2_column").val();
  504. let is_subquery = $(column).find(".is_subquery").first().data("ischecked");
  505. let is_star_selected = false;
  506. if (is_subquery) {
  507. let subQuerySelectContainer = $(column).children(".is_subquery_chk_box_wrapper").siblings(".sub_query_div").find(".select_container").first();
  508. dynamicSubQuery = this.generateDynamicQuery(subQuerySelectContainer);
  509. }
  510. let JoinTable = {
  511. DocTypeTable1Column: table1_clmn,
  512. DocTypeTable2Column: table2_clmn
  513. };
  514. let table = {
  515. DocTableAliasName: aliasName ? aliasName : tableName,
  516. DocTypeTableName: tableName,
  517. IsMainTable: index == 0 ? true : false,
  518. IsSubQuery: is_subquery,
  519. IsStarSelected: is_star_selected,
  520. SubQuery: dynamicSubQuery,
  521. };
  522. table.IsStarSelected = SelectContainerEle.find("#" + table.DocTableAliasName + "_select_star").is(":checked");
  523. let join = {
  524. DocTypeTableName: tableName,
  525. DocTableAliasName: aliasName,
  526. IsPrimaryKey: false,
  527. on: JoinTable,
  528. DocJoinType: Number(joinType) || 0,
  529. };
  530. if (!table.DocTypeTableName)
  531. return;
  532. dataListTables.push(table);
  533. dataListJoins.push(join);
  534. });
  535. jQuery.each(whereContainer, (index, column) => {
  536. let columnName = $(column).find(".aggregation_column_name").val();
  537. let value1 = $(column).find(".value1").val();
  538. let value2 = $(column).find(".value2").val();
  539. let aggregation_type = $(column).find(".aggregation_type_operator option:selected").val();
  540. let add_condition = $(column).find(".add_condition option:selected").val();
  541. let isBetween = false;
  542. let isSubQuery = $(column).find(".where_subquery").data("ischecked");
  543. let subQuery;
  544. Number(aggregation_type) == DataSources.Enums.ExpressionType.Between ? isBetween = true : isBetween = false;
  545. if (isSubQuery) {
  546. let container_ele = $(column).find(".sub_query_div .select_container").first();
  547. subQuery = this.generateDynamicQuery(container_ele);
  548. }
  549. let where = {
  550. ColumnName: columnName,
  551. Value1: value1,
  552. Value2: value2,
  553. ExpressionType: Number(aggregation_type),
  554. IsBetween: isBetween,
  555. AddConditionType: Number(add_condition),
  556. IsSubQuery: isSubQuery,
  557. SubQuery: isSubQuery ? subQuery : null,
  558. };
  559. if (!where.ColumnName)
  560. return;
  561. dataListWhere.push(where);
  562. });
  563. jQuery.each(clauseContainer, (index, column) => {
  564. let clauseWrappers = $(column).children(".clause_wrapper");
  565. let columns = $(column).find(".columns").val();
  566. let clauseType = $(column).find(".clause_type").val();
  567. let orderByType = $(column).find(".order_by_type").val();
  568. let value1 = $(column).find(".value1").val();
  569. let value2 = $(column).find(".value2").val();
  570. let exp_type = $(column).find(".clause_expression_type option:selected").val();
  571. let add_condition = $(column).find(".add_having_clause option:selected").val();
  572. let isHaving = false;
  573. let isBetween = false;
  574. Number(clauseType) == DataSources.Enums.ClauseType.Having ? isHaving = true : isHaving = false;
  575. Number(exp_type) == DataSources.Enums.ExpressionType.Between ? isBetween = true : isBetween = false;
  576. let havingClauseArray = [];
  577. if (Number(clauseType) == DataSources.Enums.ClauseType.Having) {
  578. $.each(clauseWrappers, (i, ele) => {
  579. let column = $(ele).find(".column_name").val();
  580. let value1 = $(ele).find(".value1").val();
  581. let value2 = $(ele).find(".value2").val();
  582. let exp_type = $(ele).find(".clause_expression_type option:selected").val();
  583. let add_condition = $(ele).find(".add_having_clause option:selected").val();
  584. Number(exp_type) == DataSources.Enums.ExpressionType.Between ? isBetween = true : isBetween = false;
  585. let havingClause;
  586. havingClause = {
  587. IsBetween: isBetween,
  588. Value1: value1,
  589. Value2: value2,
  590. ColumnName: column,
  591. AddConditionType: Number(add_condition),
  592. ExpressionType: Number(exp_type),
  593. IsSubQuery: false,
  594. SubQuery: null
  595. };
  596. havingClauseArray.push(havingClause);
  597. });
  598. }
  599. let clause = {
  600. ClauseType: Number(clauseType),
  601. Columns: columns,
  602. IsHaving: isHaving,
  603. OrderBy: Number(orderByType) || 0,
  604. Having: havingClauseArray,
  605. };
  606. if ((!clause.IsHaving && !clause.Columns) || (clause.IsHaving && clause.Having.length && !clause.Having[0].ColumnName))
  607. return;
  608. dataListClause.push(clause);
  609. });
  610. if (!isGlobalStartSelected && !dataListColumns.length)
  611. return new DataSources.Requests.DynamicQuery();
  612. if (this.ErrorThrown)
  613. return;
  614. dynamicQuery = {
  615. DataListColumns: dataListColumns,
  616. DataListDocTypes: dataListTables,
  617. DataListWhere: dataListWhere,
  618. DataListJoins: dataListJoins,
  619. DataListClause: dataListClause,
  620. IsStarSelected: isGlobalStartSelected,
  621. IsUnion: false,
  622. UnionType: 1,
  623. UnionQuery: null,
  624. TempName: null,
  625. };
  626. if (unionType) {
  627. let unionElement = SelectContainerEle.next().next();
  628. unionQuery = this.generateDynamicQuery(unionElement);
  629. dynamicQuery.IsUnion = true;
  630. dynamicQuery.UnionType = unionType;
  631. dynamicQuery.UnionQuery = unionQuery;
  632. }
  633. return dynamicQuery;
  634. }
  635. bindDynamicQuery(dynamic, SubQuery, IsUnion) {
  636. let queryCls = SubQuery ? ("sub_query_" + ($(".sub_query").length)) : "main_query";
  637. if (IsUnion)
  638. queryCls = "union_query_" + ($(".union_query").length);
  639. var columnsContainer = $(`.${queryCls}.datalist_column_container`).children();
  640. var tablesContainer = $(`.${queryCls}.datalist_tables_container`).children();
  641. var whereContainer = $(`.${queryCls}.datalist_where_container`).find(`.${queryCls}.condition_row`);
  642. var clauseContainer = $(`.${queryCls}.clause_container`).children(`.clause_row`);
  643. for (var i = 0; i < dynamic.DataListColumns.length; i++) {
  644. $(columnsContainer[i]).find(".datalist_column_name").val(dynamic.DataListColumns[i].ColumnName);
  645. if ((dynamic.DataListColumns[i].AliasName != dynamic.DataListColumns[i].ColumnName))
  646. $(columnsContainer[i]).find(".datalist_column_alias_name").val(dynamic.DataListColumns[i].AliasName);
  647. if (i != dynamic.DataListColumns.length - 1) {
  648. $(columnsContainer[i]).find(".add_datalist_column").click().trigger("mousedown");
  649. columnsContainer = $(`.${queryCls}.datalist_column_container`).children();
  650. }
  651. }
  652. for (var i = 0; i < dynamic.DataListJoins.length; i++) {
  653. $(tablesContainer[i]).find(".table_name").val(dynamic.DataListJoins[i].DocTypeTableName);
  654. if ((dynamic.DataListJoins[i].DocTableAliasName != dynamic.DataListJoins[i].DocTypeTableName))
  655. $(tablesContainer[i]).find(".alias_name").val(dynamic.DataListJoins[i].DocTableAliasName);
  656. if (i != 0) {
  657. $(tablesContainer[i]).find(".join_table1_column").val(dynamic.DataListJoins[i].on.DocTypeTable1Column);
  658. $(tablesContainer[i]).find(".join_table2_column").val(dynamic.DataListJoins[i].on.DocTypeTable2Column);
  659. $(tablesContainer[i]).find(".join_dropdown").val(dynamic.DataListJoins[i].DocJoinType.toString());
  660. }
  661. let table = dynamic.DataListDocTypes.find(x => x.DocTypeTableName == dynamic.DataListJoins[i].DocTypeTableName);
  662. if (table && table.IsSubQuery) {
  663. $(tablesContainer[i]).find(".is_subquery").click().trigger("mousedown");
  664. this.bindDynamicQuery(table.SubQuery, true);
  665. }
  666. if (i != dynamic.DataListJoins.length - 1) {
  667. $(tablesContainer[i]).find(".add_join").first().click().trigger("mousedown");
  668. tablesContainer = $(`.${queryCls}.datalist_tables_container`).children();
  669. }
  670. }
  671. for (var i = 0; i < dynamic.DataListWhere.length; i++) {
  672. $(whereContainer[i]).find(".aggregation_type_operator").val(dynamic.DataListWhere[i].ExpressionType.toString()).trigger("change");
  673. $(whereContainer[i]).find(".aggregation_column_name").val(dynamic.DataListWhere[i].ColumnName);
  674. $(whereContainer[i]).find(".value1").val(dynamic.DataListWhere[i].Value1);
  675. if (dynamic.DataListWhere[i].IsBetween) {
  676. $(whereContainer[i]).find(".value2").val(dynamic.DataListWhere[i].Value2);
  677. }
  678. if (i != dynamic.DataListWhere.length - 1) {
  679. $(whereContainer[i]).find(".add_condition").first().val(dynamic.DataListWhere[i].AddConditionType.toString()).trigger("change");
  680. whereContainer = $(`.${queryCls}.datalist_where_container`).find(`.${queryCls}.condition_row`);
  681. }
  682. if (dynamic.DataListWhere[i].IsSubQuery) {
  683. $(whereContainer[i]).find(".where_subquery").first().click().trigger("mousedown");
  684. this.bindDynamicQuery(dynamic.DataListWhere[i].SubQuery, true);
  685. }
  686. }
  687. for (var i = 0; i < dynamic.DataListClause.length; i++) {
  688. $(clauseContainer[i]).find(".clause_type").val(dynamic.DataListClause[i].ClauseType.toString()).trigger("change");
  689. $(clauseContainer[i]).find(".columns").val(dynamic.DataListClause[i].Columns);
  690. if (dynamic.DataListClause[i].ClauseType == DataSources.Enums.ClauseType.OrderBy) {
  691. $(clauseContainer[i]).find(".order_by_type").val(dynamic.DataListClause[i].OrderBy.toString());
  692. }
  693. else if (dynamic.DataListClause[i].ClauseType == DataSources.Enums.ClauseType.Having) {
  694. let clauseWrapper = $(clauseContainer[i]).find(".clause_wrapper");
  695. let havings = dynamic.DataListClause[i].Having;
  696. for (var j = 0; j < havings.length; j++) {
  697. $(clauseWrapper[j]).find(".column_name").val(havings[j].ColumnName);
  698. $(clauseWrapper[j]).find(".clause_expression_type").val(havings[j].ExpressionType.toString()).trigger("change");
  699. $(clauseWrapper[j]).find(".value1").val(havings[j].Value1);
  700. if (havings[j].IsBetween)
  701. $(clauseWrapper[j]).find(".value2").val(havings[j].Value2);
  702. if (i != havings.length - 1) {
  703. $(clauseWrapper[j]).find(".add_having_clause").val(havings[j].AddConditionType.toString()).trigger("change");
  704. clauseWrapper = $(clauseContainer[i]).find(".clause_wrapper");
  705. }
  706. }
  707. }
  708. if (i != dynamic.DataListClause.length - 1) {
  709. $(clauseContainer[i]).find(".add_clause").click().trigger("mousedown");
  710. clauseContainer = $(`.${queryCls}.clause_container`).children(`.clause_row`);
  711. }
  712. }
  713. $(`.${queryCls} .get_tables_star`).first().click().trigger("mousedown");
  714. for (var i = 0; i < dynamic.DataListDocTypes.length; i++) {
  715. if (dynamic.DataListDocTypes[i].IsStarSelected) {
  716. let radioClassName = dynamic.DataListDocTypes[i].DocTableAliasName ? dynamic.DataListDocTypes[i].DocTableAliasName : dynamic.DataListDocTypes[i].DocTypeTableName;
  717. $(`#${radioClassName}_select_star`).prop("checked", true);
  718. }
  719. }
  720. if (dynamic.IsStarSelected)
  721. $("." + queryCls + ".query_star").first().prop("checked", true);
  722. else
  723. $("." + queryCls + ".query_star").first().prop("checked", false);
  724. if (dynamic.IsUnion) {
  725. $("#" + queryCls).next().val(dynamic.UnionType).trigger("change");
  726. this.bindDynamicQuery(dynamic.UnionQuery, false, true);
  727. }
  728. }
  729. parseQueryToDynamic(query) {
  730. let tempQuery = query;
  731. let tables = new Array();
  732. let tempTables = new Array();
  733. let columns = new Array();
  734. let joinsArr = new Array();
  735. let clauseArr = new Array();
  736. let whereArr = new Array();
  737. let dynamicQuery = new DataSources.Requests.DynamicQuery();
  738. let sub_dynamicQuery = new DataSources.Requests.DynamicQuery();
  739. let unionQuery = new DataSources.Requests.DynamicQuery();
  740. let dynamicQueryArr = new Array();
  741. tempQuery = tempQuery.toLowerCase().trim();
  742. let selectStr = "select ";
  743. let whereStr = "where ";
  744. let openBrac = "(";
  745. let indexOfSelect = tempQuery.indexOf(selectStr);
  746. let indexOfFrom = tempQuery.indexOf("from ");
  747. let indexOfBrac;
  748. let remainingQuery = "";
  749. let slctToFrom = "";
  750. let fromToSubQuery = "";
  751. let unionIdx;
  752. let unionAllIdx;
  753. let unionMinIdx;
  754. let whereIdx;
  755. let tableNames = [];
  756. slctToFrom = tempQuery.substring(indexOfSelect, indexOfFrom + 5);
  757. if (slctToFrom.includes(" *")) {
  758. dynamicQuery.IsStarSelected = true;
  759. slctToFrom = slctToFrom.replace("*", "");
  760. tempQuery = tempQuery.replace("*", "").trim();
  761. }
  762. columns = this.getDataListColumnsFromSelectString(slctToFrom);
  763. tempQuery = tempQuery.replace(slctToFrom, "").trim();
  764. indexOfSelect = tempQuery.indexOf(selectStr);
  765. indexOfBrac = tempQuery.indexOf(openBrac);
  766. fromToSubQuery = tempQuery.substring(0, indexOfSelect - 1).trim();
  767. remainingQuery = tempQuery;
  768. whereIdx = tempQuery.indexOf(whereStr);
  769. unionIdx = tempQuery.indexOf(" union") == -1 ? Infinity : tempQuery.indexOf(" union");
  770. unionAllIdx = tempQuery.indexOf(" union all") == -1 ? Infinity : tempQuery.indexOf(" union all");
  771. unionMinIdx = Math.min(unionIdx, unionAllIdx);
  772. if (indexOfBrac != -1 && indexOfSelect != -1) {
  773. if (indexOfBrac < indexOfSelect) {
  774. while (indexOfSelect != -1) {
  775. unionIdx = remainingQuery.indexOf(" union") == -1 ? Infinity : remainingQuery.indexOf(" union");
  776. unionAllIdx = remainingQuery.indexOf(" union all") == -1 ? Infinity : remainingQuery.indexOf(" union all");
  777. indexOfSelect = remainingQuery.indexOf(selectStr);
  778. indexOfBrac = remainingQuery.indexOf(openBrac);
  779. unionMinIdx = Math.min(unionIdx, unionAllIdx);
  780. if (whereIdx > indexOfSelect && unionMinIdx > indexOfSelect) {
  781. let table = new DataSources.Requests.DataListTable();
  782. fromToSubQuery = remainingQuery.substring(0, indexOfSelect);
  783. remainingQuery = tempQuery.replace(fromToSubQuery, "").trim();
  784. fromToSubQuery = fromToSubQuery.substring(0, fromToSubQuery.lastIndexOf(openBrac)).trim();
  785. let sub_rmng_result = this.getSubQueryAndRmngQuery(remainingQuery);
  786. table.SubQuery = sub_rmng_result.SubDynamicQuery;
  787. table.DocTableAliasName = sub_rmng_result.SubQueryAliasName;
  788. table.DocTypeTableName = `__subquerytable_${++this.subQueryNumber}`;
  789. table.IsSubQuery = true;
  790. tables.push(table);
  791. remainingQuery = fromToSubQuery.trim() + ` __subquerytable_${this.subQueryNumber} ` + sub_rmng_result.RemainingQuery;
  792. }
  793. else if (whereIdx < indexOfSelect && unionMinIdx > indexOfSelect && unionMinIdx != Infinity) {
  794. let whereResult = this.getSubQueriesInWhere(remainingQuery);
  795. remainingQuery = whereResult.RemaingQuery;
  796. whereArr = whereArr.concat(whereResult.listOfWhere);
  797. }
  798. else if (indexOfSelect > unionMinIdx && unionMinIdx != Infinity && indexOfSelect != -1) {
  799. let unionResult = this.getUnionsAndRemainingQuery(remainingQuery);
  800. dynamicQuery.IsUnion = unionResult.IsUnion;
  801. dynamicQuery.UnionType = unionResult.UnionType;
  802. dynamicQuery.UnionQuery = unionResult.UnionQuery;
  803. remainingQuery = unionResult.CurrentRmngQuery;
  804. }
  805. indexOfSelect = remainingQuery.indexOf(selectStr);
  806. whereIdx = remainingQuery.indexOf(whereStr);
  807. (whereIdx == -1) && (whereIdx = Infinity);
  808. if (indexOfSelect != -1) {
  809. fromToSubQuery = remainingQuery.substring(0, indexOfSelect).trim();
  810. tempQuery = remainingQuery.replace(fromToSubQuery, "").trim();
  811. }
  812. }
  813. if (remainingQuery.length) {
  814. let result = this.getTablesJoinsClauses(remainingQuery);
  815. whereArr = whereArr.concat(result.Where);
  816. joinsArr = joinsArr.concat(result.Joins);
  817. clauseArr = clauseArr.concat(result.Clause);
  818. tables = tables.concat(result.Tables);
  819. }
  820. }
  821. else if (indexOfBrac < indexOfSelect) {
  822. }
  823. }
  824. else if (indexOfSelect != -1 && unionMinIdx != -1 && indexOfSelect > unionMinIdx) {
  825. let unionResult = this.getUnionsAndRemainingQuery(tempQuery);
  826. dynamicQuery.IsUnion = unionResult.IsUnion;
  827. dynamicQuery.UnionType = unionResult.UnionType;
  828. dynamicQuery.UnionQuery = unionResult.UnionQuery;
  829. remainingQuery = unionResult.CurrentRmngQuery;
  830. let result = this.getTablesJoinsClauses(remainingQuery);
  831. whereArr = whereArr.concat(result.Where);
  832. joinsArr = joinsArr.concat(result.Joins);
  833. clauseArr = clauseArr.concat(result.Clause);
  834. tables = tables.concat(result.Tables);
  835. }
  836. else if (indexOfSelect == -1) {
  837. let result = this.getTablesJoinsClauses(tempQuery);
  838. whereArr = whereArr.concat(result.Where);
  839. joinsArr = joinsArr.concat(result.Joins);
  840. clauseArr = clauseArr.concat(result.Clause);
  841. tables = tables.concat(result.Tables);
  842. }
  843. dynamicQuery.DataListDocTypes = tables;
  844. dynamicQuery.DataListWhere = whereArr;
  845. dynamicQuery.DataListColumns = columns;
  846. dynamicQuery.DataListJoins = joinsArr;
  847. dynamicQuery.DataListClause = clauseArr;
  848. dynamicQuery.TempName = "";
  849. dynamicQuery.DataListJoins.forEach((x) => {
  850. if (x.DocTypeTableName.startsWith("__")) {
  851. if (x)
  852. tableNames.push(x.DocTypeTableName);
  853. }
  854. });
  855. tempTables = Object.assign([], dynamicQuery.DataListDocTypes);
  856. dynamicQuery.DataListDocTypes.filter((x) => {
  857. for (var i = 0; i < tableNames.length; i++) {
  858. if (tableNames[i] == x.DocTypeTableName && !x.IsSubQuery) {
  859. var idx = tempTables.indexOf(x);
  860. if (x && idx != -1)
  861. tempTables.splice(idx, 1);
  862. }
  863. }
  864. });
  865. dynamicQuery.DataListDocTypes = tempTables;
  866. for (var i = 0; i < dynamicQuery.DataListDocTypes.length; i++) {
  867. if (slctToFrom.includes(dynamicQuery.DataListDocTypes[i].DocTypeTableName + ".*") || slctToFrom.includes(dynamicQuery.DataListDocTypes[i].DocTableAliasName + ".*"))
  868. dynamicQuery.DataListDocTypes[i].IsStarSelected = true;
  869. }
  870. return dynamicQuery;
  871. }
  872. getSubQueryAndRmngQuery(tempQuery) {
  873. let selectString = "select ";
  874. let fromString = "from ";
  875. let openBrac = "(";
  876. let closingIndex;
  877. let subQuery = "";
  878. let remainingQuery = "";
  879. let fromToSubQuery = "";
  880. let subQueryAliasName = "";
  881. let whereIdx;
  882. let groubyIdx;
  883. let orderbyIdx;
  884. let havingIdx;
  885. let unionIdx;
  886. let unionAllIdx;
  887. let minIdx;
  888. let indexOfSelect = tempQuery.indexOf(selectString);
  889. let indexOfFrom = tempQuery.indexOf(fromString);
  890. let sub_dynamicQuery = new DataSources.Requests.DynamicQuery();
  891. closingIndex = this.getIndexOfCorrespondingCloseBracket(tempQuery);
  892. subQuery = tempQuery.substring(0, closingIndex - 1);
  893. remainingQuery = tempQuery.substring(closingIndex, tempQuery.length).trim();
  894. whereIdx = remainingQuery.indexOf(" where") == -1 ? Infinity : remainingQuery.indexOf(" where");
  895. groubyIdx = remainingQuery.indexOf(" group by") == -1 ? Infinity : remainingQuery.indexOf(" group by");
  896. orderbyIdx = remainingQuery.indexOf(" order by") == -1 ? Infinity : remainingQuery.indexOf(" order by");
  897. havingIdx = remainingQuery.indexOf(" having") == -1 ? Infinity : remainingQuery.indexOf(" having");
  898. unionIdx = remainingQuery.indexOf(" union") == -1 ? Infinity : remainingQuery.indexOf(" union");
  899. unionAllIdx = remainingQuery.indexOf(" union all") == -1 ? Infinity : remainingQuery.indexOf(" union all");
  900. minIdx = Math.min(whereIdx, groubyIdx, orderbyIdx, havingIdx, unionIdx, unionAllIdx);
  901. if (minIdx != Infinity) {
  902. let rmngSpltedQuery = remainingQuery.split(" ");
  903. let joinsArray = [];
  904. let lastRelation = "";
  905. let keywords = Object.values(DataSources.Enums.RelationType).filter(x => typeof (x) == "string");
  906. keywords = keywords.concat(Object.values(DataSources.Enums.UnionType).filter(x => typeof (x) == "string"));
  907. lastRelation = keywords.pop();
  908. joinsArray = remainingQuery.split(lastRelation.toLowerCase()).map(x => x.trim());
  909. for (var i = 0; i < keywords.length; i++) {
  910. for (var j = 0; j < joinsArray.length; j++) {
  911. let split = joinsArray[j].split(keywords[i].toLowerCase()).map(x => x.trim());
  912. if (split.length > 1) {
  913. joinsArray.splice(j, 1);
  914. for (var k = 0; k < split.length; k++) {
  915. joinsArray.splice(j + k, 0, split[k]);
  916. }
  917. }
  918. }
  919. }
  920. if (rmngSpltedQuery[1] && rmngSpltedQuery[1].toLowerCase() == "on") {
  921. subQueryAliasName = rmngSpltedQuery[0];
  922. }
  923. else if (joinsArray[0].split(" ").length == 1)
  924. subQueryAliasName = joinsArray[0];
  925. else
  926. subQueryAliasName = remainingQuery.substring(0, minIdx).trim();
  927. }
  928. else if (remainingQuery.length) {
  929. let andIdx = remainingQuery.indexOf("and ") == -1 ? Infinity : remainingQuery.indexOf("and ");
  930. let orIdx = remainingQuery.indexOf("or ") == -1 ? Infinity : remainingQuery.indexOf("or ");
  931. minIdx = Math.min(orIdx, andIdx);
  932. if (minIdx != Infinity && minIdx != 0) {
  933. subQueryAliasName = remainingQuery.substring(0, minIdx);
  934. }
  935. else if (remainingQuery.split(" ")[0].trim() == "as") {
  936. subQueryAliasName = remainingQuery.split(" ")[1];
  937. }
  938. else if (minIdx != 0)
  939. subQueryAliasName = remainingQuery;
  940. }
  941. if (fromToSubQuery.length > 1 && fromToSubQuery != openBrac)
  942. remainingQuery = fromToSubQuery + remainingQuery;
  943. indexOfSelect = subQuery.indexOf(selectString);
  944. if (indexOfSelect != -1) {
  945. sub_dynamicQuery = this.parseQueryToDynamic(subQuery);
  946. }
  947. return { SubDynamicQuery: sub_dynamicQuery, RemainingQuery: remainingQuery, SubQueryAliasName: subQueryAliasName };
  948. }
  949. getTablesJoinsClauses(tempQuery) {
  950. tempQuery = tempQuery.toLowerCase().trim();
  951. let joinsArr = new Array();
  952. let clauseArr = new Array();
  953. let whereArr = new Array();
  954. let tables = new Array();
  955. let whereStr = "where ";
  956. let orderByStr = "order by";
  957. let groupByStr = "group by";
  958. let havingStr = "having ";
  959. let whereConditionStr = "";
  960. let groupByConditionStr = "";
  961. let havingConditionStr = "";
  962. let orderByConditionStr = "";
  963. let tablesQuery = "";
  964. let joinsArray = [];
  965. let lastRelation = "";
  966. let relations = Object.values(DataSources.Enums.RelationType).filter(x => typeof (x) == "string");
  967. let whereIdx = tempQuery.indexOf(whereStr) == -1 ? Infinity : tempQuery.indexOf(whereStr);
  968. let groubyIdx = tempQuery.indexOf(groupByStr) == -1 ? Infinity : tempQuery.indexOf(groupByStr);
  969. let orderbyIdx = tempQuery.indexOf(orderByStr) == -1 ? Infinity : tempQuery.indexOf(orderByStr);
  970. let havingIdx = tempQuery.indexOf(havingStr) == -1 ? Infinity : tempQuery.indexOf(havingStr);
  971. let clauseIdx = Math.min(whereIdx, groubyIdx, orderbyIdx, havingIdx);
  972. if (clauseIdx != Infinity)
  973. tablesQuery = tempQuery.substring(0, clauseIdx);
  974. else
  975. tablesQuery = tempQuery;
  976. lastRelation = relations.pop();
  977. joinsArray = tablesQuery.split(lastRelation.toLowerCase()).map(x => x.trim());
  978. if (joinsArray.length > 1) {
  979. for (var i = 0; i < joinsArray.length; i++) {
  980. if (i && !joinsArray[i].startsWith("__")) {
  981. joinsArray[i] = `__Cross ` + joinsArray[i];
  982. }
  983. }
  984. }
  985. for (var i = 0; i < relations.length; i++) {
  986. for (var j = 0; j < joinsArray.length; j++) {
  987. let split = joinsArray[j].split(relations[i].toLowerCase()).map(x => x.trim());
  988. if (split.length > 1) {
  989. joinsArray.splice(j, 1);
  990. for (var k = 0; k < split.length; k++) {
  991. joinsArray.splice(j + k, 0, split[k]);
  992. }
  993. }
  994. }
  995. if (joinsArray.length > 1) {
  996. for (var j = 0; j < joinsArray.length; j++) {
  997. if (j && !joinsArray[j].startsWith("__")) {
  998. joinsArray[j] = `__${relations[i]} ` + joinsArray[j];
  999. }
  1000. }
  1001. }
  1002. }
  1003. for (var j = 0; j < joinsArray.length; j++) {
  1004. let currentEle = joinsArray[j];
  1005. let index = currentEle.indexOf(" join ", 8);
  1006. if (index != -1) {
  1007. joinsArray.splice(j + 1, 0, "__Inner" + currentEle.substring(index, currentEle.length));
  1008. joinsArray[j] = currentEle.substring(0, index);
  1009. }
  1010. }
  1011. for (var j = 0; j < joinsArray.length; j++) {
  1012. let table = new DataSources.Requests.DataListTable();
  1013. let join = new DataSources.Requests.DataListJoin();
  1014. let joinOn = new DataSources.Requests.DataListJoinOn();
  1015. if (!j) {
  1016. let minIdx = Math.min(whereIdx, groubyIdx, orderbyIdx, havingIdx);
  1017. if (minIdx != Infinity)
  1018. joinsArray[j] = joinsArray[j].substring(0, minIdx);
  1019. let tableArr = [];
  1020. if (joinsArray[j].includes("(")) {
  1021. tableArr = [joinsArray[j]];
  1022. }
  1023. else {
  1024. tableArr = joinsArray[j].split(" ");
  1025. if (joinsArray[j].includes("as "))
  1026. tableArr = joinsArray[j].split("as ").map(x => x.trim());
  1027. }
  1028. join.DocTypeTableName = tableArr[0];
  1029. join.DocTableAliasName = tableArr[1] ? tableArr[1] : tableArr[0];
  1030. table.DocTypeTableName = tableArr[0];
  1031. table.DocTableAliasName = tableArr[1] ? tableArr[1] : tableArr[0];
  1032. }
  1033. else {
  1034. if (joinsArray[j].includes("join "))
  1035. joinsArray[j] = joinsArray[j].replace("join ", "");
  1036. let joinType = joinsArray[j].split(" ")[0].slice(2);
  1037. join.DocJoinType = parseInt(DataSources.Enums.RelationType[joinType]);
  1038. joinsArray[j] = joinsArray[j].split(" ").slice(1).join(" ");
  1039. let joinArr = joinsArray[j].split(" on ");
  1040. let tableSplit = joinArr[0].split(" ").map(x => x.trim());
  1041. let tableColumnsSplit = joinArr[1].split("=").map(x => x.trim());
  1042. if (tableSplit.length == 2) {
  1043. join.DocTypeTableName = tableSplit[0];
  1044. join.DocTableAliasName = tableSplit[1];
  1045. table.DocTypeTableName = tableSplit[0];
  1046. table.DocTableAliasName = tableSplit[1];
  1047. }
  1048. else {
  1049. join.DocTypeTableName = tableSplit[0];
  1050. join.DocTableAliasName = tableSplit[0];
  1051. table.DocTypeTableName = tableSplit[0];
  1052. table.DocTableAliasName = tableSplit[0];
  1053. }
  1054. joinOn.DocTypeTable1Column = tableColumnsSplit[0];
  1055. joinOn.DocTypeTable2Column = tableColumnsSplit[1];
  1056. join.on = joinOn;
  1057. }
  1058. joinsArr.push(join);
  1059. tables.push(table);
  1060. }
  1061. whereIdx = tempQuery.indexOf(whereStr) == -1 ? Infinity : tempQuery.indexOf(whereStr);
  1062. groubyIdx = tempQuery.indexOf(groupByStr) == -1 ? Infinity : tempQuery.indexOf(groupByStr);
  1063. orderbyIdx = tempQuery.indexOf(orderByStr) == -1 ? Infinity : tempQuery.indexOf(orderByStr);
  1064. havingIdx = tempQuery.indexOf(havingStr) == -1 ? Infinity : tempQuery.indexOf(havingStr);
  1065. if (whereIdx != Infinity) {
  1066. let minIdx = Math.min(groubyIdx, orderbyIdx, havingIdx) == Infinity ? tempQuery.length : Math.min(groubyIdx, orderbyIdx, havingIdx);
  1067. whereConditionStr = tempQuery.substring(whereIdx + 5, minIdx).trim();
  1068. whereArr = this.getWhereConditionsFromQuery(whereConditionStr);
  1069. }
  1070. if (groubyIdx != Infinity) {
  1071. let clause = new DataSources.Requests.DataListClause();
  1072. let minIdx = Math.min(orderbyIdx, havingIdx) == Infinity ? tempQuery.length : Math.min(orderbyIdx, havingIdx);
  1073. groupByConditionStr = tempQuery.substring(groubyIdx + 8, minIdx).trim();
  1074. clause.ClauseType = DataSources.Enums.ClauseType.GroupBy;
  1075. clause.Columns = groupByConditionStr;
  1076. clauseArr.push(clause);
  1077. }
  1078. if (havingIdx != Infinity) {
  1079. let clause = new DataSources.Requests.DataListClause();
  1080. havingConditionStr = tempQuery.substring(havingIdx + 6, orderbyIdx == Infinity ? tempQuery.length : orderbyIdx).trim();
  1081. clause.ClauseType = DataSources.Enums.ClauseType.Having;
  1082. clause.Columns = "";
  1083. clause.Having = this.getWhereConditionsFromQuery(whereConditionStr);
  1084. clauseArr.push(clause);
  1085. }
  1086. if (orderbyIdx != Infinity) {
  1087. let clause = new DataSources.Requests.DataListClause();
  1088. let orderByArr = Object.values(DataSources.Enums.OrderBy).filter(x => typeof (x) == "string");
  1089. orderByConditionStr = tempQuery.substring(orderbyIdx + 8, tempQuery.length).trim();
  1090. clause.ClauseType = DataSources.Enums.ClauseType.OrderBy;
  1091. clause.Columns = orderByConditionStr;
  1092. for (var i = 0; i < orderByArr.length; i++) {
  1093. if (orderByConditionStr.includes(orderByArr[i].toLowerCase()))
  1094. clause.OrderBy = parseInt(DataSources.Enums.OrderBy[orderByArr[i]]);
  1095. }
  1096. clauseArr.push(clause);
  1097. }
  1098. return { Tables: tables, Joins: joinsArr, Where: whereArr, Clause: clauseArr };
  1099. }
  1100. getIndexOfCorrespondingCloseBracket(query) {
  1101. let counter = 1;
  1102. let openBrac = "(";
  1103. let closeBrac = ")";
  1104. let index = 1;
  1105. while (counter > 0) {
  1106. let openIndex = query.indexOf(openBrac, index);
  1107. let closeIndex = query.indexOf(closeBrac, index);
  1108. if (openIndex != -1 && closeIndex != -1) {
  1109. if (openIndex < closeIndex) {
  1110. counter++;
  1111. index = openIndex + 1;
  1112. }
  1113. else if (openIndex > closeIndex) {
  1114. counter--;
  1115. index = closeIndex + 1;
  1116. }
  1117. }
  1118. else if (openIndex == -1 && closeIndex != -1) {
  1119. counter--;
  1120. index = closeIndex + 1;
  1121. }
  1122. else if (closeIndex == -1) {
  1123. }
  1124. }
  1125. return index;
  1126. }
  1127. getDataListColumnsFromSelectString(query) {
  1128. let columns = new Array();
  1129. let indexOfSelect = query.indexOf("select ");
  1130. let indexOfFrom = query.indexOf("from ");
  1131. let columnsStr = "";
  1132. if (indexOfSelect != -1 && indexOfFrom != -1) {
  1133. columnsStr = query.trim().substring(indexOfSelect + 6, indexOfFrom).trim();
  1134. columnsStr.indexOf(",") == 0 && (columnsStr = columnsStr.slice(1));
  1135. columnsStr = this.removeParanthesisBetweenColumns(columnsStr);
  1136. if (columnsStr.length) {
  1137. let colsArray = columnsStr.trim().split(",").map(x => x.trim());
  1138. for (var i = 0; i < colsArray.length; i++) {
  1139. let column = new DataSources.Requests.DataListColumn();
  1140. if (colsArray[i].includes(" as")) {
  1141. let col_alias = colsArray[i].split(" as").map(x => x.trim());
  1142. column.ColumnName = col_alias[0];
  1143. column.AliasName = col_alias[1];
  1144. }
  1145. else {
  1146. let clmn = colsArray[i].trim();
  1147. column.ColumnName = clmn;
  1148. column.AliasName = clmn;
  1149. }
  1150. columns.push(column);
  1151. }
  1152. }
  1153. }
  1154. columns = this.addParanthesisBtwColumns(columns);
  1155. return columns;
  1156. }
  1157. getWhereConditionsFromQuery(query) {
  1158. query = query.trim().toLowerCase();
  1159. let splitedArray = this.getWhereQueryAsConditionsArray(query);
  1160. let WhereArr = new Array();
  1161. for (var i = 0; i < splitedArray.length; i++) {
  1162. let where = new DataSources.Requests.DataListWhere();
  1163. if (i) {
  1164. let clmnSplit = splitedArray[i].split(" ");
  1165. clmnSplit.shift();
  1166. splitedArray[i] = clmnSplit.join(" ");
  1167. }
  1168. if (splitedArray[i].includes("between ")) {
  1169. let split = splitedArray[i].split(" ");
  1170. where.ColumnName = split[0];
  1171. where.IsBetween = true;
  1172. where.Value1 = split[2];
  1173. where.Value2 = split[4];
  1174. where.ExpressionType = DataSources.Enums.ExpressionType.Between;
  1175. }
  1176. else if (splitedArray[i].includes(">=")) {
  1177. let split = splitedArray[i].split(">=");
  1178. where.ColumnName = split[0].trim();
  1179. where.Value1 = split[1].trim();
  1180. where.ExpressionType = DataSources.Enums.ExpressionType.GreaterThanEqualTo;
  1181. }
  1182. else if (splitedArray[i].includes("<=")) {
  1183. let split = splitedArray[i].split("<=");
  1184. where.ColumnName = split[0].trim();
  1185. where.Value1 = split[1].trim();
  1186. where.ExpressionType = DataSources.Enums.ExpressionType.LessThanEqualTo;
  1187. }
  1188. else if (splitedArray[i].includes("!=")) {
  1189. let split = splitedArray[i].split("!=");
  1190. where.ColumnName = split[0].trim();
  1191. where.Value1 = split[1].trim();
  1192. where.ExpressionType = DataSources.Enums.ExpressionType.NotEqualTo;
  1193. }
  1194. else if (splitedArray[i].includes(">")) {
  1195. let split = splitedArray[i].split(">");
  1196. where.ColumnName = split[0].trim();
  1197. where.Value1 = split[1].trim();
  1198. where.ExpressionType = DataSources.Enums.ExpressionType.GreaterThan;
  1199. }
  1200. else if (splitedArray[i].includes("<")) {
  1201. let split = splitedArray[i].split("<");
  1202. where.ColumnName = split[0].trim();
  1203. where.Value1 = split[1].trim();
  1204. where.ExpressionType = DataSources.Enums.ExpressionType.LessThan;
  1205. }
  1206. else if (splitedArray[i].includes("=")) {
  1207. let split = splitedArray[i].split("=");
  1208. where.ColumnName = split[0].trim();
  1209. where.Value1 = split[1].trim();
  1210. where.ExpressionType = DataSources.Enums.ExpressionType.EqualTo;
  1211. }
  1212. else if (splitedArray[i].includes("not in ")) {
  1213. let split = splitedArray[i].split("not in ");
  1214. where.ColumnName = split[0].trim();
  1215. where.Value1 = split[1].trim();
  1216. where.ExpressionType = DataSources.Enums.ExpressionType.NotIn;
  1217. }
  1218. else if (splitedArray[i].includes(" in")) {
  1219. let split = splitedArray[i].split(" in");
  1220. if (split.length > 2)
  1221. split[1] = split.slice(1).join(" ");
  1222. where.ColumnName = split[0].trim();
  1223. where.Value1 = split[1].trim();
  1224. where.ExpressionType = DataSources.Enums.ExpressionType.In;
  1225. }
  1226. else if (splitedArray[i].includes("is not")) {
  1227. let split = splitedArray[i].split("is not");
  1228. where.ColumnName = split[0].trim();
  1229. where.Value1 = split[1].trim();
  1230. where.ExpressionType = DataSources.Enums.ExpressionType.IsNotNull;
  1231. }
  1232. else if (splitedArray[i].includes(" is")) {
  1233. let split = splitedArray[i].split(" is");
  1234. where.ColumnName = split[0].trim();
  1235. where.Value1 = split[1].trim();
  1236. where.ExpressionType = DataSources.Enums.ExpressionType.IsNull;
  1237. }
  1238. if (i + 1 < splitedArray.length) {
  1239. where.AddConditionType = DataSources.Enums.ConditionJoinType[(splitedArray[i + 1].split(" ").shift().slice(2))];
  1240. }
  1241. WhereArr.push(where);
  1242. }
  1243. return WhereArr;
  1244. }
  1245. removeParanthesisBetweenColumns(columnsStr) {
  1246. let openPranStr = "(";
  1247. let indexOfOpenPranthesis = columnsStr.indexOf(openPranStr);
  1248. let indexOfClosedParan = -1;
  1249. let strBtwnParanthesis = "";
  1250. let modifiedStr = "";
  1251. let tempStr = "";
  1252. while (indexOfOpenPranthesis != -1) {
  1253. tempStr = columnsStr.substring(indexOfOpenPranthesis + 1, columnsStr.length);
  1254. indexOfClosedParan = this.getIndexOfCorrespondingCloseBracket(tempStr);
  1255. strBtwnParanthesis = columnsStr.substring(indexOfOpenPranthesis, indexOfOpenPranthesis + indexOfClosedParan + 1);
  1256. modifiedStr = strBtwnParanthesis.replaceAll(openPranStr, "_& ");
  1257. modifiedStr = modifiedStr.replaceAll(",", "__");
  1258. modifiedStr = modifiedStr.replaceAll(")", " &_");
  1259. columnsStr = columnsStr.replace(strBtwnParanthesis, modifiedStr);
  1260. indexOfOpenPranthesis = columnsStr.indexOf(openPranStr);
  1261. }
  1262. return columnsStr;
  1263. }
  1264. addParanthesisBtwColumns(columns) {
  1265. for (var i = 0; i < columns.length; i++) {
  1266. let colname = columns[i].ColumnName;
  1267. let aliasName = columns[i].AliasName;
  1268. if (colname.includes("_& ")) {
  1269. colname = colname.replaceAll("_& ", "(");
  1270. colname = colname.replaceAll("__", ",");
  1271. colname = colname.replaceAll(" &_", ")");
  1272. aliasName = aliasName.replaceAll("_& ", "(");
  1273. aliasName = aliasName.replaceAll("__", ",");
  1274. aliasName = aliasName.replaceAll(" &_", ")");
  1275. columns[i].ColumnName = colname;
  1276. columns[i].AliasName = aliasName;
  1277. }
  1278. }
  1279. return columns;
  1280. }
  1281. getUnionsAndRemainingQuery(tempQuery) {
  1282. tempQuery = tempQuery.trim();
  1283. let unionQuery;
  1284. let currentRmngQuery = "";
  1285. let newUnionQuery = "";
  1286. let unionIdx;
  1287. let unionAllIdx;
  1288. let unionType;
  1289. let isUnion;
  1290. unionAllIdx = tempQuery.indexOf(" union all") == -1 ? Infinity : tempQuery.indexOf(" union all");
  1291. unionIdx = tempQuery.indexOf(" union") == -1 ? Infinity : tempQuery.indexOf(" union");
  1292. if (unionIdx < unionAllIdx) {
  1293. currentRmngQuery = tempQuery.substring(0, unionIdx);
  1294. newUnionQuery = tempQuery.substring(unionIdx + 6, tempQuery.length);
  1295. unionType = DataSources.Enums.UnionType.Union;
  1296. }
  1297. else if (unionIdx > unionAllIdx) {
  1298. currentRmngQuery = tempQuery.substring(0, unionAllIdx);
  1299. newUnionQuery = tempQuery.substring(unionAllIdx + 10, tempQuery.length);
  1300. unionType = DataSources.Enums.UnionType.UnionAll;
  1301. }
  1302. unionQuery = this.parseQueryToDynamic(newUnionQuery);
  1303. isUnion = true;
  1304. return { UnionType: unionType, IsUnion: isUnion, UnionQuery: unionQuery, CurrentRmngQuery: currentRmngQuery };
  1305. }
  1306. getWhereQueryAsConditionsArray(query) {
  1307. var splitArray = query.split("and ");
  1308. var keywords = ["and ", "or "];
  1309. if (splitArray.length > 1) {
  1310. for (var i = 0; i < splitArray.length; i++) {
  1311. if (i && !splitArray[i].startsWith("__")) {
  1312. splitArray[i] = `__And ` + splitArray[i];
  1313. }
  1314. }
  1315. }
  1316. keywords.shift();
  1317. for (var i = 0; i < keywords.length; i++) {
  1318. for (var j = 0; j < splitArray.length; j++) {
  1319. let split = splitArray[j].split((keywords[i]).toLowerCase()).map(x => x.trim());
  1320. if (split.length > 1) {
  1321. splitArray.splice(j, 1);
  1322. for (var k = 0; k < split.length; k++) {
  1323. splitArray.splice(j + k, 0, split[k]);
  1324. }
  1325. }
  1326. }
  1327. for (var k = 0; k < splitArray.length; k++) {
  1328. if (k && !splitArray[k].startsWith("__")) {
  1329. splitArray[k] = `__Or ` + splitArray[k];
  1330. }
  1331. }
  1332. }
  1333. splitArray = splitArray.map(x => x.trim());
  1334. for (var i = 0; i < splitArray.length; i++) {
  1335. if (splitArray[i].includes("between ")) {
  1336. let nextElemntArr = splitArray[i + 1].split(" ");
  1337. nextElemntArr.shift();
  1338. splitArray[i + 1] = nextElemntArr.map(x => x.trim()).join(" ");
  1339. splitArray[i] = splitArray[i] + " and " + splitArray[i + 1];
  1340. splitArray.splice(i + 1, 1);
  1341. }
  1342. }
  1343. return splitArray;
  1344. }
  1345. someFn(joinArr) {
  1346. if (joinArr.length == 3 && joinArr[2].includes("=")) {
  1347. let tablesSeperatedArr = joinArr[2].split("=");
  1348. joinArr.splice(2, 1);
  1349. for (var l = 0; l < tablesSeperatedArr.length; l++) {
  1350. joinArr.push(tablesSeperatedArr[l]);
  1351. if (!l)
  1352. joinArr.push("=");
  1353. }
  1354. }
  1355. else if (joinArr.length == 4 && joinArr[2].includes("=")) {
  1356. joinArr[2] = joinArr[2].replace("=", "");
  1357. joinArr.splice(3, 0, "=");
  1358. }
  1359. else if (joinArr.length == 4 && joinArr[3].includes("=")) {
  1360. joinArr[3] = joinArr[3].replace("=", "");
  1361. joinArr.splice(3, 0, "=");
  1362. }
  1363. else if (joinArr.length == 4 && joinArr[3].includes("=")) {
  1364. let tablesSeperatedArr = joinArr[3].split("=");
  1365. joinArr.splice(3, 1);
  1366. for (var l = 0; l < tablesSeperatedArr.length; l++) {
  1367. joinArr.push(tablesSeperatedArr[l]);
  1368. if (!l)
  1369. joinArr.push("=");
  1370. }
  1371. }
  1372. else if (joinArr.length == 4 && joinArr[2].includes("=")) {
  1373. joinArr[2] = joinArr[2].replace("=", "");
  1374. joinArr.splice(3, 0, "=");
  1375. }
  1376. else if (joinArr.length == 4 && joinArr[3].includes("=")) {
  1377. joinArr[3] = joinArr[3].replace("=", "");
  1378. joinArr.splice(3, 0, "=");
  1379. }
  1380. return joinArr;
  1381. }
  1382. getSubQueriesInWhere(clauseQuery) {
  1383. clauseQuery = clauseQuery.trim();
  1384. let whereIdx;
  1385. let groubyIdx;
  1386. let orderbyIdx;
  1387. let havingIdx;
  1388. let clauseIdx;
  1389. let unionIdx;
  1390. let whereQuery = "";
  1391. let queryBfWhr = "";
  1392. let tempQuery = "";
  1393. let closingIdx;
  1394. let selectIdx;
  1395. let subQueryStr = "";
  1396. let whereInitialStr = "";
  1397. let otherClauseQuery = "";
  1398. let subQueryArr = [];
  1399. let whereArr = [];
  1400. selectIdx = clauseQuery.indexOf("select ");
  1401. while (selectIdx != -1) {
  1402. let subquery = new DataSources.Requests.DynamicQuery();
  1403. whereInitialStr = clauseQuery.substring(0, selectIdx).trim();
  1404. whereInitialStr = whereInitialStr.substring(0, whereInitialStr.lastIndexOf("(")).trim();
  1405. tempQuery = clauseQuery.substring(selectIdx, clauseQuery.length);
  1406. closingIdx = this.getIndexOfCorrespondingCloseBracket(tempQuery);
  1407. subQueryStr = tempQuery.substring(0, closingIdx - 1);
  1408. clauseQuery = tempQuery.substring(closingIdx, tempQuery.length).trim();
  1409. selectIdx = subQueryStr.indexOf("select ");
  1410. if (selectIdx != -1) {
  1411. subquery = this.parseQueryToDynamic(subQueryStr);
  1412. }
  1413. clauseQuery = whereInitialStr + ` __subquerytable_${++this.subQueryNumber} ` + clauseQuery;
  1414. selectIdx = clauseQuery.indexOf("select ");
  1415. unionIdx = clauseQuery.indexOf("union ");
  1416. if (unionIdx < selectIdx)
  1417. selectIdx = -1;
  1418. subquery.TempName = `__subquerytable_${this.subQueryNumber}`;
  1419. subQueryArr.push(subquery);
  1420. }
  1421. groubyIdx = clauseQuery.indexOf("group by") == -1 ? Infinity : clauseQuery.indexOf("group by");
  1422. orderbyIdx = clauseQuery.indexOf("order by") == -1 ? Infinity : clauseQuery.indexOf("order by");
  1423. havingIdx = clauseQuery.indexOf("having ") == -1 ? Infinity : clauseQuery.indexOf("having ");
  1424. unionIdx = clauseQuery.indexOf("union ") == -1 ? Infinity : clauseQuery.indexOf("union ");
  1425. clauseIdx = Math.min(groubyIdx, orderbyIdx, havingIdx, unionIdx);
  1426. whereIdx = clauseQuery.indexOf("where ");
  1427. if (clauseIdx != Infinity) {
  1428. whereQuery = clauseQuery.substring(clauseQuery.indexOf("where ") + 6, clauseIdx);
  1429. otherClauseQuery = clauseQuery.substring(clauseIdx, clauseQuery.length);
  1430. }
  1431. else {
  1432. whereQuery = clauseQuery.substring(clauseQuery.indexOf("where ") + 6, clauseQuery.length);
  1433. }
  1434. whereQuery = whereQuery.trim();
  1435. let idx = whereQuery.indexOf("(");
  1436. if (idx == 0) {
  1437. let clseIdx = this.getIndexOfCorrespondingCloseBracket(whereQuery.slice(idx));
  1438. whereQuery = whereQuery.substring(0, clseIdx - 1).slice(idx + 1).trim();
  1439. }
  1440. queryBfWhr = clauseQuery.substring(0, whereIdx);
  1441. otherClauseQuery = otherClauseQuery.replace(whereQuery, "").trim();
  1442. otherClauseQuery = queryBfWhr + otherClauseQuery;
  1443. whereArr = this.getWhereConditionsFromQuery(whereQuery);
  1444. for (var i = 0; i < whereArr.length; i++) {
  1445. let subQuery = subQueryArr.find(x => x.TempName == whereArr[i].Value1);
  1446. if (subQuery) {
  1447. whereArr[i].IsSubQuery = true;
  1448. whereArr[i].SubQuery = subQuery;
  1449. }
  1450. }
  1451. return { listOfWhere: whereArr, RemaingQuery: otherClauseQuery };
  1452. }
  1453. static Instance() {
  1454. if (this.instance === undefined) {
  1455. this.instance = new QueryParser();
  1456. }
  1457. return this.instance;
  1458. }
  1459. }
  1460. Components.QueryParser = QueryParser;
  1461. })(Components = DataSources.Components || (DataSources.Components = {}));
  1462. })(DataSources = Platform.DataSources || (Platform.DataSources = {}));
  1463. })(Platform = Unibase.Platform || (Unibase.Platform = {}));
  1464. })(Unibase || (Unibase = {}));