package com.orientechnologies.orient.jdbc;
import org.junit.Test;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import static java.sql.ResultSet.*;
import static org.assertj.core.api.Assertions.*;
public class OrientJdbcPreparedStatementTest extends OrientJdbcBaseTest {
@Test
public void shouldCreateStatement() throws Exception {
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM Item WHERE stringKey = ? OR intKey = ?");
assertThat(stmt).isNotNull();
stmt.close();
assertThat(stmt.isClosed()).isTrue();
}
@Test
public void shouldReturnEmptyResultSetOnEmptyQuery() throws SQLException {
PreparedStatement stmt = conn.prepareStatement("");
assertThat(stmt.execute("")).isFalse();
assertThat(stmt.getResultSet()).isNull();
assertThat(stmt.getMoreResults()).isFalse();
}
@Test
public void shouldExectuteSelectOne() throws SQLException {
PreparedStatement stmt = conn.prepareStatement("select 1");
assertThat(stmt.execute()).isTrue();
assertThat(stmt.getResultSet()).isNotNull();
ResultSet resultSet = stmt.getResultSet();
resultSet.first();
int one = resultSet.getInt("1");
assertThat(one).isEqualTo(1);
assertThat(stmt.getMoreResults()).isFalse();
}
@Test
public void testExecuteUpdateReturnsNumberOfRowsInserted() throws Exception {
conn.createStatement().executeQuery("CREATE CLASS Insertable ");
PreparedStatement statement = conn.prepareStatement("INSERT INTO Insertable ( id ) VALUES (?)");
statement.setString(1, "testval");
int rowsInserted = statement.executeUpdate();
assertThat(rowsInserted).isEqualTo(1);
}
@Test
public void testExecuteUpdateReturnsNumberOfRowsInsertedWhenMultipleInserted() throws Exception {
conn.createStatement().executeQuery("CREATE CLASS Insertable ");
conn.createStatement().executeQuery("INSERT INTO Insertable(id) VALUES(1)");
conn.createStatement().executeQuery("INSERT INTO Insertable(id) VALUES(2)");
PreparedStatement statement = conn.prepareStatement("UPDATE Insertable SET id = ?");
statement.setString(1, "testval");
int rowsInserted = statement.executeUpdate();
assertThat(rowsInserted).isEqualTo(2);
}
@Test
public void testInsertRIDReturning() throws Exception {
conn.createStatement().executeQuery("CREATE CLASS Insertable ");
ResultSet result = conn.createStatement().executeQuery("INSERT INTO Insertable(id) VALUES(1) return @rid");
assertThat(result.next()).isTrue();
assertThat(result.getObject("id")).isNotNull();
}
@Test
public void testExecuteUpdateReturnsNumberOfRowsDeleted() throws Exception {
conn.createStatement().executeQuery("CREATE CLASS Insertable ");
conn.createStatement().executeQuery("INSERT INTO Insertable(id) VALUES(1)");
conn.createStatement().executeQuery("INSERT INTO Insertable(id) VALUES(2)");
PreparedStatement statement = conn.prepareStatement("DELETE FROM Insertable WHERE id > ?");
statement.setInt(1, 0);
int rowsDeleted = statement.executeUpdate();
assertThat(rowsDeleted).isEqualTo(2);
}
@Test
public void shouldExecutePreparedStatement() throws Exception {
PreparedStatement stmt = conn.prepareStatement("SELECT " + "FROM Item " + "WHERE stringKey = ? OR intKey = ?");
assertThat(stmt).isNotNull();
stmt.setString(1, "1");
stmt.setInt(2, 1);
ResultSet rs = stmt.executeQuery();
assertThat(rs.next()).isTrue();
// assertThat(rs.getInt("@version"), equalTo(0));
assertThat(rs.getString("@class")).isEqualToIgnoringCase("Item");
assertThat(rs.getString("stringKey")).isEqualTo("1");
assertThat(rs.getInt("intKey")).isEqualTo(1);
//
// assertThat(rs.getDate("date").toString(), equalTo(new java.sql.Date(System.currentTimeMillis()).toString()));
// assertThat(rs.getDate("time").toString(), equalTo(new java.sql.Date(System.currentTimeMillis()).toString()));
stmt.close();
assertThat(stmt.isClosed()).isTrue();
}
@Test
public void shouldExecutePreparedStatementWithExecuteMethod() throws Exception {
conn.createStatement().executeQuery("CREATE CLASS insertable");
PreparedStatement stmt = conn.prepareStatement("INSERT INTO insertable SET id = ?, number = ?");
stmt.setString(1, "someRandomUid");
stmt.setInt(2, 42);
stmt.execute();
// Let's verify the previous process
ResultSet resultSet = conn.createStatement()
.executeQuery("SELECT count(*) AS num FROM insertable WHERE id = 'someRandomUid'");
assertThat(resultSet.getInt(1)).isEqualTo(1);
//without alias!
resultSet = conn.createStatement()
.executeQuery("SELECT count(*) FROM insertable WHERE id = 'someRandomUid'");
assertThat(resultSet.getInt(1)).isEqualTo(1);
}
@Test
public void shouldCreatePreparedStatementWithExtendConstructor() throws Exception {
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM Item WHERE intKey = ?", TYPE_FORWARD_ONLY, CONCUR_READ_ONLY);
stmt.setInt(1, 1);
ResultSet rs = stmt.executeQuery();
assertThat(rs.next()).isTrue();
assertThat(rs.getString("@class")).isEqualToIgnoringCase("Item");
assertThat(rs.getString("stringKey")).isEqualTo("1");
assertThat(rs.getInt("intKey")).isEqualTo(1);
//
}
@Test
public void shouldCreatePreparedStatementWithExtendConstructorWithOutProjection() throws Exception {
//same test as above, no projection at all
PreparedStatement stmt = conn.prepareStatement("SELECT FROM Item WHERE intKey = ?", TYPE_FORWARD_ONLY, CONCUR_READ_ONLY);
stmt.setInt(1, 1);
ResultSet rs = stmt.executeQuery();
assertThat(rs.next()).isTrue();
assertThat(rs.getString("@class")).isEqualToIgnoringCase("Item");
assertThat(rs.getString("stringKey")).isEqualTo("1");
assertThat(rs.getInt("intKey")).isEqualTo(1);
//
}
@Test(expected = SQLException.class)
public void shouldTrhowSqlExceptionOnError() throws SQLException {
String query = "select sequence('?').next()";
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, "theSequence");
stmt.executeQuery();
}
}