history.js 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003
  1. "use strict";
  2. /**
  3. * @fileoverview function used in this file builds history tab and generates query.
  4. *
  5. * @requires jQuery
  6. * @requires move.js
  7. * @version $Id$
  8. */
  9. /* global contr */
  10. // js/designer/init.js
  11. /* global fromArray:writable */
  12. // js/designer/move.js
  13. /* global themeImagePath */
  14. // templates/javascript/variables.twig
  15. var DesignerHistory = {};
  16. var historyArray = []; // Global array to store history objects
  17. var selectField = []; // Global array to store information for columns which are used in select clause
  18. var gIndex;
  19. var vqbEditor = null;
  20. /**
  21. * To display details of objects(where,rename,Having,aggregate,groupby,orderby,having)
  22. *
  23. * @param index index of historyArray where change is to be made
  24. *
  25. **/
  26. DesignerHistory.detail = function (index) {
  27. var type = historyArray[index].getType();
  28. var str;
  29. if (type === 'Where') {
  30. str = 'Where ' + historyArray[index].getColumnName() + historyArray[index].getObj().getRelationOperator() + historyArray[index].getObj().getQuery();
  31. }
  32. if (type === 'Rename') {
  33. str = 'Rename ' + historyArray[index].getColumnName() + ' To ' + historyArray[index].getObj().getRenameTo();
  34. }
  35. if (type === 'Aggregate') {
  36. str = 'Select ' + historyArray[index].getObj().getOperator() + '( ' + historyArray[index].getColumnName() + ' )';
  37. }
  38. if (type === 'GroupBy') {
  39. str = 'GroupBy ' + historyArray[index].getColumnName();
  40. }
  41. if (type === 'OrderBy') {
  42. str = 'OrderBy ' + historyArray[index].getColumnName() + ' ' + historyArray[index].getObj().getOrder();
  43. }
  44. if (type === 'Having') {
  45. str = 'Having ';
  46. if (historyArray[index].getObj().getOperator() !== 'None') {
  47. str += historyArray[index].getObj().getOperator() + '( ' + historyArray[index].getColumnName() + ' )';
  48. str += historyArray[index].getObj().getRelationOperator() + historyArray[index].getObj().getQuery();
  49. } else {
  50. str = 'Having ' + historyArray[index].getColumnName() + historyArray[index].getObj().getRelationOperator() + historyArray[index].getObj().getQuery();
  51. }
  52. }
  53. return str;
  54. };
  55. /**
  56. * Sorts historyArray[] first,using table name as the key and then generates the HTML code for history tab,
  57. * clubbing all objects of same tables together
  58. * This function is called whenever changes are made in historyArray[]
  59. *
  60. *
  61. * @param {int} init starting index of unsorted array
  62. * @param {int} finit last index of unsorted array
  63. *
  64. **/
  65. DesignerHistory.display = function (init, finit) {
  66. var str;
  67. var i;
  68. var j;
  69. var k;
  70. var sto;
  71. var temp; // this part sorts the history array based on table name,this is needed for clubbing all object of same name together.
  72. for (i = init; i < finit; i++) {
  73. sto = historyArray[i];
  74. temp = historyArray[i].getTab(); // + '.' + historyArray[i].getObjNo(); for Self JOINS
  75. for (j = 0; j < i; j++) {
  76. if (temp > historyArray[j].getTab()) {
  77. // + '.' + historyArray[j].getObjNo())) { //for Self JOINS
  78. for (k = i; k > j; k--) {
  79. historyArray[k] = historyArray[k - 1];
  80. }
  81. historyArray[j] = sto;
  82. break;
  83. }
  84. }
  85. } // this part generates HTML code for history tab.adds delete,edit,and/or and detail features with objects.
  86. str = ''; // string to store Html code for history tab
  87. var historyArrayLength = historyArray.length;
  88. for (i = 0; i < historyArrayLength; i++) {
  89. temp = historyArray[i].getTab(); // + '.' + historyArray[i].getObjNo(); for Self JOIN
  90. str += '<h3 class="tiger"><a href="#">' + temp + '</a></h3>';
  91. str += '<div class="toggle_container">\n';
  92. while (historyArray[i].getTab() === temp) {
  93. // + '.' + historyArray[i].getObjNo()) === temp) {
  94. str += '<div class="block"> <table class="pma-table" width ="250">';
  95. str += '<thead><tr><td>';
  96. if (historyArray[i].getAndOr()) {
  97. str += '<img src="' + themeImagePath + 'designer/or_icon.png" onclick="DesignerHistory.andOr(' + i + ')" title="OR"></td>';
  98. } else {
  99. str += '<img src="' + themeImagePath + 'designer/and_icon.png" onclick="DesignerHistory.andOr(' + i + ')" title="AND"></td>';
  100. }
  101. str += '<td style="padding-left: 5px;" class="right">' + Functions.getImage('b_sbrowse', Messages.strColumnName) + '</td>' + '<td width="175" style="padding-left: 5px">' + $('<div/>').text(historyArray[i].getColumnName()).html() + '<td>';
  102. if (historyArray[i].getType() === 'GroupBy' || historyArray[i].getType() === 'OrderBy') {
  103. var detailDescGroupBy = $('<div/>').text(DesignerHistory.detail(i)).html();
  104. str += '<td class="text-center">' + Functions.getImage('s_info', DesignerHistory.detail(i)) + '</td>' + '<td title="' + detailDescGroupBy + '">' + historyArray[i].getType() + '</td>' + '<td onclick=DesignerHistory.historyDelete(' + i + ')>' + Functions.getImage('b_drop', Messages.strDelete) + '</td>';
  105. } else {
  106. var detailDesc = $('<div/>').text(DesignerHistory.detail(i)).html();
  107. str += '<td class="text-center">' + Functions.getImage('s_info', DesignerHistory.detail(i)) + '</td>' + '<td title="' + detailDesc + '">' + historyArray[i].getType() + '</td>' + '<td onclick=DesignerHistory.historyEdit(' + i + ')>' + Functions.getImage('b_edit', Messages.strEdit) + '</td>' + '<td onclick=DesignerHistory.historyDelete(' + i + ')>' + Functions.getImage('b_drop', Messages.strDelete) + '</td>';
  108. }
  109. str += '</tr></thead>';
  110. i++;
  111. if (i >= historyArrayLength) {
  112. break;
  113. }
  114. str += '</table></div>';
  115. }
  116. i--;
  117. str += '</div>';
  118. }
  119. return str;
  120. };
  121. /**
  122. * To change And/Or relation in history tab
  123. *
  124. *
  125. * @param {int} index of historyArray where change is to be made
  126. *
  127. **/
  128. DesignerHistory.andOr = function (index) {
  129. if (historyArray[index].getAndOr()) {
  130. historyArray[index].setAndOr(0);
  131. } else {
  132. historyArray[index].setAndOr(1);
  133. }
  134. var existingDiv = document.getElementById('ab');
  135. existingDiv.innerHTML = DesignerHistory.display(0, 0);
  136. $('#ab').accordion('refresh');
  137. };
  138. /**
  139. * Deletes entry in historyArray
  140. *
  141. * @param index index of historyArray[] which is to be deleted
  142. *
  143. **/
  144. DesignerHistory.historyDelete = function (index) {
  145. var fromArrayLength = fromArray.length;
  146. for (var k = 0; k < fromArrayLength; k++) {
  147. if (fromArray[k] === historyArray[index].getTab()) {
  148. fromArray.splice(k, 1);
  149. break;
  150. }
  151. }
  152. historyArray.splice(index, 1);
  153. var existingDiv = document.getElementById('ab');
  154. existingDiv.innerHTML = DesignerHistory.display(0, 0);
  155. $('#ab').accordion('refresh');
  156. };
  157. /**
  158. * To show where,rename,aggregate,having forms to edit a object
  159. *
  160. * @param{int} index index of historyArray where change is to be made
  161. *
  162. **/
  163. DesignerHistory.historyEdit = function (index) {
  164. gIndex = index;
  165. var type = historyArray[index].getType();
  166. if (type === 'Where') {
  167. document.getElementById('eQuery').value = historyArray[index].getObj().getQuery();
  168. document.getElementById('erel_opt').value = historyArray[index].getObj().getRelationOperator();
  169. document.getElementById('query_where').style.left = '530px';
  170. document.getElementById('query_where').style.top = '130px';
  171. document.getElementById('query_where').style.position = 'absolute';
  172. document.getElementById('query_where').style.zIndex = '103';
  173. document.getElementById('query_where').style.visibility = 'visible';
  174. document.getElementById('query_where').style.display = 'block';
  175. }
  176. if (type === 'Having') {
  177. document.getElementById('hQuery').value = historyArray[index].getObj().getQuery();
  178. document.getElementById('hrel_opt').value = historyArray[index].getObj().getRelationOperator();
  179. document.getElementById('hoperator').value = historyArray[index].getObj().getOperator();
  180. document.getElementById('query_having').style.left = '530px';
  181. document.getElementById('query_having').style.top = '130px';
  182. document.getElementById('query_having').style.position = 'absolute';
  183. document.getElementById('query_having').style.zIndex = '103';
  184. document.getElementById('query_having').style.visibility = 'visible';
  185. document.getElementById('query_having').style.display = 'block';
  186. }
  187. if (type === 'Rename') {
  188. document.getElementById('e_rename').value = historyArray[index].getObj().getRenameTo();
  189. document.getElementById('query_rename_to').style.left = '530px';
  190. document.getElementById('query_rename_to').style.top = '130px';
  191. document.getElementById('query_rename_to').style.position = 'absolute';
  192. document.getElementById('query_rename_to').style.zIndex = '103';
  193. document.getElementById('query_rename_to').style.visibility = 'visible';
  194. document.getElementById('query_rename_to').style.display = 'block';
  195. }
  196. if (type === 'Aggregate') {
  197. document.getElementById('e_operator').value = historyArray[index].getObj().getOperator();
  198. document.getElementById('query_Aggregate').style.left = '530px';
  199. document.getElementById('query_Aggregate').style.top = '130px';
  200. document.getElementById('query_Aggregate').style.position = 'absolute';
  201. document.getElementById('query_Aggregate').style.zIndex = '103';
  202. document.getElementById('query_Aggregate').style.visibility = 'visible';
  203. document.getElementById('query_Aggregate').style.display = 'block';
  204. }
  205. };
  206. /**
  207. * Make changes in historyArray when Edit button is clicked
  208. * checks for the type of object and then sets the new value
  209. *
  210. * @param index index of historyArray where change is to be made
  211. **/
  212. DesignerHistory.edit = function (type) {
  213. if (type === 'Rename') {
  214. if (document.getElementById('e_rename').value !== '') {
  215. historyArray[gIndex].getObj().setRenameTo(document.getElementById('e_rename').value);
  216. document.getElementById('e_rename').value = '';
  217. }
  218. document.getElementById('query_rename_to').style.visibility = 'hidden';
  219. }
  220. if (type === 'Aggregate') {
  221. if (document.getElementById('e_operator').value !== '---') {
  222. historyArray[gIndex].getObj().setOperator(document.getElementById('e_operator').value);
  223. document.getElementById('e_operator').value = '---';
  224. }
  225. document.getElementById('query_Aggregate').style.visibility = 'hidden';
  226. }
  227. if (type === 'Where') {
  228. if (document.getElementById('erel_opt').value !== '--' && document.getElementById('eQuery').value !== '') {
  229. historyArray[gIndex].getObj().setQuery(document.getElementById('eQuery').value);
  230. historyArray[gIndex].getObj().setRelationOperator(document.getElementById('erel_opt').value);
  231. }
  232. document.getElementById('query_where').style.visibility = 'hidden';
  233. }
  234. if (type === 'Having') {
  235. if (document.getElementById('hrel_opt').value !== '--' && document.getElementById('hQuery').value !== '') {
  236. historyArray[gIndex].getObj().setQuery(document.getElementById('hQuery').value);
  237. historyArray[gIndex].getObj().setRelationOperator(document.getElementById('hrel_opt').value);
  238. historyArray[gIndex].getObj().setOperator(document.getElementById('hoperator').value);
  239. }
  240. document.getElementById('query_having').style.visibility = 'hidden';
  241. }
  242. var existingDiv = document.getElementById('ab');
  243. existingDiv.innerHTML = DesignerHistory.display(0, 0);
  244. $('#ab').accordion('refresh');
  245. };
  246. /**
  247. * history object closure
  248. *
  249. * @param nColumnName name of the column on which conditions are put
  250. * @param nObj object details(where,rename,orderby,groupby,aggregate)
  251. * @param nTab table name of the column on which conditions are applied
  252. * @param nObjNo object no used for inner join
  253. * @param nType type of object
  254. *
  255. **/
  256. DesignerHistory.HistoryObj = function (nColumnName, nObj, nTab, nObjNo, nType) {
  257. var andOr;
  258. var obj;
  259. var tab;
  260. var columnName;
  261. var objNo;
  262. var type;
  263. this.setColumnName = function (nColumnName) {
  264. columnName = nColumnName;
  265. };
  266. this.getColumnName = function () {
  267. return columnName;
  268. };
  269. this.setAndOr = function (nAndOr) {
  270. andOr = nAndOr;
  271. };
  272. this.getAndOr = function () {
  273. return andOr;
  274. };
  275. this.getRelation = function () {
  276. return andOr;
  277. };
  278. this.setObj = function (nObj) {
  279. obj = nObj;
  280. };
  281. this.getObj = function () {
  282. return obj;
  283. };
  284. this.setTab = function (nTab) {
  285. tab = nTab;
  286. };
  287. this.getTab = function () {
  288. return tab;
  289. };
  290. this.setObjNo = function (nObjNo) {
  291. objNo = nObjNo;
  292. };
  293. this.getObjNo = function () {
  294. return objNo;
  295. };
  296. this.setType = function (nType) {
  297. type = nType;
  298. };
  299. this.getType = function () {
  300. return type;
  301. };
  302. this.setObjNo(nObjNo);
  303. this.setTab(nTab);
  304. this.setAndOr(0);
  305. this.setObj(nObj);
  306. this.setColumnName(nColumnName);
  307. this.setType(nType);
  308. };
  309. /**
  310. * where object closure, makes an object with all information of where
  311. *
  312. * @param nRelationOperator type of relation operator to be applied
  313. * @param nQuery stores value of value/sub-query
  314. *
  315. **/
  316. DesignerHistory.Where = function (nRelationOperator, nQuery) {
  317. var relationOperator;
  318. var query;
  319. this.setRelationOperator = function (nRelationOperator) {
  320. relationOperator = nRelationOperator;
  321. };
  322. this.setQuery = function (nQuery) {
  323. query = nQuery;
  324. };
  325. this.getQuery = function () {
  326. return query;
  327. };
  328. this.getRelationOperator = function () {
  329. return relationOperator;
  330. };
  331. this.setQuery(nQuery);
  332. this.setRelationOperator(nRelationOperator);
  333. };
  334. /**
  335. * Orderby object closure
  336. *
  337. * @param nOrder order, ASC or DESC
  338. */
  339. DesignerHistory.OrderBy = function (nOrder) {
  340. var order;
  341. this.setOrder = function (nOrder) {
  342. order = nOrder;
  343. };
  344. this.getOrder = function () {
  345. return order;
  346. };
  347. this.setOrder(nOrder);
  348. };
  349. /**
  350. * Having object closure, makes an object with all information of where
  351. *
  352. * @param nRelationOperator type of relation operator to be applied
  353. * @param nQuery stores value of value/sub-query
  354. * @param nOperator operator
  355. **/
  356. DesignerHistory.Having = function (nRelationOperator, nQuery, nOperator) {
  357. var relationOperator;
  358. var query;
  359. var operator;
  360. this.setOperator = function (nOperator) {
  361. operator = nOperator;
  362. };
  363. this.setRelationOperator = function (nRelationOperator) {
  364. relationOperator = nRelationOperator;
  365. };
  366. this.setQuery = function (nQuery) {
  367. query = nQuery;
  368. };
  369. this.getQuery = function () {
  370. return query;
  371. };
  372. this.getRelationOperator = function () {
  373. return relationOperator;
  374. };
  375. this.getOperator = function () {
  376. return operator;
  377. };
  378. this.setQuery(nQuery);
  379. this.setRelationOperator(nRelationOperator);
  380. this.setOperator(nOperator);
  381. };
  382. /**
  383. * rename object closure,makes an object with all information of rename
  384. *
  385. * @param nRenameTo new name information
  386. *
  387. **/
  388. DesignerHistory.Rename = function (nRenameTo) {
  389. var renameTo;
  390. this.setRenameTo = function (nRenameTo) {
  391. renameTo = nRenameTo;
  392. };
  393. this.getRenameTo = function () {
  394. return renameTo;
  395. };
  396. this.setRenameTo(nRenameTo);
  397. };
  398. /**
  399. * aggregate object closure
  400. *
  401. * @param nOperator aggregte operator
  402. *
  403. **/
  404. DesignerHistory.Aggregate = function (nOperator) {
  405. var operator;
  406. this.setOperator = function (nOperator) {
  407. operator = nOperator;
  408. };
  409. this.getOperator = function () {
  410. return operator;
  411. };
  412. this.setOperator(nOperator);
  413. };
  414. /**
  415. * This function returns unique element from an array
  416. *
  417. * @param arrayName array from which duplicate elem are to be removed.
  418. * @return unique array
  419. */
  420. DesignerHistory.unique = function (arrayName) {
  421. var newArray = [];
  422. uniquetop: for (var i = 0; i < arrayName.length; i++) {
  423. var newArrayLength = newArray.length;
  424. for (var j = 0; j < newArrayLength; j++) {
  425. if (newArray[j] === arrayName[i]) {
  426. continue uniquetop;
  427. }
  428. }
  429. newArray[newArrayLength] = arrayName[i];
  430. }
  431. return newArray;
  432. };
  433. /**
  434. * This function takes in array and a value as input and returns 1 if values is present in array
  435. * else returns -1
  436. *
  437. * @param arrayName array
  438. * @param value value which is to be searched in the array
  439. */
  440. DesignerHistory.found = function (arrayName, value) {
  441. var arrayNameLength = arrayName.length;
  442. for (var i = 0; i < arrayNameLength; i++) {
  443. if (arrayName[i] === value) {
  444. return 1;
  445. }
  446. }
  447. return -1;
  448. };
  449. /**
  450. * This function concatenates two array
  451. *
  452. * @params add array elements of which are pushed in
  453. * @params arr array in which elements are added
  454. */
  455. DesignerHistory.addArray = function (add, arr) {
  456. var addLength = add.length;
  457. for (var i = 0; i < addLength; i++) {
  458. arr.push(add[i]);
  459. }
  460. return arr;
  461. };
  462. /**
  463. * This function removes all elements present in one array from the other.
  464. *
  465. * @params rem array from which each element is removed from other array.
  466. * @params arr array from which elements are removed.
  467. *
  468. */
  469. DesignerHistory.removeArray = function (rem, arr) {
  470. var remLength = rem.length;
  471. for (var i = 0; i < remLength; i++) {
  472. var arrLength = arr.length;
  473. for (var j = 0; j < arrLength; j++) {
  474. if (rem[i] === arr[j]) {
  475. arr.splice(j, 1);
  476. }
  477. }
  478. }
  479. return arr;
  480. };
  481. /**
  482. * This function builds the groupby clause from history object
  483. *
  484. */
  485. DesignerHistory.queryGroupBy = function () {
  486. var i;
  487. var str = '';
  488. var historyArrayLength = historyArray.length;
  489. for (i = 0; i < historyArrayLength; i++) {
  490. if (historyArray[i].getType() === 'GroupBy') {
  491. str += '`' + historyArray[i].getColumnName() + '`, ';
  492. }
  493. }
  494. str = str.substr(0, str.length - 2);
  495. return str;
  496. };
  497. /**
  498. * This function builds the Having clause from the history object.
  499. *
  500. */
  501. DesignerHistory.queryHaving = function () {
  502. var i;
  503. var and = '(';
  504. var historyArrayLength = historyArray.length;
  505. for (i = 0; i < historyArrayLength; i++) {
  506. if (historyArray[i].getType() === 'Having') {
  507. if (historyArray[i].getObj().getOperator() !== 'None') {
  508. and += historyArray[i].getObj().getOperator() + '(`' + historyArray[i].getColumnName() + '`) ' + historyArray[i].getObj().getRelationOperator();
  509. and += ' ' + historyArray[i].getObj().getQuery() + ', ';
  510. } else {
  511. and += '`' + historyArray[i].getColumnName() + '` ' + historyArray[i].getObj().getRelationOperator() + ' ' + historyArray[i].getObj().getQuery() + ', ';
  512. }
  513. }
  514. }
  515. if (and === '(') {
  516. and = '';
  517. } else {
  518. and = and.substr(0, and.length - 2) + ')';
  519. }
  520. return and;
  521. };
  522. /**
  523. * This function builds the orderby clause from the history object.
  524. *
  525. */
  526. DesignerHistory.queryOrderBy = function () {
  527. var i;
  528. var str = '';
  529. var historyArrayLength = historyArray.length;
  530. for (i = 0; i < historyArrayLength; i++) {
  531. if (historyArray[i].getType() === 'OrderBy') {
  532. str += '`' + historyArray[i].getColumnName() + '` ' + historyArray[i].getObj().getOrder() + ', ';
  533. }
  534. }
  535. str = str.substr(0, str.length - 2);
  536. return str;
  537. };
  538. /**
  539. * This function builds the Where clause from the history object.
  540. *
  541. */
  542. DesignerHistory.queryWhere = function () {
  543. var i;
  544. var and = '(';
  545. var or = '(';
  546. var historyArrayLength = historyArray.length;
  547. for (i = 0; i < historyArrayLength; i++) {
  548. if (historyArray[i].getType() === 'Where') {
  549. if (historyArray[i].getAndOr() === 0) {
  550. and += '( `' + historyArray[i].getColumnName() + '` ' + historyArray[i].getObj().getRelationOperator() + ' ' + historyArray[i].getObj().getQuery() + ')';
  551. and += ' AND ';
  552. } else {
  553. or += '( `' + historyArray[i].getColumnName() + '` ' + historyArray[i].getObj().getRelationOperator() + ' ' + historyArray[i].getObj().getQuery() + ')';
  554. or += ' OR ';
  555. }
  556. }
  557. }
  558. if (or !== '(') {
  559. or = or.substring(0, or.length - 4) + ')';
  560. } else {
  561. or = '';
  562. }
  563. if (and !== '(') {
  564. and = and.substring(0, and.length - 5) + ')';
  565. } else {
  566. and = '';
  567. }
  568. if (or !== '') {
  569. and = and + ' OR ' + or + ' )';
  570. }
  571. return and;
  572. };
  573. DesignerHistory.checkAggregate = function (idThis) {
  574. var i;
  575. var historyArrayLength = historyArray.length;
  576. for (i = 0; i < historyArrayLength; i++) {
  577. var temp = '`' + historyArray[i].getTab() + '`.`' + historyArray[i].getColumnName() + '`';
  578. if (temp === idThis && historyArray[i].getType() === 'Aggregate') {
  579. return historyArray[i].getObj().getOperator() + '(' + idThis + ')';
  580. }
  581. }
  582. return '';
  583. };
  584. DesignerHistory.checkRename = function (idThis) {
  585. var i;
  586. var historyArrayLength = historyArray.length;
  587. for (i = 0; i < historyArrayLength; i++) {
  588. var temp = '`' + historyArray[i].getTab() + '`.`' + historyArray[i].getColumnName() + '`';
  589. if (temp === idThis && historyArray[i].getType() === 'Rename') {
  590. return ' AS `' + historyArray[i].getObj().getRenameTo() + '`';
  591. }
  592. }
  593. return '';
  594. };
  595. /**
  596. * This function builds from clause of query
  597. * makes automatic joins.
  598. *
  599. *
  600. */
  601. DesignerHistory.queryFrom = function () {
  602. var i;
  603. var tabLeft = [];
  604. var tabUsed = [];
  605. var tTabLeft = [];
  606. var temp;
  607. var query = '';
  608. var quer = '';
  609. var parts = [];
  610. var tArray = [];
  611. tArray = fromArray;
  612. var K = 0;
  613. var k;
  614. var key;
  615. var key2;
  616. var key3;
  617. var parts1; // the constraints that have been used in the LEFT JOIN
  618. var constraintsAdded = [];
  619. var historyArrayLength = historyArray.length;
  620. for (i = 0; i < historyArrayLength; i++) {
  621. fromArray.push(historyArray[i].getTab());
  622. }
  623. fromArray = DesignerHistory.unique(fromArray);
  624. tabLeft = fromArray;
  625. temp = tabLeft.shift();
  626. quer = '`' + temp + '`';
  627. tabUsed.push(temp); // if master table (key2) matches with tab used get all keys and check if tab_left matches
  628. // after this check if master table (key2) matches with tab left then check if any foreign matches with master .
  629. for (i = 0; i < 2; i++) {
  630. for (K in contr) {
  631. for (key in contr[K]) {
  632. // contr name
  633. for (key2 in contr[K][key]) {
  634. // table name
  635. parts = key2.split('.');
  636. if (DesignerHistory.found(tabUsed, parts[1]) > 0) {
  637. for (key3 in contr[K][key][key2]) {
  638. parts1 = contr[K][key][key2][key3][0].split('.');
  639. if (DesignerHistory.found(tabLeft, parts1[1]) > 0) {
  640. if (DesignerHistory.found(constraintsAdded, key) > 0) {
  641. query += ' AND ' + '`' + parts[1] + '`.`' + key3 + '` = ';
  642. query += '`' + parts1[1] + '`.`' + contr[K][key][key2][key3][1] + '` ';
  643. } else {
  644. query += '\n' + 'LEFT JOIN ';
  645. query += '`' + parts[1] + '` ON ';
  646. query += '`' + parts1[1] + '`.`' + contr[K][key][key2][key3][1] + '` = ';
  647. query += '`' + parts[1] + '`.`' + key3 + '` ';
  648. constraintsAdded.push(key);
  649. }
  650. tTabLeft.push(parts[1]);
  651. }
  652. }
  653. }
  654. }
  655. }
  656. }
  657. K = 0;
  658. tTabLeft = DesignerHistory.unique(tTabLeft);
  659. tabUsed = DesignerHistory.addArray(tTabLeft, tabUsed);
  660. tabLeft = DesignerHistory.removeArray(tTabLeft, tabLeft);
  661. tTabLeft = [];
  662. for (K in contr) {
  663. for (key in contr[K]) {
  664. for (key2 in contr[K][key]) {
  665. // table name
  666. parts = key2.split('.');
  667. if (DesignerHistory.found(tabLeft, parts[1]) > 0) {
  668. for (key3 in contr[K][key][key2]) {
  669. parts1 = contr[K][key][key2][key3][0].split('.');
  670. if (DesignerHistory.found(tabUsed, parts1[1]) > 0) {
  671. if (DesignerHistory.found(constraintsAdded, key) > 0) {
  672. query += ' AND ' + '`' + parts[1] + '`.`' + key3 + '` = ';
  673. query += '`' + parts1[1] + '`.`' + contr[K][key][key2][key3][1] + '` ';
  674. } else {
  675. query += '\n' + 'LEFT JOIN ';
  676. query += '`' + parts[1] + '` ON ';
  677. query += '`' + parts1[1] + '`.`' + contr[K][key][key2][key3][1] + '` = ';
  678. query += '`' + parts[1] + '`.`' + key3 + '` ';
  679. constraintsAdded.push(key);
  680. }
  681. tTabLeft.push(parts[1]);
  682. }
  683. }
  684. }
  685. }
  686. }
  687. }
  688. tTabLeft = DesignerHistory.unique(tTabLeft);
  689. tabUsed = DesignerHistory.addArray(tTabLeft, tabUsed);
  690. tabLeft = DesignerHistory.removeArray(tTabLeft, tabLeft);
  691. tTabLeft = [];
  692. }
  693. for (k in tabLeft) {
  694. quer += ' , `' + tabLeft[k] + '`';
  695. }
  696. query = quer + query;
  697. fromArray = tArray;
  698. return query;
  699. };
  700. /**
  701. * This function is the main function for query building.
  702. * uses history object details for this.
  703. *
  704. * @uses DesignerHistory.queryWhere()
  705. * @uses DesignerHistory.queryGroupBy()
  706. * @uses DesignerHistory.queryHaving()
  707. * @uses DesignerHistory.queryOrderBy()
  708. */
  709. DesignerHistory.buildQuery = function () {
  710. var qSelect = 'SELECT ';
  711. var temp;
  712. var selectFieldLength = selectField.length;
  713. if (selectFieldLength > 0) {
  714. for (var i = 0; i < selectFieldLength; i++) {
  715. temp = DesignerHistory.checkAggregate(selectField[i]);
  716. if (temp !== '') {
  717. qSelect += temp;
  718. temp = DesignerHistory.checkRename(selectField[i]);
  719. qSelect += temp + ', ';
  720. } else {
  721. temp = DesignerHistory.checkRename(selectField[i]);
  722. qSelect += selectField[i] + temp + ', ';
  723. }
  724. }
  725. qSelect = qSelect.substring(0, qSelect.length - 2);
  726. } else {
  727. qSelect += '* ';
  728. }
  729. qSelect += '\nFROM ' + DesignerHistory.queryFrom();
  730. var qWhere = DesignerHistory.queryWhere();
  731. if (qWhere !== '') {
  732. qSelect += '\nWHERE ' + qWhere;
  733. }
  734. var qGroupBy = DesignerHistory.queryGroupBy();
  735. if (qGroupBy !== '') {
  736. qSelect += '\nGROUP BY ' + qGroupBy;
  737. }
  738. var qHaving = DesignerHistory.queryHaving();
  739. if (qHaving !== '') {
  740. qSelect += '\nHAVING ' + qHaving;
  741. }
  742. var qOrderBy = DesignerHistory.queryOrderBy();
  743. if (qOrderBy !== '') {
  744. qSelect += '\nORDER BY ' + qOrderBy;
  745. }
  746. /**
  747. * @var button_options Object containing options
  748. * for jQueryUI dialog buttons
  749. */
  750. var buttonOptions = {};
  751. buttonOptions[Messages.strClose] = function () {
  752. $(this).dialog('close');
  753. };
  754. buttonOptions[Messages.strSubmit] = function () {
  755. if (vqbEditor) {
  756. var $elm = $ajaxDialog.find('textarea');
  757. vqbEditor.save();
  758. $elm.val(vqbEditor.getValue());
  759. }
  760. $('#vqb_form').trigger('submit');
  761. };
  762. var $ajaxDialog = $('#box').dialog({
  763. appendTo: '#page_content',
  764. width: 500,
  765. buttons: buttonOptions,
  766. modal: true,
  767. title: 'SELECT'
  768. }); // Attach syntax highlighted editor to query dialog
  769. /**
  770. * @var $elm jQuery object containing the reference
  771. * to the query textarea.
  772. */
  773. var $elm = $ajaxDialog.find('textarea');
  774. if (!vqbEditor) {
  775. vqbEditor = Functions.getSqlEditor($elm);
  776. }
  777. if (vqbEditor) {
  778. vqbEditor.setValue(qSelect);
  779. vqbEditor.focus();
  780. } else {
  781. $elm.val(qSelect);
  782. $elm.trigger('focus');
  783. }
  784. };
  785. AJAX.registerTeardown('designer/history.js', function () {
  786. vqbEditor = null;
  787. historyArray = [];
  788. selectField = [];
  789. $('#ok_edit_rename').off('click');
  790. $('#ok_edit_having').off('click');
  791. $('#ok_edit_Aggr').off('click');
  792. $('#ok_edit_where').off('click');
  793. });
  794. AJAX.registerOnload('designer/history.js', function () {
  795. $('#ok_edit_rename').on('click', function () {
  796. DesignerHistory.edit('Rename');
  797. });
  798. $('#ok_edit_having').on('click', function () {
  799. DesignerHistory.edit('Having');
  800. });
  801. $('#ok_edit_Aggr').on('click', function () {
  802. DesignerHistory.edit('Aggregate');
  803. });
  804. $('#ok_edit_where').on('click', function () {
  805. DesignerHistory.edit('Where');
  806. });
  807. $('#ab').accordion({
  808. collapsible: true,
  809. active: 'none'
  810. });
  811. });