From 7f01bf78cfce89e446f57d7f0410ccb14be4646b Mon Sep 17 00:00:00 2001 From: BenjaminHetzJelli Date: Thu, 17 Oct 2019 23:32:12 -0600 Subject: [PATCH] Trim Keywords Followed By Whitespace Other Than The Character ' ' Modify `removeKeyWord(...)` such that the keyword is removed regardless of what kind of whitespace follows. This is especially useful for those who read in SQL from a file which has been formatted such that keywords live on their own lines. Added unit tests for trimming whitespace. Resolves #765 --- .../AbstractSqlPagingQueryProvider.java | 9 ++-- .../AbstractSqlPagingQueryProviderTests.java | 45 ++++++++++++++++++- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProvider.java index 265bd692f..e38619845 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2018 the original author or authors. + * Copyright 2006-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,6 +50,7 @@ import org.springframework.util.StringUtils; * @author Dave Syer * @author Michael Minella * @author Mahmoud Ben Hassine + * @author Benjamin Hetz * @since 2.0 */ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvider { @@ -242,9 +243,9 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi private String removeKeyWord(String keyWord, String clause) { String temp = clause.trim(); - String keyWordString = keyWord + " "; - if (temp.toLowerCase().startsWith(keyWordString) && temp.length() > keyWordString.length()) { - return temp.substring(keyWordString.length()); + int length = keyWord.length(); + if (temp.toLowerCase().startsWith(keyWord) && Character.isWhitespace(temp.charAt(length)) && temp.length() > length + 1) { + return temp.substring(length + 1); } else { return temp; diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProviderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProviderTests.java index ae8887586..b157ab7be 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProviderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProviderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2012 the original author or authors. + * Copyright 2006-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ import org.springframework.batch.item.database.Order; /** * @author Thomas Risberg * @author Michael Minella + * @author Benjamin Hetz */ public abstract class AbstractSqlPagingQueryProviderTests { @@ -104,6 +105,48 @@ public abstract class AbstractSqlPagingQueryProviderTests { assertEquals(getJumpToItemQueryForFirstPageWithMultipleSortKeys(), s); } + @Test + public void testRemoveKeyWordsFollowedBySpaceChar() { + String selectClause = "SELECT id, 'yes', false"; + String fromClause = "FROM test.verification_table"; + String whereClause = "WHERE TRUE"; + pagingQueryProvider.setSelectClause(selectClause); + pagingQueryProvider.setFromClause(fromClause); + pagingQueryProvider.setWhereClause(whereClause); + + assertEquals("id, 'yes', false", pagingQueryProvider.getSelectClause()); + assertEquals("test.verification_table", pagingQueryProvider.getFromClause()); + assertEquals("TRUE", pagingQueryProvider.getWhereClause()); + } + + @Test + public void testRemoveKeyWordsFollowedByTabChar() { + String selectClause = "SELECT\tid, 'yes', false"; + String fromClause = "FROM\ttest.verification_table"; + String whereClause = "WHERE\tTRUE"; + pagingQueryProvider.setSelectClause(selectClause); + pagingQueryProvider.setFromClause(fromClause); + pagingQueryProvider.setWhereClause(whereClause); + + assertEquals("id, 'yes', false", pagingQueryProvider.getSelectClause()); + assertEquals("test.verification_table", pagingQueryProvider.getFromClause()); + assertEquals("TRUE", pagingQueryProvider.getWhereClause()); + } + + @Test + public void testRemoveKeyWordsFollowedByNewLineChar() { + String selectClause = "SELECT\nid, 'yes', false"; + String fromClause = "FROM\ntest.verification_table"; + String whereClause = "WHERE\nTRUE"; + pagingQueryProvider.setSelectClause(selectClause); + pagingQueryProvider.setFromClause(fromClause); + pagingQueryProvider.setWhereClause(whereClause); + + assertEquals("id, 'yes', false", pagingQueryProvider.getSelectClause()); + assertEquals("test.verification_table", pagingQueryProvider.getFromClause()); + assertEquals("TRUE", pagingQueryProvider.getWhereClause()); + } + @Test public abstract void testGenerateFirstPageQuery();