Repository: metamodel Updated Branches: refs/heads/master d17a10dd0 -> b95d74f1f
METAMODEL-194: Fixed Fixes #57 Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/b95d74f1 Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/b95d74f1 Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/b95d74f1 Branch: refs/heads/master Commit: b95d74f1fe51ade825a0369fdc56d11b726fc884 Parents: d17a10d Author: Kasper Sørensen <[email protected]> Authored: Fri Oct 9 09:15:40 2015 +0200 Committer: Kasper Sørensen <[email protected]> Committed: Fri Oct 9 09:15:40 2015 +0200 ---------------------------------------------------------------------- .../java/org/apache/metamodel/query/Query.java | 3 - .../QueryPostprocessDataContextTest.java | 24 ++++-- .../org/apache/metamodel/query/QueryTest.java | 6 -- .../apache/metamodel/jdbc/JdbcDataContext.java | 17 ++-- .../metamodel/jdbc/JdbcDataContextTest.java | 84 +++++++++++--------- 5 files changed, 74 insertions(+), 60 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/b95d74f1/core/src/main/java/org/apache/metamodel/query/Query.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/query/Query.java b/core/src/main/java/org/apache/metamodel/query/Query.java index ae1e530..1fdb6da 100644 --- a/core/src/main/java/org/apache/metamodel/query/Query.java +++ b/core/src/main/java/org/apache/metamodel/query/Query.java @@ -520,9 +520,6 @@ public final class Query extends BaseObject implements Cloneable, Serializable { public Query setMaxRows(Integer maxRows) { if (maxRows != null) { final int maxRowsValue = maxRows.intValue(); - if (maxRowsValue == 0) { - throw new IllegalArgumentException("Max rows cannot be zero"); - } if (maxRowsValue < 0) { throw new IllegalArgumentException("Max rows cannot be negative"); } http://git-wip-us.apache.org/repos/asf/metamodel/blob/b95d74f1/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java b/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java index 618ff55..d8d046c 100644 --- a/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java +++ b/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java @@ -29,6 +29,7 @@ import org.apache.metamodel.data.DataSet; import org.apache.metamodel.data.DataSetHeader; import org.apache.metamodel.data.DataSetTableModel; import org.apache.metamodel.data.DefaultRow; +import org.apache.metamodel.data.EmptyDataSet; import org.apache.metamodel.data.InMemoryDataSet; import org.apache.metamodel.data.Row; import org.apache.metamodel.data.SimpleDataSetHeader; @@ -58,6 +59,15 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase { private final Table table1 = schema.getTableByName(TABLE_CONTRIBUTOR); private final Table table2 = schema.getTableByName(TABLE_ROLE); + public void testQueryMaxRows0() throws Exception { + final MockDataContext dc = new MockDataContext("sch", "tab", "1"); + final Table table = dc.getDefaultSchema().getTables()[0]; + final DataSet dataSet = dc.query().from(table).selectAll().limit(0).execute(); + assertTrue(dataSet instanceof EmptyDataSet); + assertFalse(dataSet.next()); + dataSet.close(); + } + // see issue METAMODEL-100 public void testSelectFromColumnsWithSameName() throws Exception { final MutableTable table = new MutableTable("table"); @@ -107,8 +117,8 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase { public void testAggregateQueryRegularWhereClause() throws Exception { MockDataContext dc = new MockDataContext("sch", "tab", "1"); Table table = dc.getDefaultSchema().getTables()[0]; - assertSingleRowResult("Row[values=[3]]", - dc.query().from(table).selectCount().where("baz").eq("world").execute()); + assertSingleRowResult("Row[values=[3]]", dc.query().from(table).selectCount().where("baz").eq("world") + .execute()); } public void testApplyFunctionToNullValues() throws Exception { @@ -222,7 +232,9 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase { Query query = dc.query().from(table).select("foo").select(FunctionType.TO_NUMBER, "foo").select("bar") .select(FunctionType.TO_STRING, "bar").select(FunctionType.TO_NUMBER, "bar").toQuery(); - assertEquals("SELECT tab.foo, TO_NUMBER(tab.foo), tab.bar, TO_STRING(tab.bar), TO_NUMBER(tab.bar) FROM sch.tab", query.toSql()); + assertEquals( + "SELECT tab.foo, TO_NUMBER(tab.foo), tab.bar, TO_STRING(tab.bar), TO_NUMBER(tab.bar) FROM sch.tab", + query.toSql()); DataSet ds = dc.executeQuery(query); assertTrue(ds.next()); @@ -245,7 +257,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase { assertTrue(ds.next()); ds.close(); } - + public void testScalarFunctionWhere() throws Exception { MockDataContext dc = new MockDataContext("sch", "tab", "1"); Table table = dc.getDefaultSchema().getTables()[0]; @@ -750,8 +762,8 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase { Query q = new Query(); q.from(table1); q.select(table1.getColumns()); - SelectItem countrySelectItem = q.getSelectClause() - .getSelectItem(table1.getColumnByName(COLUMN_CONTRIBUTOR_COUNTRY)); + SelectItem countrySelectItem = q.getSelectClause().getSelectItem( + table1.getColumnByName(COLUMN_CONTRIBUTOR_COUNTRY)); q.where(new FilterItem(countrySelectItem, OperatorType.EQUALS_TO, "denmark")); DataSet data = dc.executeQuery(q); http://git-wip-us.apache.org/repos/asf/metamodel/blob/b95d74f1/core/src/test/java/org/apache/metamodel/query/QueryTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/metamodel/query/QueryTest.java b/core/src/test/java/org/apache/metamodel/query/QueryTest.java index dd12657..823c4d9 100644 --- a/core/src/test/java/org/apache/metamodel/query/QueryTest.java +++ b/core/src/test/java/org/apache/metamodel/query/QueryTest.java @@ -158,12 +158,6 @@ public class QueryTest extends MetaModelTestCase { public void testSetMaxRows() throws Exception { assertEquals(1, new Query().setMaxRows(1).getMaxRows().intValue()); try { - new Query().setMaxRows(0); - fail("Exception expected"); - } catch (IllegalArgumentException e) { - assertEquals("Max rows cannot be zero", e.getMessage()); - } - try { new Query().setMaxRows(-1); fail("Exception expected"); } catch (IllegalArgumentException e) { http://git-wip-us.apache.org/repos/asf/metamodel/blob/b95d74f1/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java ---------------------------------------------------------------------- diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java index 7c8abfe..db0ca11 100644 --- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java +++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java @@ -336,6 +336,13 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa private DataSet execute(Connection connection, Query query, Statement statement, JdbcCompiledQuery compiledQuery, JdbcCompiledQueryLease lease, Object[] values) throws SQLException, MetaModelException { + Integer maxRows = query.getMaxRows(); + + final List<SelectItem> selectItems = query.getSelectClause().getItems(); + if (maxRows != null && maxRows.intValue() == 0) { + return new EmptyDataSet(selectItems); + } + if (MetaModelHelper.containsNonSelectScalaFunctions(query)) { throw new MetaModelException( "Scalar functions outside of SELECT clause is not supported for JDBC databases. Query rejected: " @@ -356,8 +363,7 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa // build a list of select items whose scalar functions has to be // evaluated client-side - final List<SelectItem> scalarFunctionSelectItems = MetaModelHelper - .getScalarFunctionSelectItems(query.getSelectClause().getItems()); + final List<SelectItem> scalarFunctionSelectItems = MetaModelHelper.getScalarFunctionSelectItems(selectItems); for (Iterator<SelectItem> it = scalarFunctionSelectItems.iterator(); it.hasNext();) { final SelectItem selectItem = (SelectItem) it.next(); if (_queryRewriter.isScalarFunctionSupported(selectItem.getScalarFunction())) { @@ -365,8 +371,8 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa } } - boolean postProcessFirstRow = false; final Integer firstRow = query.getFirstRow(); + boolean postProcessFirstRow = false; if (firstRow != null) { if (_queryRewriter.isFirstRowSupported()) { logger.debug("First row property will be treated by query rewriter"); @@ -376,7 +382,6 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa } boolean postProcessMaxRows = false; - Integer maxRows = query.getMaxRows(); if (maxRows != null) { if (postProcessFirstRow) { // if First row is being post processed, we need to @@ -444,7 +449,7 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa if (resultSet != null) { resultSet.close(); } - return new EmptyDataSet(query.getSelectClause().getItems()); + return new EmptyDataSet(selectItems); } } } @@ -461,7 +466,7 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa if (!scalarFunctionSelectItems.isEmpty()) { dataSet = new ScalarFunctionDataSet(scalarFunctionSelectItems, dataSet); - dataSet = MetaModelHelper.getSelection(query.getSelectClause().getItems(), dataSet); + dataSet = MetaModelHelper.getSelection(selectItems, dataSet); } } catch (SQLException exception) { http://git-wip-us.apache.org/repos/asf/metamodel/blob/b95d74f1/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java ---------------------------------------------------------------------- diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java index fe93a40..63af5d3 100644 --- a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java +++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java @@ -41,6 +41,7 @@ import org.apache.metamodel.MetaModelException; import org.apache.metamodel.QueryPostprocessDataContext; import org.apache.metamodel.data.DataSet; import org.apache.metamodel.data.DataSetTableModel; +import org.apache.metamodel.data.EmptyDataSet; import org.apache.metamodel.data.Row; import org.apache.metamodel.jdbc.dialects.DefaultQueryRewriter; import org.apache.metamodel.jdbc.dialects.IQueryRewriter; @@ -75,6 +76,16 @@ public class JdbcDataContextTest extends JdbcTestCase { assertNull("found schema: " + schema, schema); } + public void testQueryMaxRows0() throws Exception { + final Connection con = getTestDbConnection(); + final DataContext dc = new JdbcDataContext(con); + final Table table = dc.getDefaultSchema().getTables()[0]; + final DataSet dataSet = dc.query().from(table).selectAll().limit(0).execute(); + assertTrue(dataSet instanceof EmptyDataSet); + assertFalse(dataSet.next()); + dataSet.close(); + } + public void testUsingDataSource() throws Exception { Connection con = getTestDbConnection(); DataSource ds = EasyMock.createMock(DataSource.class); @@ -114,8 +125,8 @@ public class JdbcDataContextTest extends JdbcTestCase { EasyMock.verify(ds); - String assertionFailMsg = "Expected 5x true: " + con1.isClosed() + "," + con2.isClosed() + "," + con3.isClosed() - + "," + con4.isClosed() + "," + con5.isClosed(); + String assertionFailMsg = "Expected 5x true: " + con1.isClosed() + "," + con2.isClosed() + "," + + con3.isClosed() + "," + con4.isClosed() + "," + con5.isClosed(); assertTrue(assertionFailMsg, con1.isClosed()); assertTrue(assertionFailMsg, con2.isClosed()); @@ -137,22 +148,20 @@ public class JdbcDataContextTest extends JdbcTestCase { assertEquals( "SELECT a._CUSTOMERNUMBER_, a._CUSTOMERNAME_, a._CONTACTLASTNAME_, a._CONTACTFIRSTNAME_, a._PHONE_, " + "a._ADDRESSLINE1_, a._ADDRESSLINE2_, a._CITY_, a._STATE_, a._POSTALCODE_, a._COUNTRY_, " - + "a._SALESREPEMPLOYEENUMBER_, a._CREDITLIMIT_ FROM PUBLIC._CUSTOMERS_ a", - q.toString().replace('\"', '_')); + + "a._SALESREPEMPLOYEENUMBER_, a._CREDITLIMIT_ FROM PUBLIC._CUSTOMERS_ a", q.toString() + .replace('\"', '_')); DataSet result = strategy.executeQuery(q); assertTrue(result.next()); assertEquals( "Row[values=[103, Atelier graphique, Schmitt, Carine, 40.32.2555, 54, rue Royale, null, Nantes, null, " - + "44000, France, 1370, 21000.0]]", - result.getRow().toString()); + + "44000, France, 1370, 21000.0]]", result.getRow().toString()); assertTrue(result.next()); assertTrue(result.next()); assertTrue(result.next()); assertTrue(result.next()); assertEquals( "Row[values=[121, Baane Mini Imports, Bergulfsen, Jonas, 07-98 9555, Erling Skakkes gate 78, null, " - + "Stavern, null, 4110, Norway, 1504, 81700.0]]", - result.getRow().toString()); + + "Stavern, null, 4110, Norway, 1504, 81700.0]]", result.getRow().toString()); result.close(); } @@ -184,14 +193,12 @@ public class JdbcDataContextTest extends JdbcTestCase { + "a._ADDRESSLINE1_, a._ADDRESSLINE2_, a._CITY_, " + "a._STATE_, a._POSTALCODE_, a._COUNTRY_, a._SALESREPEMPLOYEENUMBER_, " + "a._CREDITLIMIT_ FROM PUBLIC._CUSTOMERS_ a WHERE a._CUSTOMERNUMBER_ = ? " - + "AND a._CUSTOMERNAME_ = ?", - compliedQueryString.replace('\"', '_')); + + "AND a._CUSTOMERNAME_ = ?", compliedQueryString.replace('\"', '_')); DataSet result1 = dataContext.executeQuery(compiledQuery, new Object[] { 103, "Atelier graphique" }); assertTrue(result1.next()); assertEquals( "Row[values=[103, Atelier graphique, Schmitt, Carine, 40.32.2555, 54, rue Royale, null, Nantes, null, " - + "44000, France, 1370, 21000.0]]", - result1.getRow().toString()); + + "44000, France, 1370, 21000.0]]", result1.getRow().toString()); assertFalse(result1.next()); assertEquals(1, jdbcCompiledQuery.getActiveLeases()); @@ -243,8 +250,8 @@ public class JdbcDataContextTest extends JdbcTestCase { final Connection connection = getTestDbConnection(); final JdbcDataContext dataContext = new JdbcDataContext(connection); try { - dataContext.query().from("customers").select("customernumber").where(FunctionType.TO_BOOLEAN, "creditlimit") - .eq(true).limit(2).execute(); + dataContext.query().from("customers").select("customernumber") + .where(FunctionType.TO_BOOLEAN, "creditlimit").eq(true).limit(2).execute(); fail("Exception expected"); } catch (MetaModelException e) { assertEquals( @@ -382,8 +389,8 @@ public class JdbcDataContextTest extends JdbcTestCase { public void testParseColumns() throws Exception { Connection connection = getTestDbConnection(); - JdbcDataContext dc = new JdbcDataContext(connection, - new TableType[] { TableType.OTHER, TableType.GLOBAL_TEMPORARY }, null); + JdbcDataContext dc = new JdbcDataContext(connection, new TableType[] { TableType.OTHER, + TableType.GLOBAL_TEMPORARY }, null); Schema schema = dc.getDefaultSchema(); Table customersTable = schema.getTableByName("CUSTOMERS"); Column[] columns = customersTable.getColumns(); @@ -447,24 +454,24 @@ public class JdbcDataContextTest extends JdbcTestCase { EasyMock.expect(mockCon.getAutoCommit()).andReturn(true); - EasyMock.expect(mockCon.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) - .andReturn(mockStatement); + EasyMock.expect(mockCon.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)).andReturn( + mockStatement); EasyMock.expect(mockStatement.getFetchSize()).andReturn(10); mockStatement.setFetchSize(EasyMock.anyInt()); mockStatement.setMaxRows(3); EasyMock.expectLastCall().andThrow(new SQLException("I wont allow max rows")); - EasyMock.expect(mockStatement.executeQuery( - "SELECT a.\"CUSTOMERNUMBER\", a.\"CUSTOMERNAME\", a.\"CONTACTLASTNAME\", a.\"CONTACTFIRSTNAME\", " - + "a.\"PHONE\", a.\"ADDRESSLINE1\", a.\"ADDRESSLINE2\", a.\"CITY\", a.\"STATE\", " - + "a.\"POSTALCODE\", a.\"COUNTRY\", a.\"SALESREPEMPLOYEENUMBER\", " - + "a.\"CREDITLIMIT\" FROM PUBLIC.\"CUSTOMERS\" a")) - .andReturn(realStatement - .executeQuery("SELECT a.\"CUSTOMERNUMBER\", a.\"CUSTOMERNAME\", a.\"CONTACTLASTNAME\", " - + "a.\"CONTACTFIRSTNAME\", a.\"PHONE\", a.\"ADDRESSLINE1\", a.\"ADDRESSLINE2\", a.\"CITY\", " - + "a.\"STATE\", a.\"POSTALCODE\", a.\"COUNTRY\", a.\"SALESREPEMPLOYEENUMBER\", " - + "a.\"CREDITLIMIT\" FROM PUBLIC.\"CUSTOMERS\" a")); + EasyMock.expect( + mockStatement + .executeQuery("SELECT a.\"CUSTOMERNUMBER\", a.\"CUSTOMERNAME\", a.\"CONTACTLASTNAME\", a.\"CONTACTFIRSTNAME\", " + + "a.\"PHONE\", a.\"ADDRESSLINE1\", a.\"ADDRESSLINE2\", a.\"CITY\", a.\"STATE\", " + + "a.\"POSTALCODE\", a.\"COUNTRY\", a.\"SALESREPEMPLOYEENUMBER\", " + + "a.\"CREDITLIMIT\" FROM PUBLIC.\"CUSTOMERS\" a")).andReturn( + realStatement.executeQuery("SELECT a.\"CUSTOMERNUMBER\", a.\"CUSTOMERNAME\", a.\"CONTACTLASTNAME\", " + + "a.\"CONTACTFIRSTNAME\", a.\"PHONE\", a.\"ADDRESSLINE1\", a.\"ADDRESSLINE2\", a.\"CITY\", " + + "a.\"STATE\", a.\"POSTALCODE\", a.\"COUNTRY\", a.\"SALESREPEMPLOYEENUMBER\", " + + "a.\"CREDITLIMIT\" FROM PUBLIC.\"CUSTOMERS\" a")); mockStatement.close(); @@ -478,17 +485,15 @@ public class JdbcDataContextTest extends JdbcTestCase { Table table = schema.getTables()[0]; q.from(table, "a"); q.select(table.getColumns()); - assertEquals( - "SELECT a.\"CUSTOMERNUMBER\", a.\"CUSTOMERNAME\", a.\"CONTACTLASTNAME\", a.\"CONTACTFIRSTNAME\", " - + "a.\"PHONE\", a.\"ADDRESSLINE1\", a.\"ADDRESSLINE2\", a.\"CITY\", a.\"STATE\", a.\"POSTALCODE\", " - + "a.\"COUNTRY\", a.\"SALESREPEMPLOYEENUMBER\", a.\"CREDITLIMIT\" FROM PUBLIC.\"CUSTOMERS\" a", + assertEquals("SELECT a.\"CUSTOMERNUMBER\", a.\"CUSTOMERNAME\", a.\"CONTACTLASTNAME\", a.\"CONTACTFIRSTNAME\", " + + "a.\"PHONE\", a.\"ADDRESSLINE1\", a.\"ADDRESSLINE2\", a.\"CITY\", a.\"STATE\", a.\"POSTALCODE\", " + + "a.\"COUNTRY\", a.\"SALESREPEMPLOYEENUMBER\", a.\"CREDITLIMIT\" FROM PUBLIC.\"CUSTOMERS\" a", q.toString()); DataSet result = dc.executeQuery(q); assertTrue(result.next()); assertEquals( "Row[values=[103, Atelier graphique, Schmitt, Carine, 40.32.2555, 54, rue Royale, null, Nantes, null, " - + "44000, France, 1370, 21000.0]]", - result.getRow().toString()); + + "44000, France, 1370, 21000.0]]", result.getRow().toString()); assertTrue(result.next()); assertTrue(result.next()); assertFalse(result.next()); @@ -585,8 +590,8 @@ public class JdbcDataContextTest extends JdbcTestCase { q.select(countrySelect, new SelectItem(FunctionType.SUM, creditLimitColumn)); q.groupBy(countryColumn); q.orderBy(new OrderByItem(countrySelect)); - q.where(new FilterItem(new SelectItem(employeeNumberColumn1), OperatorType.EQUALS_TO, - new SelectItem(employeeNumberColumn2))); + q.where(new FilterItem(new SelectItem(employeeNumberColumn1), OperatorType.EQUALS_TO, new SelectItem( + employeeNumberColumn2))); assertEquals("SELECT c.\"COUNTRY\", SUM(c.\"CREDITLIMIT\") FROM PUBLIC.\"CUSTOMERS\" c, " + "PUBLIC.\"EMPLOYEES\" o WHERE c.\"SALESREPEMPLOYEENUMBER\" = o.\"EMPLOYEENUMBER\" GROUP BY c" @@ -619,8 +624,8 @@ public class JdbcDataContextTest extends JdbcTestCase { ds.setTimeBetweenEvictionRunsMillis(-1); ds.setDefaultTransactionIsolation(java.sql.Connection.TRANSACTION_READ_COMMITTED); - final JdbcDataContext dataContext = new JdbcDataContext(ds, new TableType[] { TableType.TABLE, TableType.VIEW }, - null); + final JdbcDataContext dataContext = new JdbcDataContext(ds, + new TableType[] { TableType.TABLE, TableType.VIEW }, null); final JdbcCompiledQuery compiledQuery = (JdbcCompiledQuery) dataContext.query().from("CUSTOMERS") .select("CUSTOMERNAME").where("CUSTOMERNUMBER").eq(new QueryParameter()).compile(); @@ -630,7 +635,8 @@ public class JdbcDataContextTest extends JdbcTestCase { final String compliedQueryString = compiledQuery.toSql(); - assertEquals("SELECT _CUSTOMERS_._CUSTOMERNAME_ FROM PUBLIC._CUSTOMERS_ WHERE _CUSTOMERS_._CUSTOMERNUMBER_ = ?", + assertEquals( + "SELECT _CUSTOMERS_._CUSTOMERNAME_ FROM PUBLIC._CUSTOMERS_ WHERE _CUSTOMERS_._CUSTOMERNUMBER_ = ?", compliedQueryString.replace('\"', '_')); assertEquals(0, compiledQuery.getActiveLeases());
