Я пытаюсь написать собственное правило в сонаре (plsql) с помощью правила копирования xpath. Задача этого правила состоит в том, чтобы пометить инструкцию rollback to savepoint, где отсутствует инструкция сохранения точки.XPath-1.0: отметьте узел, где отсутствует противоположный узел
Для 2 и 3 точки сохранения отката отчетности AST (Abstract Syntax Tree) выглядит следующим образом:
<PROCEDURE_DEFINITION>
...
<SAVEPOINT>
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spA" />
<SEMICOLON tokenValue=";" />
</SAVEPOINT>
...
<SAVEPOINT>
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spB" />
<SEMICOLON tokenValue=";" />
</SAVEPOINT>
...
<ROLLBACK>
<IDENTIFIER tokenValue="ROLLBACK" />
<TO />
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spB" />
<SEMICOLON tokenValue=";" />
</ROLLBACK>
...
<ROLLBACK>
<IDENTIFIER tokenValue="ROLLBACK" />
<TO />
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spA" />
<SEMICOLON tokenValue=";" />
</ROLLBACK>
...
<ROLLBACK>
<IDENTIFIER tokenValue="ROLLBACK" />
<TO />
<IDENTIFIER tokenValue="SAVEPOINT" />
<IDENTIFIER tokenValue="spX" />
<SEMICOLON tokenValue=";" />
</ROLLBACK>
...
</PROCEDURE_DEFINITION>
Я ищу XPath запрос, который отмечает последний откат, потому что точка сохранения SPX отсутствует. Но этот XPath марка последней как откатов
//PROCEDURE_DEFINITION//ROLLBACK[
IDENTIFIER[
@tokenValue =
./ancestor::PROCEDURE_DEFINITION
//SAVEPOINT/IDENTIFIER[2]/@tokenValue
]
]
Любые предложения?
EDIT:
Я нашел это неоптимальное решение:
//PROCEDURE_DEFINITION//ROLLBACK
[
not(
./IDENTIFIER[3]/@tokenValue =
ancestor::PROCEDURE_DEFINITION//SAVEPOINT/IDENTIFIER[2]/@tokenValue
)
]
PLSQL чувствителен к регистру. Но когда я добавляю функцию перевода, я получаю отмеченный первый и последний узел ROLLBACK. Я думаю, что все имена отката будут согласованы с именем первой точки сохранения?
Спасибо Dinesh. Вы догадались, что правильно скорректируйте код PL/SQL (эта процедура является частью пакета). В любом случае ваш запрос xpath wokrs прекрасен. Но он не работает в этом «спасительном резерве SpA; rollback spA;», потому что PL/SQL является случайным по сравнению с XPath. – MintiSE
Вы правы @MintiSE, в то время как это разрешимо в чистом XPath 1.0, у нас есть билет на SSLR, чтобы сделать это намного проще: [SSLR-310] (http://jira.sonarsource.com/browse/SSLR-310) –
Кроме того, FYI, это правило будет включено в следующий выпуск плагинов PL/SQL, поскольку он ценен для всех (а не только для вас): [PLSQL-443] (http://jira.sonarsource.com/browse/ PLSQL-443) –