Skip to content

Commit

Permalink
Added possibility to strip statement delimiter from parsed statements
Browse files Browse the repository at this point in the history
  • Loading branch information
tobiasstadler authored and bartoszmajsak committed Mar 15, 2017
1 parent 22430f1 commit 47e5a01
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 7 deletions.
Expand Up @@ -46,6 +46,8 @@ public class ScriptingConfiguration extends Configuration {
private TestExecutionPhase defaultCleanupUsingScriptPhase = TestExecutionPhase.AFTER;

private String sqlStatementDelimiter = ";";

private boolean trimSqlStatementDelimiter = false;

private boolean showSql = false;

Expand Down Expand Up @@ -115,6 +117,17 @@ public String getSqlStatementDelimiter() {
public void setSqlStatementDelimiter(String sqlStatementDelimiter) {
this.sqlStatementDelimiter = sqlStatementDelimiter;
}

public boolean isTrimSqlStatementDelimiter() {
return trimSqlStatementDelimiter;
}

/**
* @param trimSqlStatementDelimiter Defines if the statement delimiter should be removed from the parsed statements. Default value: false
*/
public void setTrimSqlStatementDelimiter(boolean trimSqlStatementDelimiter) {
this.trimSqlStatementDelimiter = trimSqlStatementDelimiter;
}

public boolean isShowSql() {
return showSql;
Expand Down
Expand Up @@ -55,14 +55,17 @@ public class DefaultStatementSplitter implements StatementSplitter {

private static final String CHAR_SEQUENCE_PATTERN = "(?m)'([^']*)'|\"([^\"]*)\"";

private static final String ANSI_SQL_COMMENTS_PATTERN = "--.*|//.*|(?s)/\\*.*?\\*/|(?s)\\{.*?\\}";
private static final String ANSI_SQL_COMMENTS_PATTERN = "--.*|//.*|(?s)/\\*.*?\\*/|(?s)\\{.*?}";

private static final String LINE_SEPARATOR = System.getProperty("line.separator", "\n");

private String statementDelimiter;

private boolean trimStatementDelimiter;

public DefaultStatementSplitter() {
this.statementDelimiter = ";";
this.trimStatementDelimiter = false;
}

public DefaultStatementSplitter(String statementDelimiter) {
Expand All @@ -73,6 +76,11 @@ public DefaultStatementSplitter(String statementDelimiter) {
public void setStatementDelimiter(String statementDelimiter) {
this.statementDelimiter = statementDelimiter;
}

@Override
public void setTrimStatementDelimiter(boolean trimStatementDelimiter) {
this.trimStatementDelimiter = trimStatementDelimiter;
}

@Override
public String supports() {
Expand Down Expand Up @@ -155,6 +163,10 @@ private String trim(String line) {
String trimmed = new SpecialCharactersReplacer().unescape(line.trim());
if (!lineIsStatementDelimiter(line)) {
trimmed.replace(LINE_SEPARATOR, " ");

if (trimStatementDelimiter && trimmed.endsWith(statementDelimiter)) {
return trimmed.substring(0, trimmed.length() - statementDelimiter.length());
}
}
return trimmed;
}
Expand Down
Expand Up @@ -43,6 +43,7 @@ public StatementSplitter resolve() {
}
resolved = statementSplitter;
resolved.setStatementDelimiter(scriptingConfiguration.getSqlStatementDelimiter());
resolved.setTrimStatementDelimiter(scriptingConfiguration.isTrimSqlStatementDelimiter());
}
}

Expand Down
Expand Up @@ -61,11 +61,14 @@ public class OracleStatementSplitter implements StatementSplitter {

private final static Pattern BLOCK_START_PATTERN = Pattern.compile(BLOCK_START, Pattern.CASE_INSENSITIVE);

private String statementDelimiter;

@Override
public void setStatementDelimiter(String statementDelimiter) {
this.statementDelimiter = statementDelimiter;
// NOOP not relevant in this case
}

@Override
public void setTrimStatementDelimiter(boolean trimStatementDelimiter) {
// NOOP not relevant in this case
}

@Override
Expand All @@ -80,10 +83,10 @@ public List<String> splitStatements(String script) {

@Override
public List<String> splitStatements(Reader reader) {
LineNumberReader lineReader = new LineNumberReader(reader);
StringBuilder sqlBuffer = new StringBuilder();
final LineNumberReader lineReader = new LineNumberReader(reader);
final StringBuilder sqlBuffer = new StringBuilder();

final ArrayList<String> statements = new ArrayList<String>();
final List<String> statements = new ArrayList<String>();
try {
boolean plSqlMode = false;
String line;
Expand Down
@@ -0,0 +1,88 @@
/*
* Copyright 2017 JBoss by Red Hat.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.arquillian.persistence.script.splitter;

import org.junit.Test;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

public class DefaultStatementSplitterTest {

@Test
public void should_not_remove_delimiter_if_delimiter_is_not_present() {
// given
String script = "SELECT * FROM TEST";

DefaultStatementSplitter splitter = new DefaultStatementSplitter();
splitter.setTrimStatementDelimiter(true);

// when
List<String> statements = splitter.splitStatements(script);

// then
assertThat(statements).containsExactly("SELECT * FROM TEST");
}

@Test
public void should_remove_delimiter_on_single_statement() {
// given
String script = "SELECT * FROM TEST;";

DefaultStatementSplitter splitter = new DefaultStatementSplitter();
splitter.setTrimStatementDelimiter(true);

// when
List<String> statements = splitter.splitStatements(script);

// then
assertThat(statements).containsExactly("SELECT * FROM TEST");
}

@Test
public void should_remove_delimiter_on_multiple_statements() {
// given
String script = "SELECT * FROM TEST1;SELECT * FROM TEST2;";

DefaultStatementSplitter splitter = new DefaultStatementSplitter();
splitter.setTrimStatementDelimiter(true);

// when
List<String> statements = splitter.splitStatements(script);

// then
assertThat(statements).containsExactly("SELECT * FROM TEST1", "SELECT * FROM TEST2");
}

@Test
public void should_remove_delimiter_on_multiline_statements() {
// given
String script = "SELECT * FROM TEST1;\n" +
"SELECT * FROM TEST2;\n" +
"SELECT * FROM TEST3;\n";

DefaultStatementSplitter splitter = new DefaultStatementSplitter();
splitter.setTrimStatementDelimiter(true);

// when
List<String> statements = splitter.splitStatements(script);

// then
assertThat(statements).containsExactly("SELECT * FROM TEST1", "SELECT * FROM TEST2", "SELECT * FROM TEST3");
}

}
Expand Up @@ -45,6 +45,13 @@ public interface StatementSplitter {
*/
void setStatementDelimiter(String statementDelimiter);

/**
* Defines if the statement delimiter should be removed from the parsed statement
*
* @param trimStatementDelimiter
*/
void setTrimStatementDelimiter(boolean trimStatementDelimiter);

/**
* Splits given script into executable statements
*
Expand Down

0 comments on commit 47e5a01

Please sign in to comment.