From 7fc49c2cb80ce765afd940d1e4209a8677e5d3f2 Mon Sep 17 00:00:00 2001 From: Matthew Burgess Date: Thu, 25 Apr 2019 15:45:26 -0400 Subject: [PATCH] NIFI-6244: Provide default ORDER BY clause in MSSQL adapters This closes #3454. Signed-off-by: Bryan Bende --- .../standard/db/impl/MSSQL2008DatabaseAdapter.java | 9 +++++++-- .../standard/db/impl/MSSQLDatabaseAdapter.java | 3 ++- .../standard/db/impl/TestMSSQL2008DatabaseAdapter.java | 8 ++++++++ .../standard/db/impl/TestMSSQLDatabaseAdapter.java | 6 ++++-- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/db/impl/MSSQL2008DatabaseAdapter.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/db/impl/MSSQL2008DatabaseAdapter.java index 610b34da9b..fed4dfae7a 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/db/impl/MSSQL2008DatabaseAdapter.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/db/impl/MSSQL2008DatabaseAdapter.java @@ -65,9 +65,14 @@ public class MSSQL2008DatabaseAdapter extends MSSQLDatabaseAdapter { query.append(columnNames); } - if (limit != null && offset != null && orderByClause != null && !useColumnForPartitioning) { + if (limit != null && offset != null && !useColumnForPartitioning) { query.append(", ROW_NUMBER() OVER(ORDER BY "); - query.append(orderByClause); + if (orderByClause != null && !orderByClause.isEmpty()) { + query.append(orderByClause); + } else { + // Add a default ORDER BY clause using the newid() function + query.append("newid()"); + } query.append(" asc) rnum"); } query.append(" FROM "); diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/db/impl/MSSQLDatabaseAdapter.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/db/impl/MSSQLDatabaseAdapter.java index ec276fc651..8740302236 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/db/impl/MSSQLDatabaseAdapter.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/db/impl/MSSQLDatabaseAdapter.java @@ -83,7 +83,8 @@ public class MSSQLDatabaseAdapter implements DatabaseAdapter { if (StringUtils.isEmpty(columnForPartitioning)) { if (offset != null && limit != null && limit > 0) { if (StringUtils.isEmpty(orderByClause)) { - throw new IllegalArgumentException("Order by clause cannot be null or empty when using row paging"); + // Add a default ORDER BY clause using the newid() function + query.append(" ORDER BY newid()"); } query.append(" OFFSET "); diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/db/impl/TestMSSQL2008DatabaseAdapter.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/db/impl/TestMSSQL2008DatabaseAdapter.java index 912a720a1c..6cc4eb32b9 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/db/impl/TestMSSQL2008DatabaseAdapter.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/db/impl/TestMSSQL2008DatabaseAdapter.java @@ -47,6 +47,14 @@ public class TestMSSQL2008DatabaseAdapter { db.getSelectStatement("", "some(set),of(columns),that,might,contain,methods,a.*", "", "", null, null); } + @Test + public void testPagingNoOrderBy() throws Exception { + String sql1 = db.getSelectStatement("database.tablename", "some(set),of(columns),that,might,contain,methods,a.*","",null,10L,0L); + String expected1 = "SELECT * FROM (SELECT TOP 10 some(set),of(columns),that,might,contain,methods,a.*, ROW_NUMBER() OVER(ORDER BY newid() asc) rnum " + + "FROM database.tablename) A WHERE rnum > 0 AND rnum <= 10"; + Assert.assertEquals(sql1,expected1); + } + @Test public void testTOPQuery() throws Exception { String sql = db.getSelectStatement("database.tablename", "some(set),of(columns),that,might,contain,methods,a.*", "", "", 100L, null); diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/db/impl/TestMSSQLDatabaseAdapter.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/db/impl/TestMSSQLDatabaseAdapter.java index de33753797..c760052860 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/db/impl/TestMSSQLDatabaseAdapter.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/db/impl/TestMSSQLDatabaseAdapter.java @@ -47,9 +47,11 @@ public class TestMSSQLDatabaseAdapter { db.getSelectStatement("", "some(set),of(columns),that,might,contain,methods,a.*","","",null,null); } - @Test(expected = IllegalArgumentException.class) + @Test public void testPagingNoOrderBy() throws Exception { - db.getSelectStatement("database.tablename", "some(set),of(columns),that,might,contain,methods,a.*","","",10L,0L); + String sql1 = db.getSelectStatement("database.tablename", "some(set),of(columns),that,might,contain,methods,a.*","","",10L,0L); + String expected1 = "SELECT some(set),of(columns),that,might,contain,methods,a.* FROM database.tablename ORDER BY newid() OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY"; + Assert.assertEquals(sql1,expected1); } @Test