query_generator.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. "use strict";
  2. /**
  3. * @fileoverview function used in QBE for DB
  4. * @name Database Operations
  5. *
  6. * @requires jQuery
  7. * @requires jQueryUI
  8. * @requires js/functions.js
  9. *
  10. */
  11. /* global sprintf */
  12. // js/vendor/sprintf.js
  13. function getFormatsText() {
  14. return {
  15. '=': ' = \'%s\'',
  16. '>': ' > \'%s\'',
  17. '>=': ' >= \'%s\'',
  18. '<': ' < \'%s\'',
  19. '<=': ' <= \'%s\'',
  20. '!=': ' != \'%s\'',
  21. 'LIKE': ' LIKE \'%s\'',
  22. 'LIKE %...%': ' LIKE \'%%%s%%\'',
  23. 'NOT LIKE': ' NOT LIKE \'%s\'',
  24. 'BETWEEN': ' BETWEEN \'%s\'',
  25. 'NOT BETWEEN': ' NOT BETWEEN \'%s\'',
  26. 'IS NULL': ' \'%s\' IS NULL',
  27. 'IS NOT NULL': ' \'%s\' IS NOT NULL',
  28. 'REGEXP': ' REGEXP \'%s\'',
  29. 'REGEXP ^...$': ' REGEXP \'^%s$\'',
  30. 'NOT REGEXP': ' NOT REGEXP \'%s\''
  31. };
  32. }
  33. function generateCondition(criteriaDiv, table) {
  34. var query = '`' + Functions.escapeBacktick(table.val()) + '`.';
  35. query += '`' + Functions.escapeBacktick(table.siblings('.columnNameSelect').first().val()) + '`';
  36. if (criteriaDiv.find('.criteria_rhs').first().val() === 'text') {
  37. var formatsText = getFormatsText();
  38. query += sprintf(formatsText[criteriaDiv.find('.criteria_op').first().val()], Functions.escapeSingleQuote(criteriaDiv.find('.rhs_text_val').first().val()));
  39. } else {
  40. query += ' ' + criteriaDiv.find('.criteria_op').first().val();
  41. query += ' `' + Functions.escapeBacktick(criteriaDiv.find('.tableNameSelect').first().val()) + '`.';
  42. query += '`' + Functions.escapeBacktick(criteriaDiv.find('.columnNameSelect').first().val()) + '`';
  43. }
  44. return query;
  45. } // eslint-disable-next-line no-unused-vars
  46. function generateWhereBlock() {
  47. var count = 0;
  48. var query = '';
  49. $('.tableNameSelect').each(function () {
  50. var criteriaDiv = $(this).siblings('.slide-wrapper').first();
  51. var useCriteria = $(this).siblings('.criteria_col').first();
  52. if ($(this).val() !== '' && useCriteria.prop('checked')) {
  53. if (count > 0) {
  54. criteriaDiv.find('input.logical_op').each(function () {
  55. if ($(this).prop('checked')) {
  56. query += ' ' + $(this).val() + ' ';
  57. }
  58. });
  59. }
  60. query += generateCondition(criteriaDiv, $(this));
  61. count++;
  62. }
  63. });
  64. return query;
  65. }
  66. function generateJoin(newTable, tableAliases, fk) {
  67. var query = '';
  68. query += ' \n\tLEFT JOIN ' + '`' + Functions.escapeBacktick(newTable) + '`';
  69. if (tableAliases[fk.TABLE_NAME][0] !== '') {
  70. query += ' AS `' + Functions.escapeBacktick(tableAliases[newTable][0]) + '`';
  71. query += ' ON `' + Functions.escapeBacktick(tableAliases[fk.TABLE_NAME][0]) + '`';
  72. } else {
  73. query += ' ON `' + Functions.escapeBacktick(fk.TABLE_NAME) + '`';
  74. }
  75. query += '.`' + fk.COLUMN_NAME + '`';
  76. if (tableAliases[fk.REFERENCED_TABLE_NAME][0] !== '') {
  77. query += ' = `' + Functions.escapeBacktick(tableAliases[fk.REFERENCED_TABLE_NAME][0]) + '`';
  78. } else {
  79. query += ' = `' + Functions.escapeBacktick(fk.REFERENCED_TABLE_NAME) + '`';
  80. }
  81. query += '.`' + fk.REFERENCED_COLUMN_NAME + '`';
  82. return query;
  83. }
  84. function existReference(table, fk, usedTables) {
  85. var isReferredBy = fk.TABLE_NAME === table && usedTables.includes(fk.REFERENCED_TABLE_NAME);
  86. var isReferencedBy = fk.REFERENCED_TABLE_NAME === table && usedTables.includes(fk.TABLE_NAME);
  87. return isReferredBy || isReferencedBy;
  88. }
  89. function tryJoinTable(table, tableAliases, usedTables, foreignKeys) {
  90. for (var i = 0; i < foreignKeys.length; i++) {
  91. var fk = foreignKeys[i];
  92. if (existReference(table, fk, usedTables)) {
  93. return generateJoin(table, tableAliases, fk);
  94. }
  95. }
  96. return '';
  97. }
  98. function appendTable(table, tableAliases, usedTables, foreignKeys) {
  99. var query = tryJoinTable(table, tableAliases, usedTables, foreignKeys);
  100. if (query === '') {
  101. if (usedTables.length > 0) {
  102. query += '\n\t, ';
  103. }
  104. query += '`' + Functions.escapeBacktick(table) + '`';
  105. if (tableAliases[table][0] !== '') {
  106. query += ' AS `' + Functions.escapeBacktick(tableAliases[table][0]) + '`';
  107. }
  108. }
  109. usedTables.push(table);
  110. return query;
  111. } // eslint-disable-next-line no-unused-vars
  112. function generateFromBlock(tableAliases, foreignKeys) {
  113. var usedTables = [];
  114. var query = '';
  115. for (var table in tableAliases) {
  116. if (tableAliases.hasOwnProperty(table)) {
  117. query += appendTable(table, tableAliases, usedTables, foreignKeys);
  118. }
  119. }
  120. return query;
  121. }