|
|
@@ -29,9 +29,10 @@ import { DIALECT } from 'apps/notebook2/snippet';
|
|
|
import { cancelActiveRequest } from 'api/apiUtils';
|
|
|
import { findBrowserConnector, getRootFilePath } from 'utils/hueConfig';
|
|
|
import {
|
|
|
- findFunction,
|
|
|
- getArgumentTypes,
|
|
|
- getFunctionsWithReturnTypes,
|
|
|
+ findUdf,
|
|
|
+ getArgumentTypesForUdf,
|
|
|
+ getUdfsWithReturnTypes,
|
|
|
+ getReturnTypesForUdf,
|
|
|
getSetOptions
|
|
|
} from './reference/sqlReferenceRepository';
|
|
|
|
|
|
@@ -477,7 +478,7 @@ class AutocompleteResults {
|
|
|
|
|
|
self.handleKeywords(colRefDeferred);
|
|
|
self.handleIdentifiers();
|
|
|
- self.handleColumnAliases();
|
|
|
+ self.activeDeferrals.push(self.handleColumnAliases());
|
|
|
self.handleCommonTableExpressions();
|
|
|
self.activeDeferrals.push(self.handleOptions());
|
|
|
self.activeDeferrals.push(self.handleFunctions(colRefDeferred));
|
|
|
@@ -507,7 +508,7 @@ class AutocompleteResults {
|
|
|
|
|
|
async adjustForUdfArgument() {
|
|
|
return new Promise(async resolve => {
|
|
|
- const foundArgumentTypes = (await getArgumentTypes(
|
|
|
+ const foundArgumentTypes = (await getArgumentTypesForUdf(
|
|
|
this.snippet.connector(),
|
|
|
this.parseResult.udfArgument.name,
|
|
|
this.parseResult.udfArgument.position
|
|
|
@@ -665,8 +666,10 @@ class AutocompleteResults {
|
|
|
|
|
|
handleColumnAliases() {
|
|
|
const self = this;
|
|
|
+ const deferrals = [];
|
|
|
+ const columnAliasesDeferred = $.Deferred();
|
|
|
+ const columnAliasSuggestions = [];
|
|
|
if (self.parseResult.suggestColumnAliases) {
|
|
|
- const columnAliasSuggestions = [];
|
|
|
self.parseResult.suggestColumnAliases.forEach(columnAlias => {
|
|
|
const type =
|
|
|
columnAlias.types && columnAlias.types.length === 1 ? columnAlias.types[0] : 'T';
|
|
|
@@ -678,6 +681,21 @@ class AutocompleteResults {
|
|
|
popular: ko.observable(false),
|
|
|
details: columnAlias
|
|
|
});
|
|
|
+ } else if (type === 'UDFREF') {
|
|
|
+ const udfDeferred = $.Deferred();
|
|
|
+ deferrals.push(udfDeferred);
|
|
|
+ getReturnTypesForUdf(self.snippet.connector(), columnAlias.udfRef)
|
|
|
+ .then(types => {
|
|
|
+ const resolvedType = types.length === 1 ? types[0] : 'T';
|
|
|
+ columnAliasSuggestions.push({
|
|
|
+ value: columnAlias.name,
|
|
|
+ meta: resolvedType,
|
|
|
+ category: CATEGORIES.COLUMN,
|
|
|
+ popular: ko.observable(false),
|
|
|
+ details: columnAlias
|
|
|
+ });
|
|
|
+ })
|
|
|
+ .finally(udfDeferred.resolve);
|
|
|
} else {
|
|
|
columnAliasSuggestions.push({
|
|
|
value: columnAlias.name,
|
|
|
@@ -688,8 +706,14 @@ class AutocompleteResults {
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
- self.appendEntries(columnAliasSuggestions);
|
|
|
}
|
|
|
+ $.when.apply($, deferrals).always(() => {
|
|
|
+ if (columnAliasSuggestions.length) {
|
|
|
+ self.appendEntries(columnAliasSuggestions);
|
|
|
+ }
|
|
|
+ columnAliasesDeferred.resolve();
|
|
|
+ });
|
|
|
+ return columnAliasesDeferred;
|
|
|
}
|
|
|
|
|
|
handleCommonTableExpressions() {
|
|
|
@@ -748,44 +772,57 @@ class AutocompleteResults {
|
|
|
const functionSuggestions = [];
|
|
|
if (
|
|
|
self.parseResult.suggestFunctions.types &&
|
|
|
- self.parseResult.suggestFunctions.types[0] === 'COLREF'
|
|
|
+ (self.parseResult.suggestFunctions.types[0] === 'COLREF' ||
|
|
|
+ self.parseResult.suggestFunctions.types[0] === 'UDFREF')
|
|
|
) {
|
|
|
initLoading(self.loadingFunctions, colRefDeferred);
|
|
|
|
|
|
- colRefDeferred
|
|
|
- .done(async colRef => {
|
|
|
- const functionsToSuggest = await getFunctionsWithReturnTypes(
|
|
|
- self.snippet.connector(),
|
|
|
- [colRef.type.toUpperCase()],
|
|
|
- self.parseResult.suggestAggregateFunctions || false,
|
|
|
- self.parseResult.suggestAnalyticFunctions || false
|
|
|
- );
|
|
|
+ const addUdfsOfTypes = async types => {
|
|
|
+ const functionsToSuggest = await getUdfsWithReturnTypes(
|
|
|
+ self.snippet.connector(),
|
|
|
+ types,
|
|
|
+ self.parseResult.suggestAggregateFunctions || false,
|
|
|
+ self.parseResult.suggestAnalyticFunctions || false
|
|
|
+ );
|
|
|
|
|
|
- Object.keys(functionsToSuggest).forEach(name => {
|
|
|
- functionSuggestions.push({
|
|
|
- category: CATEGORIES.UDF,
|
|
|
- value: name + '()',
|
|
|
- meta: functionsToSuggest[name].returnTypes.join('|'),
|
|
|
- weightAdjust:
|
|
|
- colRef.type.toUpperCase() !== 'T' &&
|
|
|
- functionsToSuggest[name].returnTypes.some(otherType => {
|
|
|
- return otherType === colRef.type.toUpperCase();
|
|
|
- })
|
|
|
- ? 1
|
|
|
- : 0,
|
|
|
- popular: ko.observable(false),
|
|
|
- details: functionsToSuggest[name]
|
|
|
- });
|
|
|
+ const firstType = types[0].toUpperCase();
|
|
|
+
|
|
|
+ Object.keys(functionsToSuggest).forEach(name => {
|
|
|
+ functionSuggestions.push({
|
|
|
+ category: CATEGORIES.UDF,
|
|
|
+ value: name + '()',
|
|
|
+ meta: functionsToSuggest[name].returnTypes.join('|'),
|
|
|
+ weightAdjust:
|
|
|
+ firstType !== 'T' &&
|
|
|
+ functionsToSuggest[name].returnTypes.some(otherType => otherType === firstType)
|
|
|
+ ? 1
|
|
|
+ : 0,
|
|
|
+ popular: ko.observable(false),
|
|
|
+ details: functionsToSuggest[name]
|
|
|
});
|
|
|
+ });
|
|
|
|
|
|
- self.appendEntries(functionSuggestions);
|
|
|
- functionsDeferred.resolve();
|
|
|
- })
|
|
|
- .fail(functionsDeferred.reject);
|
|
|
+ self.appendEntries(functionSuggestions);
|
|
|
+ functionsDeferred.resolve();
|
|
|
+ };
|
|
|
+
|
|
|
+ if (self.parseResult.suggestFunctions.types[0] === 'COLREF') {
|
|
|
+ colRefDeferred
|
|
|
+ .done(async colRef => {
|
|
|
+ await addUdfsOfTypes([colRef.type.toUpperCase()]);
|
|
|
+ })
|
|
|
+ .fail(functionsDeferred.reject);
|
|
|
+ } else {
|
|
|
+ getReturnTypesForUdf(self.snippet.connector(), self.parseResult.suggestFunctions.udfRef)
|
|
|
+ .then(addUdfsOfTypes)
|
|
|
+ .catch(async () => {
|
|
|
+ await addUdfsOfTypes(['T']);
|
|
|
+ });
|
|
|
+ }
|
|
|
} else {
|
|
|
const types = self.parseResult.suggestFunctions.types || ['T'];
|
|
|
|
|
|
- getFunctionsWithReturnTypes(
|
|
|
+ getUdfsWithReturnTypes(
|
|
|
self.snippet.connector(),
|
|
|
types,
|
|
|
self.parseResult.suggestAggregateFunctions || false,
|
|
|
@@ -992,22 +1029,25 @@ class AutocompleteResults {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
+ const applyTypes = types => {
|
|
|
+ suggestColumns.tables.forEach(table => {
|
|
|
+ columnDeferrals.push(self.addColumns(table, types, columnSuggestions));
|
|
|
+ });
|
|
|
+ waitForCols();
|
|
|
+ };
|
|
|
+
|
|
|
if (suggestColumns.types && suggestColumns.types[0] === 'COLREF') {
|
|
|
colRefDeferred.done(colRef => {
|
|
|
- suggestColumns.tables.forEach(table => {
|
|
|
- columnDeferrals.push(
|
|
|
- self.addColumns(table, [colRef.type.toUpperCase()], columnSuggestions)
|
|
|
- );
|
|
|
- });
|
|
|
- waitForCols();
|
|
|
+ applyTypes([colRef.type.toUpperCase()]);
|
|
|
});
|
|
|
+ } else if (suggestColumns.types && suggestColumns.types[0] === 'UDFREF') {
|
|
|
+ getReturnTypesForUdf(self.snippet.connector(), suggestColumns.udfRef)
|
|
|
+ .then(applyTypes)
|
|
|
+ .catch(() => {
|
|
|
+ applyTypes(['T']);
|
|
|
+ });
|
|
|
} else {
|
|
|
- suggestColumns.tables.forEach(table => {
|
|
|
- columnDeferrals.push(
|
|
|
- self.addColumns(table, suggestColumns.types || ['T'], columnSuggestions)
|
|
|
- );
|
|
|
- });
|
|
|
- waitForCols();
|
|
|
+ applyTypes(suggestColumns.types || ['T']);
|
|
|
}
|
|
|
} else {
|
|
|
columnsDeferred.reject();
|
|
|
@@ -1764,7 +1804,7 @@ class AutocompleteResults {
|
|
|
clean = clean.replace(substitution.replace, substitution.with);
|
|
|
});
|
|
|
|
|
|
- value.function = await findFunction(
|
|
|
+ value.function = await findUdf(
|
|
|
self.snippet.connector(),
|
|
|
value.aggregateFunction
|
|
|
);
|