Skip to content

Commit

Permalink
Merge pull request #2 from alfasoftware/master
Browse files Browse the repository at this point in the history
Pull alfa master
  • Loading branch information
jonknight73 authored Mar 9, 2021
2 parents 24e20e6 + 326ea3f commit fe91a87
Show file tree
Hide file tree
Showing 22 changed files with 71 additions and 47 deletions.
2 changes: 1 addition & 1 deletion morf-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>org.alfasoftware</groupId>
<artifactId>morf-parent</artifactId>
<version>1.3.4-SNAPSHOT</version>
<version>1.3.5-SNAPSHOT</version>
</parent>

<name>Morf - Core</name>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,20 @@ public class NamedParameterPreparedStatement implements AutoCloseable {
* can be created rapidly.
*
* @param sql the SQL
* @param sqlDialect Dialect of the SQL.
* @return the parsed result
*/
public static ParseResult parseSql(String sql, SqlDialect sqlDialect) {
return new ParseResult(sql, sqlDialect);
}


/**
* @deprecated Use the {@link #parseSql(String, SqlDialect)} method.
*/
@Deprecated
public static ParseResult parse(String sql) {
return new ParseResult(sql);
return new ParseResult(sql, null);
}


Expand Down Expand Up @@ -333,7 +343,13 @@ public NamedParameterPreparedStatement setString(SqlParameter parameter, final S
forEachOccurrenceOfParameter(parameter, new Operation() {
@Override
public void apply(int parameterIndex) throws SQLException {
statement.setString(parameterIndex, value);
// TODO: dialect nullability is deprecated, and should be ousted asap
if (sql.dialect != null && sql.dialect.usesNVARCHARforStrings()) {
statement.setNString(parameterIndex, value);
}
else {
statement.setString(parameterIndex, value);
}
}
});
return this;
Expand Down Expand Up @@ -469,13 +485,15 @@ public String toString() {
public static final class ParseResult {

private final String query;
private final SqlDialect dialect;
private final Map<String, List<Integer>> indexMap = Maps.newHashMap();

/**
* Private constructor.
*/
private ParseResult(String query) {
private ParseResult(String query, SqlDialect sqlDialect) {
this.query = parse(query);
this.dialect = sqlDialect;
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,8 +263,8 @@ public int compare(int[] keyColumns, SelectStatement left, SelectStatement right
*/
public int compare(int[] keyColumns, SelectStatement left, SelectStatement right, Connection leftConnection, Connection rightConnection, CompareCallback callback,
StatementParameters leftStatementParameters, StatementParameters rightStatementParameters) {
try (NamedParameterPreparedStatement statementLeft = NamedParameterPreparedStatement.parse(leftSqlDialect.convertStatementToSQL(left)).createForQueryOn(leftConnection);
NamedParameterPreparedStatement statementRight = NamedParameterPreparedStatement.parse(rightSqlDialect.convertStatementToSQL(right)).createForQueryOn(rightConnection);
try (NamedParameterPreparedStatement statementLeft = NamedParameterPreparedStatement.parseSql(leftSqlDialect.convertStatementToSQL(left), leftSqlDialect).createForQueryOn(leftConnection);
NamedParameterPreparedStatement statementRight = NamedParameterPreparedStatement.parseSql(rightSqlDialect.convertStatementToSQL(right), rightSqlDialect).createForQueryOn(rightConnection);
ResultSet rsLeft = parameteriseAndExecute(statementLeft, left, leftStatementParameters, leftSqlDialect);
ResultSet rsRight = parameteriseAndExecute(statementRight, right, rightStatementParameters, rightSqlDialect)) {
return compare(keyColumns, rsLeft, rsRight, callback);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@

package org.alfasoftware.morf.jdbc;

import static org.alfasoftware.morf.jdbc.NamedParameterPreparedStatement.parse;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
Expand Down Expand Up @@ -287,7 +285,7 @@ public int execute(String sqlStatement, Connection connection, Iterable<SqlParam
int numberOfRowsUpdated = 0;
try {
try {
try (NamedParameterPreparedStatement preparedStatement = NamedParameterPreparedStatement.parse(sqlStatement).createFor(connection)) {
try (NamedParameterPreparedStatement preparedStatement = NamedParameterPreparedStatement.parseSql(sqlStatement, sqlDialect).createFor(connection)) {
sqlDialect.prepareStatementParameters(preparedStatement, parameterMetadata, parameterData);
numberOfRowsUpdated = preparedStatement.executeUpdate();
}
Expand Down Expand Up @@ -521,7 +519,7 @@ private <T> T executeQuery(String sql, Iterable<SqlParameter> parameterMetadata,
Connection connection, ResultSetProcessor<T> resultSetProcessor, Optional<Integer> maxRows, Optional<Integer> queryTimeout,
boolean standalone) {
try {
ParseResult parseResult = parse(sql);
ParseResult parseResult = NamedParameterPreparedStatement.parseSql(sql, sqlDialect);
try (NamedParameterPreparedStatement preparedStatement = standalone ? parseResult.createForQueryOn(connection) : parseResult.createFor(connection)) {
if (standalone) {
preparedStatement.setFetchSize(sqlDialect.fetchSizeForBulkSelects());
Expand Down Expand Up @@ -599,7 +597,7 @@ private <T> T executeQuery(NamedParameterPreparedStatement preparedStatement, It
*/
public void executeStatementBatch(String sqlStatement, Iterable<SqlParameter> parameterMetadata, Iterable<? extends DataValueLookup> parameterData, Connection connection, boolean explicitCommit, int statementsPerFlush) {
try {
try (NamedParameterPreparedStatement preparedStatement = NamedParameterPreparedStatement.parse(sqlStatement).createFor(connection)) {
try (NamedParameterPreparedStatement preparedStatement = NamedParameterPreparedStatement.parseSql(sqlStatement, sqlDialect).createFor(connection)) {
executeStatementBatch(preparedStatement, parameterMetadata, parameterData, connection, explicitCommit, statementsPerFlush);
} finally {
if (explicitCommit) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@
import static org.alfasoftware.morf.sql.SqlUtils.bracket;
import static org.alfasoftware.morf.util.DeepCopyTransformations.noTransformation;

import java.util.List;

import org.alfasoftware.morf.sql.SelectStatement;
import org.alfasoftware.morf.sql.SqlUtils;
import org.alfasoftware.morf.util.DeepCopyTransformation;
Expand Down Expand Up @@ -333,7 +331,7 @@ public Criterion in(Object... values) {
* @param values The values for comparison
* @return The resulting {@link Criterion}.
*/
public Criterion in(List<Object> values) {
public Criterion in(Iterable<? extends Object> values) {
return Criterion.in(this, values);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public class XmlDataSetProducer implements DataSetProducer {
/**
* Provides a file given a URL, abstracting us from the specific protocol.
*/
private ViewURLAsFile urlHandler;
private final ViewURLAsFile urlHandler;


/**
Expand Down Expand Up @@ -112,9 +112,13 @@ public XmlDataSetProducer(URL source, String sourceUsername, String sourcePasswo
File file = urlHandler.getFile(source, sourceUsername, sourcePassword);
if (file.isDirectory()) {
this.xmlStreamProvider = new DirectoryDataSet(file);
} else {
}
else if (file.isFile()) {
this.xmlStreamProvider = new ArchiveDataSetReader(file);
}
else {
throw new RuntimeException("Could not find [" + file + "] from [" + source + "]");
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,8 @@
import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.junit.Test;

import org.alfasoftware.morf.jdbc.NamedParameterPreparedStatement.ParseResult;
import org.junit.Test;

/**
* Tests {@link NamedParameterPreparedStatement}.
Expand All @@ -45,8 +44,9 @@ public class TestNamedParameterPreparedStatement {
*/
@Test
public void testParse() {
ParseResult parseResult = NamedParameterPreparedStatement.parse(
"SELECT :fee,:fi, :fo(:fum), ':eek' FROM :fum WHERE :fum AND :fo"
ParseResult parseResult = NamedParameterPreparedStatement.parseSql(
"SELECT :fee,:fi, :fo(:fum), ':eek' FROM :fum WHERE :fum AND :fo",
mock(SqlDialect.class)
);

assertThat("Parsed SQL", parseResult.getParsedSql(), equalTo("SELECT ?,?, ?(?), ':eek' FROM ? WHERE ? AND ?"));
Expand All @@ -67,7 +67,7 @@ public void testMaxRows() throws SQLException {
Connection connection = mock(Connection.class);
PreparedStatement underlying = mock(PreparedStatement.class);
when(connection.prepareStatement("SELECT * FROM somewhere")).thenReturn(underlying);
NamedParameterPreparedStatement.parse("SELECT * FROM somewhere").createFor(connection).setMaxRows(123);
NamedParameterPreparedStatement.parseSql("SELECT * FROM somewhere", mock(SqlDialect.class)).createFor(connection).setMaxRows(123);
verify(underlying).setMaxRows(123);
}
}
2 changes: 1 addition & 1 deletion morf-excel/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>org.alfasoftware</groupId>
<artifactId>morf-parent</artifactId>
<version>1.3.4-SNAPSHOT</version>
<version>1.3.5-SNAPSHOT</version>
</parent>

<name>Morf - Excel</name>
Expand Down
2 changes: 1 addition & 1 deletion morf-h2/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>org.alfasoftware</groupId>
<artifactId>morf-parent</artifactId>
<version>1.3.4-SNAPSHOT</version>
<version>1.3.5-SNAPSHOT</version>
</parent>

<name>Morf - H2</name>
Expand Down
2 changes: 1 addition & 1 deletion morf-integration-test/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>org.alfasoftware</groupId>
<artifactId>morf-parent</artifactId>
<version>1.3.4-SNAPSHOT</version>
<version>1.3.5-SNAPSHOT</version>
</parent>

<name>Morf - Integration Test</name>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1350,6 +1350,7 @@ public Void process(ResultSet resultSet) throws SQLException {
*/
@Test
public void ItestBooleanFields() throws SQLException {
ImmutableList<Boolean> listOfTrueAndFalse = ImmutableList.of(true, false); // deliberately not a List<Object>

SqlScriptExecutor executor = sqlScriptExecutorProvider.get(new LoggingSqlScriptVisitor());

Expand All @@ -1366,7 +1367,8 @@ public void ItestBooleanFields() throws SQLException {
field("column1").eq(literal(true)),
field("column1").eq(literal(false)),
field("column1").in(true, false),
field("column1").in(literal(true), literal(false))
field("column1").in(literal(true), literal(false)),
field("column1").in(listOfTrueAndFalse)
));
UpdateStatement updateStatement = update(tableRef("BooleanTable"))
.set(literal(true).as("column1"), literal(false).as("column2"));
Expand Down Expand Up @@ -2413,7 +2415,7 @@ public void testParameterisedMerge() throws SQLException {
parameter("parameterValue").type(DataType.STRING).as("column4")
)
);
NamedParameterPreparedStatement preparedStatement = NamedParameterPreparedStatement.parse(sqlDialect.convertStatementToSQL(merge)).createFor(connection);
NamedParameterPreparedStatement preparedStatement = NamedParameterPreparedStatement.parseSql(sqlDialect.convertStatementToSQL(merge), sqlDialect).createFor(connection);
try {

// Put in two records. The first should merge with the initial data set.
Expand Down Expand Up @@ -2466,7 +2468,7 @@ public void testParameterisedUpdate() throws SQLException {
UpdateStatement update = update(tableRef("MergeTableMultipleKeys"))
.set(column2, column3, column4)
.where(field("column1").eq(column1));
ParseResult parsed = NamedParameterPreparedStatement.parse(sqlDialect.convertStatementToSQL(update));
ParseResult parsed = NamedParameterPreparedStatement.parseSql(sqlDialect.convertStatementToSQL(update), sqlDialect);

NamedParameterPreparedStatement preparedStatement = parsed.createFor(connection);
try {
Expand Down Expand Up @@ -2510,6 +2512,7 @@ public void testParameterisedSelect() throws SQLException {
field("field2"),
literal(":justtomesswithyou"), // just to confuse it - should be treated as a string
parameter("param3").type(DataType.INTEGER).as("field3"),
coalesce(literal("value"), parameter("param4").type(DataType.STRING)),
isnull(literal("value"), parameter("param4").type(DataType.STRING))
)
.from("SelectFirstTable")
Expand All @@ -2520,7 +2523,7 @@ public void testParameterisedSelect() throws SQLException {
))
.orderBy(field("field1"), field("field2"));

NamedParameterPreparedStatement preparedStatement = NamedParameterPreparedStatement.parse(sqlDialect.convertStatementToSQL(select)).createForQueryOn(connection);
NamedParameterPreparedStatement preparedStatement = NamedParameterPreparedStatement.parseSql(sqlDialect.convertStatementToSQL(select), sqlDialect).createForQueryOn(connection);
try {
preparedStatement.setFetchSize(sqlDialect.fetchSizeForBulkSelects());
sqlDialect.prepareStatementParameters(
Expand All @@ -2544,18 +2547,21 @@ public void testParameterisedSelect() throws SQLException {
assertEquals("Row 1 column 3", ":justtomesswithyou", resultSet.getString(3));
assertEquals("Row 1 column 4", 7, resultSet.getInt(4));
assertEquals("Row 1 column 5", "value", resultSet.getString(5));
assertEquals("Row 1 column 6", "value", resultSet.getString(6));
assertTrue("No record 2", resultSet.next());
assertEquals("Row 2 column 1", 2, resultSet.getInt(1));
assertEquals("Row 2 column 2", 3, resultSet.getInt(2));
assertEquals("Row 2 column 3", ":justtomesswithyou", resultSet.getString(3));
assertEquals("Row 2 column 4", 7, resultSet.getInt(4));
assertEquals("Row 2 column 5", "value", resultSet.getString(5));
assertEquals("Row 2 column 6", "value", resultSet.getString(6));
assertTrue("No record 3", resultSet.next());
assertEquals("Row 3 column 1", 5, resultSet.getInt(1));
assertEquals("Row 3 column 2", 4, resultSet.getInt(2));
assertEquals("Row 3 column 3", ":justtomesswithyou", resultSet.getString(3));
assertEquals("Row 3 column 4", 7, resultSet.getInt(4));
assertEquals("Row 3 column 5", "value", resultSet.getString(5));
assertEquals("Row 3 column 6", "value", resultSet.getString(6));
assertFalse("Noo many records", resultSet.next());
} finally {
preparedStatement.close();
Expand Down
2 changes: 1 addition & 1 deletion morf-mysql/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>org.alfasoftware</groupId>
<artifactId>morf-parent</artifactId>
<version>1.3.4-SNAPSHOT</version>
<version>1.3.5-SNAPSHOT</version>
</parent>

<name>Morf - MySQL</name>
Expand Down
2 changes: 1 addition & 1 deletion morf-nuodb/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>org.alfasoftware</groupId>
<artifactId>morf-parent</artifactId>
<version>1.3.4-SNAPSHOT</version>
<version>1.3.5-SNAPSHOT</version>
</parent>

<name>Morf - NuoDB</name>
Expand Down
2 changes: 1 addition & 1 deletion morf-oracle/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>org.alfasoftware</groupId>
<artifactId>morf-parent</artifactId>
<version>1.3.4-SNAPSHOT</version>
<version>1.3.5-SNAPSHOT</version>
</parent>

<name>Morf - Oracle</name>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -961,7 +961,7 @@ protected String getSqlForNow(Function function) {
*/
@Override
protected String getSqlForDaysBetween(AliasedField toDate, AliasedField fromDate) {
return String.format("%s - %s", getSqlFrom(toDate), getSqlFrom(fromDate));
return String.format("(%s) - (%s)", getSqlFrom(toDate), getSqlFrom(fromDate));
}


Expand Down Expand Up @@ -1004,7 +1004,7 @@ protected String getSubstringFunctionName() {
@Override
protected String getSqlForAddDays(Function function) {
return String.format(
"%s + %s",
"(%s) + (%s)",
getSqlFrom(function.getArguments().get(0)),
getSqlFrom(function.getArguments().get(1))
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1114,7 +1114,7 @@ protected String expectedNow() {
*/
@Override
protected String expectedDaysBetween() {
return "SELECT dateTwo - dateOne FROM " + tableName("MyTable");
return "SELECT (dateTwo) - (dateOne) FROM " + tableName("MyTable");
}


Expand Down Expand Up @@ -1267,7 +1267,7 @@ protected String expectedMergeWithUpdateExpressions() {
*/
@Override
protected String expectedAddDays() {
return "testField + -20";
return "(testField) + (-20)";
}


Expand Down
2 changes: 1 addition & 1 deletion morf-postgresql/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>org.alfasoftware</groupId>
<artifactId>morf-parent</artifactId>
<version>1.3.4-SNAPSHOT</version>
<version>1.3.5-SNAPSHOT</version>
</parent>

<name>Morf - PostgreSQL</name>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ protected String getSqlFrom(ConcatenatedField concatenatedField) {

@Override
protected String getSqlForDaysBetween(AliasedField toDate, AliasedField fromDate) {
return getSqlFrom(toDate) + " - " + getSqlFrom(fromDate);
return "(" + getSqlFrom(toDate) + ") - (" + getSqlFrom(fromDate) + ")";
}


Expand Down Expand Up @@ -361,7 +361,7 @@ protected String getSqlForDateToYyyymmddHHmmss(Function function) {
@Override
protected String getSqlForYYYYMMDDToDate(Function function) {
AliasedField field = function.getArguments().get(0);
return "TO_DATE("+ getSqlFrom(field) + " :: TEXT,'YYYYMMDD')";
return "TO_DATE(("+ getSqlFrom(field) + ") :: TEXT,'YYYYMMDD')";
}


Expand Down Expand Up @@ -394,8 +394,8 @@ protected String getSqlForAddMonths(Function function) {
@Override
protected String getSqlForRandomString(Function function) {
String lengthSql = getSqlFrom(function.getArguments().get(0));
String randomString = "(SELECT STRING_AGG(MD5(RANDOM() :: TEXT), ''))";
return "UPPER(SUBSTRING(" + randomString + ", 1, " + lengthSql + " :: INT))";
String randomString = "MD5(RANDOM() :: TEXT)";
return "UPPER(SUBSTRING(" + randomString + ", 1, (" + lengthSql + ") :: INT))";
}


Expand Down
Loading

0 comments on commit fe91a87

Please sign in to comment.