Распознавание образов операторов SQL

У меня проблема с сопоставлением текстового шаблона, с которой я мог бы использовать какое-то направление. Не очень хорошо знакомый с распознаванием образов в целом, я не знаю, является ли это одним из тех "о, просто используйте бла-бла", или это действительно сложная проблема с образцами.

Общее утверждение о том, что я хочу сделать, - идентифицировать сходство между сериями операторов SQL, чтобы позволить мне преобразовать эти операторы в меньшее количество хранимых процедур или других динамически генерируемых фрагментов SQL. Например,

SELECT MIN(foo) FROM bar WHERE baz > 123;
SELECT MIN(footer) FROM bar;
SELECT MIN(foo), baz FROM bar;

все они одинаковы, но я хотел бы признать, что значение в MIN() должно быть заменяемым, что у меня может быть другой столбец в списке SELECT или необязательное предложение WHERE. Обратите внимание, что этот пример очень хорошо подготовлен, но я надеюсь, что он позволит вам увидеть, что я за ним.

С точки зрения области, у меня был бы набор тысяч операторов SQL, которые я хотел бы сократить до десятков (?) Общих операторов. До сих пор в исследованиях я сталкивался с w-черепицей и n-граммами и отказывался от таких подходов, как "мешок слов", потому что порядок важен. Если исключить это из области SQL, другим способом постановки этой проблемы может быть "учитывая последовательность текстовых операторов, какой минимальный набор текстовых фрагментов можно использовать для повторной сборки этих операторов?"

2 ответа

Решение

Что вы действительно хотите, так это найти клоны кода по всей базе кода.

Есть много способов сделать это, но большинство из них, кажется, игнорируют структуру, которую приносит язык (SQL). Эта структура облегчает поиск элементов кода, которые имеют концептуальный смысл, в отличие от, скажем, N-граммы (да, "ОТ x ГДЕ" встречается часто, но представляет собой неловкий кусок SQL).

Моя схема обнаружения клонов на основе абстрактного синтаксического дерева (AST) анализирует исходный текст в AST, а затем находит общие деревья, которые можно параметризовать таким образом, чтобы получить разумные обобщения, используя грамматику языка в качестве руководства. Смотрите мою техническую статью Обнаружение клонов с использованием абстрактных синтаксических деревьев.

Что касается примера OP:

  • Он признает, что значение внутри MIN() должно быть заменяемым
  • что одноэлементный столбец SELECT может быть расширен до списка
  • и что предложение WHERE является необязательным

Он не будет пытаться вносить эти предложения, если не найдет двух кандидатов в клоны, которые отличаются по способу объяснения этих обобщений. Он получает обобщения в основном путем извлечения их из (SQL) грамматики. Примеры OP имеют достаточно вариаций, чтобы заставить эти обобщения.

Обзор методов обнаружения клонов ( Сравнение и оценка методов и инструментов обнаружения клонов кода: Качественный подход) оценил этот подход на вершине примерно 30 различных методов обнаружения клонов; см. таблицу 14.

Вопрос слишком широкий, но я бы посоветовал дать следующий подход:

Это звучит как проблема кластеризации документов, когда у вас есть набор фрагментов текста (операторы SQL), и вы хотите сгруппировать их вместе, чтобы определить, находятся ли некоторые операторы рядом друг с другом. Теперь уловка заключается в измерении расстояния между текстовыми утверждениями. Я бы попробовал что-то вроде редактирования расстояния

В общем, следующий подход может работать:

  • Сделайте некоторую предварительную обработку ваших SQL-операторов. Токенизация, удаление некоторых слов из операторов и т. Д. Просто будьте осторожны - вы не анализируете только текст на естественном языке, это операторы SQL, поэтому вам понадобится умный подход.
  • После этого попробуйте написать функцию, которая будет считать расстояние между 2 sql запросами. Расстояние редактирования должно работать на вас.
  • Наконец, попробуйте запустить кластеризацию документов для всех ваших SQL-запросов, используя расстояние редактирования в качестве меры расстояния для алгоритма кластеризации.

Надеюсь, это поможет.

Другие вопросы по тегам