autocomplete.utils.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. // Licensed to Cloudera, Inc. under one
  2. // or more contributor license agreements. See the NOTICE file
  3. // distributed with this work for additional information
  4. // regarding copyright ownership. Cloudera, Inc. licenses this file
  5. // to you under the Apache License, Version 2.0 (the
  6. // "License"); you may not use this file except in compliance
  7. // with the License. You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. function hac_jsoncalls(options) {
  17. var _url = typeof options.autocompleteBaseURL != "undefined" ? options.autocompleteBaseURL : HIVE_AUTOCOMPLETE_BASE_URL;
  18. if (options.database != null) {
  19. _url += options.database
  20. }
  21. if (options.table != null) {
  22. _url += "/" + options.table
  23. }
  24. $.ajax({
  25. type: "GET",
  26. url: _url,
  27. success: options.onDataReceived,
  28. async: options.sync == "undefined"
  29. });
  30. }
  31. function hac_hasExpired(timestamp){
  32. var TIME_TO_LIVE_IN_MILLIS = 86400000; // 1 day
  33. return (new Date()).getTime() - timestamp > TIME_TO_LIVE_IN_MILLIS;
  34. }
  35. function hac_getTableAliases(textScanned) {
  36. var _aliases = {};
  37. var _val = textScanned.split("\n").join(" ");
  38. var _from = _val.toUpperCase().indexOf("FROM ");
  39. if (_from > -1) {
  40. var _match = _val.toUpperCase().substring(_from).match(/ ON| LIMIT| WHERE| GROUP| SORT| ORDER BY|;/);
  41. var _to = _val.length;
  42. if (_match) {
  43. _to = _match.index;
  44. }
  45. var _found = _val.substr(_from, _to).replace(/(\r\n|\n|\r)/gm, "").replace(/from/gi, "").replace(/join/gi, ",").split(",");
  46. for (var i = 0; i < _found.length; i++) {
  47. var _tablealias = $.trim(_found[i]).split(" ");
  48. if (_tablealias.length > 1) {
  49. _aliases[_tablealias[1]] = _tablealias[0];
  50. }
  51. }
  52. }
  53. return _aliases;
  54. }
  55. function hac_getTotalStorageUserPrefix(){
  56. if (typeof HIVE_AUTOCOMPLETE_USER != "undefined") {
  57. return HIVE_AUTOCOMPLETE_USER + "_";
  58. }
  59. return "";
  60. }
  61. function hac_getTableColumns(databaseName, tableName, textScanned, callback) {
  62. if (tableName.indexOf("(") > -1) {
  63. tableName = tableName.substr(tableName.indexOf("(") + 1);
  64. }
  65. var _aliases = hac_getTableAliases(textScanned);
  66. if (_aliases[tableName]) {
  67. tableName = _aliases[tableName];
  68. }
  69. if ($.totalStorage(hac_getTotalStorageUserPrefix() + 'columns_' + databaseName + '_' + tableName) != null && $.totalStorage(hac_getTotalStorageUserPrefix() + 'extended_columns_' + databaseName + '_' + tableName) != null) {
  70. callback($.totalStorage(hac_getTotalStorageUserPrefix() + 'columns_' + databaseName + '_' + tableName), $.totalStorage(hac_getTotalStorageUserPrefix() + 'extended_columns_' + databaseName + '_' + tableName));
  71. if ($.totalStorage(hac_getTotalStorageUserPrefix() + 'timestamp_columns_' + databaseName + '_' + tableName) == null || hac_hasExpired($.totalStorage(hac_getTotalStorageUserPrefix() + 'timestamp_columns_' + databaseName + '_' + tableName))){
  72. hac_jsoncalls({
  73. database: databaseName,
  74. table: tableName,
  75. onDataReceived: function (data) {
  76. if (typeof HIVE_AUTOCOMPLETE_GLOBAL_CALLBACK == "function") {
  77. HIVE_AUTOCOMPLETE_GLOBAL_CALLBACK(data);
  78. }
  79. if (data.error) {
  80. hac_errorHandler(data);
  81. }
  82. else {
  83. $.totalStorage(hac_getTotalStorageUserPrefix() + 'columns_' + databaseName + '_' + tableName, (data.columns ? "* " + data.columns.join(" ") : "*"));
  84. $.totalStorage(hac_getTotalStorageUserPrefix() + 'extended_columns_' + databaseName + '_' + tableName, (data.extended_columns ? data.extended_columns : []));
  85. $.totalStorage(hac_getTotalStorageUserPrefix() + 'timestamp_columns_' + databaseName + '_' + tableName, (new Date()).getTime());
  86. }
  87. }
  88. });
  89. }
  90. }
  91. else {
  92. hac_jsoncalls({
  93. database: databaseName,
  94. table: tableName,
  95. onDataReceived: function (data) {
  96. if (typeof HIVE_AUTOCOMPLETE_GLOBAL_CALLBACK == "function") {
  97. HIVE_AUTOCOMPLETE_GLOBAL_CALLBACK(data);
  98. }
  99. if (data.error) {
  100. hac_errorHandler(data);
  101. }
  102. else {
  103. $.totalStorage(hac_getTotalStorageUserPrefix() + 'columns_' + databaseName + '_' + tableName, (data.columns ? "* " + data.columns.join(" ") : "*"));
  104. $.totalStorage(hac_getTotalStorageUserPrefix() + 'extended_columns_' + databaseName + '_' + tableName, (data.extended_columns ? data.extended_columns : []));
  105. $.totalStorage(hac_getTotalStorageUserPrefix() + 'timestamp_columns_' + databaseName + '_' + tableName, (new Date()).getTime());
  106. callback($.totalStorage(hac_getTotalStorageUserPrefix() + 'columns_' + databaseName + '_' + tableName), $.totalStorage(hac_getTotalStorageUserPrefix() + 'extended_columns_' + databaseName + '_' + tableName));
  107. }
  108. }
  109. });
  110. }
  111. }
  112. function hac_tableHasAlias(tableName, textScanned) {
  113. var _aliases = hac_getTableAliases(textScanned);
  114. for (var alias in _aliases) {
  115. if (_aliases[alias] == tableName) {
  116. return true;
  117. }
  118. }
  119. return false;
  120. }
  121. function hac_getTables(databaseName, callback) {
  122. if ($.totalStorage(hac_getTotalStorageUserPrefix() + 'tables_' + databaseName) != null) {
  123. callback($.totalStorage(hac_getTotalStorageUserPrefix() + 'tables_' + databaseName));
  124. if ($.totalStorage(hac_getTotalStorageUserPrefix() + 'timestamp_tables_' + databaseName) == null || hac_hasExpired($.totalStorage(hac_getTotalStorageUserPrefix() + 'timestamp_tables_' + databaseName))){
  125. hac_jsoncalls({
  126. database: databaseName,
  127. onDataReceived: function (data) {
  128. if (typeof HIVE_AUTOCOMPLETE_GLOBAL_CALLBACK == "function") {
  129. HIVE_AUTOCOMPLETE_GLOBAL_CALLBACK(data);
  130. }
  131. if (data.error) {
  132. hac_errorHandler(data);
  133. }
  134. else {
  135. $.totalStorage(hac_getTotalStorageUserPrefix() + 'tables_' + databaseName, data.tables.join(" "));
  136. $.totalStorage(hac_getTotalStorageUserPrefix() + 'timestamp_tables_' + databaseName, (new Date()).getTime());
  137. }
  138. }
  139. });
  140. }
  141. }
  142. else {
  143. hac_jsoncalls({
  144. database: databaseName,
  145. onDataReceived: function (data) {
  146. if (typeof HIVE_AUTOCOMPLETE_GLOBAL_CALLBACK == "function") {
  147. HIVE_AUTOCOMPLETE_GLOBAL_CALLBACK(data);
  148. }
  149. if (data.error) {
  150. hac_errorHandler(data);
  151. }
  152. else {
  153. if (data.tables) {
  154. $.totalStorage(hac_getTotalStorageUserPrefix() + 'tables_' + databaseName, data.tables.join(" "));
  155. $.totalStorage(hac_getTotalStorageUserPrefix() + 'timestamp_tables_' + databaseName, (new Date()).getTime());
  156. callback($.totalStorage(hac_getTotalStorageUserPrefix() + 'tables_' + databaseName));
  157. }
  158. }
  159. }
  160. });
  161. }
  162. }
  163. function hac_getDatabases(callback) {
  164. if ($.totalStorage(hac_getTotalStorageUserPrefix() + 'databases') != null) {
  165. callback($.totalStorage(hac_getTotalStorageUserPrefix() + 'databases'));
  166. if ($.totalStorage(hac_getTotalStorageUserPrefix() + 'timestamp_databases') == null || hac_hasExpired($.totalStorage(hac_getTotalStorageUserPrefix() + 'timestamp_databases'))){
  167. hac_jsoncalls({
  168. onDataReceived: function (data) {
  169. if (typeof HIVE_AUTOCOMPLETE_GLOBAL_CALLBACK == "function") {
  170. HIVE_AUTOCOMPLETE_GLOBAL_CALLBACK(data);
  171. }
  172. if (data.error) {
  173. hac_errorHandler(data);
  174. }
  175. else {
  176. $.totalStorage(hac_getTotalStorageUserPrefix() + 'databases', data.databases);
  177. $.totalStorage(hac_getTotalStorageUserPrefix() + 'timestamp_databases', (new Date()).getTime());
  178. }
  179. }
  180. });
  181. }
  182. }
  183. else {
  184. hac_jsoncalls({
  185. onDataReceived: function (data) {
  186. if (typeof HIVE_AUTOCOMPLETE_GLOBAL_CALLBACK == "function") {
  187. HIVE_AUTOCOMPLETE_GLOBAL_CALLBACK(data);
  188. }
  189. if (data.error) {
  190. hac_errorHandler(data);
  191. }
  192. else {
  193. if (data.databases) {
  194. $.totalStorage(hac_getTotalStorageUserPrefix() + 'databases', data.databases);
  195. $.totalStorage(hac_getTotalStorageUserPrefix() + 'timestamp_databases', (new Date()).getTime());
  196. callback($.totalStorage(hac_getTotalStorageUserPrefix() + 'databases'));
  197. }
  198. }
  199. }
  200. });
  201. }
  202. }
  203. function hac_errorHandler(data) {
  204. $(document).trigger('error.autocomplete');
  205. if (typeof HIVE_AUTOCOMPLETE_FAILS_SILENTLY_ON == "undefined" || data.code == null || HIVE_AUTOCOMPLETE_FAILS_SILENTLY_ON.indexOf(data.code) == -1){
  206. if (typeof HIVE_AUTOCOMPLETE_FAILS_QUIETLY_ON != "undefined" && HIVE_AUTOCOMPLETE_FAILS_QUIETLY_ON.indexOf(data.code) > -1){
  207. $(document).trigger('info', data.error);
  208. }
  209. else {
  210. $(document).trigger('error', data.error);
  211. }
  212. }
  213. }