функция JavaScript, дающая NULL внутри функции снежинки - PullRequest
0 голосов
/ 05 мая 2019

Я создал функцию внутри снежинки, используя Javascript для вычисления расстояния до строки. Однако функция дает мне значения NULL. Я не могу отладить функцию.

Код:

CREATE OR REPLACE FUNCTION cat_map_trial4(a string,b string)
RETURNS STRING
LANGUAGE JAVASCRIPT
AS
$$
function levenshteinDistance(s1, s2) {
    if (!s1.length) return toString(s2.length);
    if (!s2.length) return toString(s1.length);

    return toString(Math.min(
        levenshteinDistance(s1.substr(1), s2) + 1,
        levenshteinDistance(s2.substr(1), s1) + 1,
        levenshteinDistance(s1.substr(1), s2.substr(1)) + (s1[0] !== s2[0] ? 1 : 0)
    ) + 1);
}
$$


select cat_map_trial4('stackoverflow', 'stack') as dist;

выход

dist
NULL

Что не так с Javascript? Любая помощь будет оценена. Спасибо.

1 Ответ

1 голос
/ 05 мая 2019

В вашем коде есть ряд проблем

  • вы определяете функцию, но не используете ее, вам нужно добавить вызов в конце
  • вы неправильно используете toString, если вы настаиваете на строках, используйте String (значение)
  • если вы используете строки, вы не можете добавить их с помощью '+', чтобы добавить их числовые значения ...
  • у вас есть лишний +1 в конце
  • вы используете очень медленную реализацию этого алгоритма, вы должны использовать что-то более быстрое, читайте различные способы его вычисления

Вот исправленная версия (все еще медленная, но работает):

CREATE OR REPLACE FUNCTION cat_map_trial4(a string,b string)
RETURNS STRING
LANGUAGE JAVASCRIPT
AS
$$
function levenshteinDistance(s1, s2) {
    if (!s1.length) return s2.length;
    if (!s2.length) return s1.length;
    return Math.min(
        levenshteinDistance(s1.substr(1), s2) + 1,
        levenshteinDistance(s2.substr(1), s1) + 1,
        levenshteinDistance(s1.substr(1), s2.substr(1)) + (s1[0] !== s2[0] ? 1 : 0)
    );
}
return levenshteinDistance(A, B);
$$;

Но самая большая проблема с вашим кодом в том, что он совершенно не нужен , так как Snowflake, будучи таким же крутым, обеспечивает встроенную быструю EDITDISTANCE функцию: )

...