Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ignore order of rows mode for TestHelper #353

Merged
merged 2 commits into from
Aug 12, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 82 additions & 23 deletions dbms/src/test/java/org/polypheny/db/TestHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,11 @@
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
Expand Down Expand Up @@ -129,72 +132,82 @@ public static void checkResultSet( ResultSet resultSet, List<Object[]> expected
}


public static void checkResultSet( ResultSet resultSet, List<Object[]> expected, boolean ignoreOrderOfResultRows ) throws SQLException {
checkResultSet( resultSet, expected, ignoreOrderOfResultRows, false );
}


// isConvertingDecimals should only(!) be set to true if a decimal value is the result of a type conversion (e.g., when change the type of column to decimal)
public static void checkResultSet( ResultSet resultSet, List<Object[]> expected, boolean isConvertingDecimals ) throws SQLException {
public static void checkResultSet( ResultSet resultSet, List<Object[]> expected, boolean ignoreOrderOfResultRows, boolean isConvertingDecimals ) throws SQLException {
List<Object[]> received = convertResultSetToList( resultSet );
if ( ignoreOrderOfResultRows ) {
expected = orderResultList( expected );
received = orderResultList( received );
}
ResultSetMetaData rsmd = resultSet.getMetaData();
int i = 0;
while ( resultSet.next() ) {
for ( Object[] row : received ) {
Assert.assertTrue( "Result set has more rows than expected", i < expected.size() );
Object[] expectedRow = expected.get( i++ );
Assert.assertEquals( "Wrong number of columns", expectedRow.length, resultSet.getMetaData().getColumnCount() );
Assert.assertEquals( "Wrong number of columns", expectedRow.length, rsmd.getColumnCount() );
int j = 0;
while ( j < expectedRow.length ) {
if ( expectedRow.length >= j + 1 ) {
int columnType = resultSet.getMetaData().getColumnType( j + 1 );
if ( resultSet.getMetaData().getColumnType( j + 1 ) == Types.BINARY ) {
int columnType = rsmd.getColumnType( j + 1 );
if ( columnType == Types.BINARY ) {
if ( expectedRow[j] == null ) {
Assert.assertNull( "Unexpected data in column '" + resultSet.getMetaData().getColumnName( j + 1 ) + "': ", resultSet.getBytes( j + 1 ) );
Assert.assertNull( "Unexpected data in column '" + rsmd.getColumnName( j + 1 ) + "': ", row[j] );
} else {
Assert.assertEquals( "Unexpected data in column '" + resultSet.getMetaData().getColumnName( j + 1 ) + "'",
Assert.assertEquals( "Unexpected data in column '" + rsmd.getColumnName( j + 1 ) + "'",
new String( (byte[]) expectedRow[j] ),
new String( resultSet.getBytes( j + 1 ) ) );
new String( (byte[]) row[j] ) );
}
} else if ( columnType != Types.ARRAY ) {
if ( expectedRow[j] != null ) {
if ( columnType == Types.FLOAT || columnType == Types.REAL ) {
float diff = Math.abs( (float) expectedRow[j] - resultSet.getFloat( j + 1 ) );
float diff = Math.abs( (float) expectedRow[j] - (float) row[j] );
Assert.assertTrue(
"Unexpected data in column '" + resultSet.getMetaData().getColumnName( j + 1 ) + "': The difference between the expected float and the received float exceeds the epsilon. Difference: " + (diff - EPSILON),
"Unexpected data in column '" + rsmd.getColumnName( j + 1 ) + "': The difference between the expected float and the received float exceeds the epsilon. Difference: " + (diff - EPSILON),
diff < EPSILON );
} else if ( columnType == Types.DOUBLE ) {
double diff = Math.abs( (double) expectedRow[j] - resultSet.getDouble( j + 1 ) );
double diff = Math.abs( (double) expectedRow[j] - (double) row[j] );
Assert.assertTrue(
"Unexpected data in column '" + resultSet.getMetaData().getColumnName( j + 1 ) + "': The difference between the expected double and the received double exceeds the epsilon. Difference: " + (diff - EPSILON),
"Unexpected data in column '" + rsmd.getColumnName( j + 1 ) + "': The difference between the expected double and the received double exceeds the epsilon. Difference: " + (diff - EPSILON),
diff < EPSILON );
} else if ( columnType == Types.DECIMAL ) { // Decimals are exact // but not for calculations?
BigDecimal expectedResult = (BigDecimal) expectedRow[j];
BigDecimal result = resultSet.getBigDecimal( j + 1 );
double diff = Math.abs( expectedResult.doubleValue() - result.doubleValue() );
double diff = Math.abs( expectedResult.doubleValue() - ((BigDecimal) row[j]).doubleValue() );
if ( isConvertingDecimals ) {
Assert.assertTrue(
"Unexpected data in column '" + resultSet.getMetaData().getColumnName( j + 1 ) + "': The difference between the expected decimal and the received decimal exceeds the epsilon. Difference: " + (diff - EPSILON),
"Unexpected data in column '" + rsmd.getColumnName( j + 1 ) + "': The difference between the expected decimal and the received decimal exceeds the epsilon. Difference: " + (diff - EPSILON),
diff < EPSILON );
} else {
Assert.assertEquals( "Unexpected data in column '" + resultSet.getMetaData().getColumnName( j + 1 ) + "'", 0, expectedResult.doubleValue() - result.doubleValue(), 0.0 );
Assert.assertEquals( "Unexpected data in column '" + rsmd.getColumnName( j + 1 ) + "'", 0, expectedResult.doubleValue() - ((BigDecimal) row[j]).doubleValue(), 0.0 );
}
} else {
Assert.assertEquals(
"Unexpected data in column '" + resultSet.getMetaData().getColumnName( j + 1 ) + "'",
"Unexpected data in column '" + rsmd.getColumnName( j + 1 ) + "'",
expectedRow[j],
resultSet.getObject( j + 1 )
row[j]
);
}
} else {
Assert.assertEquals(
"Unexpected data in column '" + resultSet.getMetaData().getColumnName( j + 1 ) + "'",
"Unexpected data in column '" + rsmd.getColumnName( j + 1 ) + "'",
expectedRow[j],
resultSet.getObject( j + 1 )
row[j]
);
}

} else {
List resultList = SqlFunctions.deepArrayToList( resultSet.getArray( j + 1 ) );
List resultList = (List) row[j];
Object[] expectedArray = (Object[]) expectedRow[j];
if ( expectedArray == null ) {
Assert.assertNull( "Unexpected data in column '" + resultSet.getMetaData().getColumnName( j + 1 ) + "': ", resultList );
Assert.assertNull( "Unexpected data in column '" + rsmd.getColumnName( j + 1 ) + "': ", resultList );
} else {
for ( int k = 0; k < expectedArray.length; k++ ) {
Assert.assertEquals(
"Unexpected data in column '" + resultSet.getMetaData().getColumnName( j + 1 ) + "' at position: " + k + 1,
"Unexpected data in column '" + rsmd.getColumnName( j + 1 ) + "' at position: " + k + 1,
expectedArray[k],
resultList.get( k ) );
}
Expand All @@ -210,6 +223,52 @@ public static void checkResultSet( ResultSet resultSet, List<Object[]> expected,
}


private static List<Object[]> convertResultSetToList( ResultSet resultSet ) throws SQLException {
ResultSetMetaData md = resultSet.getMetaData();
int columns = md.getColumnCount();
List<Object[]> list = new ArrayList<>();
while ( resultSet.next() ) {
Object[] row = new Object[columns];
for ( int i = 1; i <= columns; ++i ) {
int columnType = resultSet.getMetaData().getColumnType( i );
if ( columnType == Types.BINARY ) {
row[i - 1] = resultSet.getBytes( i );
} else if ( columnType != Types.ARRAY ) {
if ( resultSet.getObject( i ) != null ) {
if ( columnType == Types.FLOAT || columnType == Types.REAL ) {
row[i - 1] = resultSet.getFloat( i );
} else if ( columnType == Types.DOUBLE ) {
row[i - 1] = resultSet.getDouble( i );
} else if ( columnType == Types.DECIMAL ) {
row[i - 1] = resultSet.getBigDecimal( i );
} else {
row[i - 1] = resultSet.getObject( i );
}
} else {
row[i - 1] = resultSet.getObject( i );
}
} else {
row[i - 1] = SqlFunctions.deepArrayToList( resultSet.getArray( i ) );
}
}
list.add( row );
}
return list;
}


private static List<Object[]> orderResultList( List<Object[]> result ) {
List<Object[]> list = new ArrayList<>( result );
list.sort( ( lhs, rhs ) -> {
String lhsStr = Arrays.toString( lhs );
String rhsStr = Arrays.toString( rhs );
// -1 - less than, 1 - greater than, 0 - equal, all inversed for descending
return lhsStr.compareTo( rhsStr );
} );
return list;
}


public static class JdbcConnection implements AutoCloseable {

private final static String dbHost = "localhost";
Expand Down
1 change: 1 addition & 0 deletions dbms/src/test/java/org/polypheny/db/jdbc/JdbcDdlTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,7 @@ public void changeColumnTest() throws SQLException {
TestHelper.checkResultSet(
statement.executeQuery( "SELECT tdouble FROM ddltest" ),
ImmutableList.of( new Object[]{ BigDecimal.valueOf( (double) DDLTEST_DATA[4] ) } ),
false,
true );

// Real --> Double
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,8 @@ public void batchInsertTest() throws SQLException {
preparedSelect.executeQuery(),
ImmutableList.of(
new Object[]{ 1, "Foo" },
new Object[]{ 2, "Bar" } ) );
new Object[]{ 2, "Bar" } ),
true );

} finally {
statement.executeUpdate( "DROP TABLE pstest" );
Expand Down Expand Up @@ -178,7 +179,8 @@ public void batchInsertDefaultValuesTest() throws SQLException {
preparedSelect.executeQuery(),
ImmutableList.of(
new Object[]{ 1, "hans" },
new Object[]{ 2, "hans" } ) );
new Object[]{ 2, "hans" } ),
true );
} finally {
statement.executeUpdate( "DROP TABLE pstest" );
}
Expand Down
37 changes: 22 additions & 15 deletions dbms/src/test/java/org/polypheny/db/sql/view/ViewTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -94,19 +94,19 @@ public void testSelect() throws SQLException {
statement.executeUpdate( "CREATE VIEW viewTestEmp AS SELECT * FROM viewTestEmpTable" );
statement.executeUpdate( "CREATE VIEW viewTestEmpDep AS SELECT viewTestEmpTable.firstName, viewTestDepTable.depName FROM viewTestEmpTable INNER JOIN viewTestDepTable ON viewTestEmpTable.depId = viewTestDepTable.depId" );
TestHelper.checkResultSet(
statement.executeQuery( "SELECT * FROM viewTestEmp" ),
statement.executeQuery( "SELECT * FROM viewTestEmp ORDER BY empid" ),
ImmutableList.of(
new Object[]{ 1, "Max", "Muster", 1 },
new Object[]{ 2, "Ernst", "Walter", 2 },
new Object[]{ 3, "Elsa", "Kuster", 3 }
)
);
TestHelper.checkResultSet(
statement.executeQuery( "SELECT viewTestEmp.firstName FROM viewTestEmp" ),
statement.executeQuery( "SELECT viewTestEmp.firstName FROM viewTestEmp ORDER BY viewTestEmp.firstName" ),
ImmutableList.of(
new Object[]{ "Max" },
new Object[]{ "Elsa" },
new Object[]{ "Ernst" },
new Object[]{ "Elsa" }
new Object[]{ "Max" }
)
);
TestHelper.checkResultSet(
Expand All @@ -115,7 +115,8 @@ public void testSelect() throws SQLException {
new Object[]{ "Max", "IT" },
new Object[]{ "Ernst", "Sales" },
new Object[]{ "Elsa", "HR" }
)
),
true
);
connection.commit();
} finally {
Expand Down Expand Up @@ -149,21 +150,24 @@ public void renameColumnTest() throws SQLException {
ImmutableList.of(
new Object[]{ 1 },
new Object[]{ 2 },
new Object[]{ 3 } ) );
new Object[]{ 3 } ),
true );
TestHelper.checkResultSet(
statement.executeQuery( "SELECT fName FROM viewTestEmp" ),
ImmutableList.of(
new Object[]{ "Max" },
new Object[]{ "Ernst" },
new Object[]{ "Elsa" } ) );
new Object[]{ "Elsa" } ),
true );
TestHelper.checkResultSet(
statement.executeQuery( "SELECT lName FROM viewTestEmp" ),
ImmutableList.of(
new Object[]{ "Kuster" },
new Object[]{ "Muster" },
new Object[]{ "Walter" },
new Object[]{ "Kuster" } ) );
new Object[]{ "Walter" } ),
true );
TestHelper.checkResultSet(
statement.executeQuery( "SELECT departmentId FROM viewTestEmp" ),
statement.executeQuery( "SELECT departmentId FROM viewTestEmp ORDER BY departmentId" ),
ImmutableList.of(
new Object[]{ 1 },
new Object[]{ 2 },
Expand Down Expand Up @@ -196,7 +200,7 @@ public void renameViewTest() throws SQLException {
statement.executeUpdate( "ALTER TABLE viewTestDep RENAME TO viewRenameDepTest" );

TestHelper.checkResultSet(
statement.executeQuery( "SELECT * FROM viewRenameEmpTest" ),
statement.executeQuery( "SELECT * FROM viewRenameEmpTest ORDER BY empid" ),
ImmutableList.of(
new Object[]{ 1, "Max", "Muster", 1 },
new Object[]{ 2, "Ernst", "Walter", 2 },
Expand All @@ -209,7 +213,8 @@ public void renameViewTest() throws SQLException {
new Object[]{ 1, "IT", 1 },
new Object[]{ 2, "Sales", 2 },
new Object[]{ 3, "HR", 3 }
)
),
true
);
connection.commit();
} finally {
Expand Down Expand Up @@ -317,7 +322,7 @@ public void testMixedViewAndTable() throws SQLException {
try {
statement.executeUpdate( "CREATE VIEW viewTestEmp AS SELECT * FROM viewTestEmpTable" );
TestHelper.checkResultSet(
statement.executeQuery( "SELECT * FROM viewTestEmp, viewTestDepTable WHERE depname = 'IT'" ),
statement.executeQuery( "SELECT * FROM viewTestEmp, viewTestDepTable WHERE depname = 'IT' ORDER BY empid" ),
ImmutableList.of(
new Object[]{ 1, "Max", "Muster", 1, 1, "IT", 1 },
new Object[]{ 2, "Ernst", "Walter", 2, 1, "IT", 1 },
Expand Down Expand Up @@ -355,7 +360,8 @@ public void testMultipleViews() throws SQLException {
new Object[]{ 1, "Max", "Muster", 1, 1, "IT", 1 },
new Object[]{ 2, "Ernst", "Walter", 2, 1, "IT", 1 },
new Object[]{ 3, "Elsa", "Kuster", 3, 1, "IT", 1 }
)
),
true
);

connection.commit();
Expand Down Expand Up @@ -390,7 +396,8 @@ public void testViewFromView() throws SQLException {
new Object[]{ 1, "Max", "Muster", 1, 1, "IT", 1 },
new Object[]{ 2, "Ernst", "Walter", 2, 1, "IT", 1 },
new Object[]{ 3, "Elsa", "Kuster", 3, 1, "IT", 1 }
)
),
true
);

connection.commit();
Expand Down