IGNITE-12672 Fix incorrect parsing of lower-case statements in Spring Data - Fixes #7420.
Signed-off-by: Ilya Kasnacheev <ilya.kasnacheev@gmail.com>
diff --git a/modules/spring-data-2.0/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactory.java b/modules/spring-data-2.0/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactory.java
index f1ce9e3..3382c8a 100644
--- a/modules/spring-data-2.0/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactory.java
+++ b/modules/spring-data-2.0/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactory.java
@@ -198,18 +198,20 @@
* @return {@code true} if query is SqlFieldsQuery.
*/
private boolean isFieldQuery(String qry) {
- return isStatement(qry) && !qry.matches("^SELECT\\s+(?:\\w+\\.)?+\\*.*");
+ String qryUpperCase = qry.toUpperCase();
+
+ return isStatement(qryUpperCase) && !qryUpperCase.matches("^SELECT\\s+(?:\\w+\\.)?+\\*.*");
}
/**
* Evaluates if the query starts with a clause.<br>
* <code>SELECT, INSERT, UPDATE, MERGE, DELETE</code>
*
- * @param qry Query string.
+ * @param qryUpperCase Query string in upper case.
* @return {@code true} if query is full SQL statement.
*/
- private boolean isStatement(String qry) {
- return qry.matches("^SELECT.*") || qry.matches("^UPDATE.*") || qry.matches("^DELETE.*") ||
- qry.matches("^MERGE.*") || qry.matches("^INSERT.*");
+ private boolean isStatement(String qryUpperCase ) {
+ return qryUpperCase.matches("^\\s*SELECT\\b.*") || qryUpperCase.matches("^\\s*UPDATE\\b.*") || qryUpperCase.matches("^\\s*DELETE\\b.*") ||
+ qryUpperCase.matches("^\\s*MERGE\\b.*") || qryUpperCase.matches("^\\s*INSERT\\b.*");
}
}
diff --git a/modules/spring-data-2.0/src/test/java/org/apache/ignite/springdata/IgniteSpringDataCrudSelfTest.java b/modules/spring-data-2.0/src/test/java/org/apache/ignite/springdata/IgniteSpringDataCrudSelfTest.java
index ceaf487..7210d64 100644
--- a/modules/spring-data-2.0/src/test/java/org/apache/ignite/springdata/IgniteSpringDataCrudSelfTest.java
+++ b/modules/spring-data-2.0/src/test/java/org/apache/ignite/springdata/IgniteSpringDataCrudSelfTest.java
@@ -289,11 +289,11 @@
}
/**
- * Delete unique record
+ * Delete unique record using lower case key word
*/
@Test
public void testDeleteQuery() {
- repo.deleteBySecondNameQuery("uniqueLastName");
+ repo.deleteBySecondNameLowerCase("uniqueLastName");
long countAfter = repo.count();
assertEquals(CACHE_SIZE - 1, countAfter);
@@ -321,9 +321,9 @@
* Update with a @Query a record
*/
@Test
- public void testUpdateQuery() {
+ public void testUpdateQueryMixedCase() {
final String newSecondName = "updatedUniqueSecondName";
- int cnt = repo.setFixedSecondNameFor(newSecondName, "uniquePerson");
+ int cnt = repo.setFixedSecondNameMixedCase(newSecondName, "uniquePerson");
assertEquals(1, cnt);
diff --git a/modules/spring-data-2.0/src/test/java/org/apache/ignite/springdata/misc/PersonRepository.java b/modules/spring-data-2.0/src/test/java/org/apache/ignite/springdata/misc/PersonRepository.java
index 90d8123..bb2b93f 100644
--- a/modules/spring-data-2.0/src/test/java/org/apache/ignite/springdata/misc/PersonRepository.java
+++ b/modules/spring-data-2.0/src/test/java/org/apache/ignite/springdata/misc/PersonRepository.java
@@ -101,17 +101,17 @@
/** Remove Query */
public List<Person> removeByFirstName(String firstName);
- /** Delete using @Query */
- @Query("DELETE FROM Person WHERE secondName = ?")
- public void deleteBySecondNameQuery(String secondName);
+ /** Delete using @Query with keyword in lower-case */
+ @Query("delete FROM Person WHERE secondName = ?")
+ public void deleteBySecondNameLowerCase(String secondName);
/** Delete using @Query but with errors on the query */
@Query("DELETE FROM Person WHERE firstName = ? AND ERRORS = 'ERRORS'")
public void deleteWrongByFirstNameQuery(String firstName);
- /** Update using @Query */
- @Query("UPDATE Person SET secondName = ? WHERE firstName = ?")
- public int setFixedSecondNameFor(String secondName, String firstName);
+ /** Update using @Query with keyword in mixed-case */
+ @Query("upDATE Person SET secondName = ? WHERE firstName = ?")
+ public int setFixedSecondNameMixedCase(String secondName, String firstName);
/** Update using @Query but with errors on the query */
@Query("UPDATE Person SET secondName = ? WHERE firstName = ? AND ERRORS = 'ERRORS'")
diff --git a/modules/spring-data-2.2/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactory.java b/modules/spring-data-2.2/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactory.java
index 6625ebc..882b305 100644
--- a/modules/spring-data-2.2/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactory.java
+++ b/modules/spring-data-2.2/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactory.java
@@ -198,18 +198,20 @@
* @return {@code true} if query is SqlFieldsQuery.
*/
private boolean isFieldQuery(String qry) {
- return isStatement(qry) && !qry.matches("^SELECT\\s+(?:\\w+\\.)?+\\*.*");
+ String qryUpperCase = qry.toUpperCase();
+
+ return isStatement(qryUpperCase) && !qryUpperCase.matches("^SELECT\\s+(?:\\w+\\.)?+\\*.*");
}
/**
* Evaluates if the query starts with a clause.<br>
* <code>SELECT, INSERT, UPDATE, MERGE, DELETE</code>
*
- * @param qry Query string.
+ * @param qryUpperCase Query string.
* @return {@code true} if query is full SQL statement.
*/
- private boolean isStatement(String qry) {
- return qry.matches("^SELECT.*") || qry.matches("^UPDATE.*") || qry.matches("^DELETE.*") ||
- qry.matches("^MERGE.*") || qry.matches("^INSERT.*");
+ private boolean isStatement(String qryUpperCase ) {
+ return qryUpperCase.matches("^\\s*SELECT\\b.*") || qryUpperCase.matches("^\\s*UPDATE\\b.*") || qryUpperCase.matches("^\\s*DELETE\\b.*") ||
+ qryUpperCase.matches("^\\s*MERGE\\b.*") || qryUpperCase.matches("^\\s*INSERT\\b.*");
}
}
diff --git a/modules/spring-data-2.2/src/test/java/org/apache/ignite/springdata/IgniteSpringDataCrudSelfTest.java b/modules/spring-data-2.2/src/test/java/org/apache/ignite/springdata/IgniteSpringDataCrudSelfTest.java
index 8e9a46c..a4cf8d3 100644
--- a/modules/spring-data-2.2/src/test/java/org/apache/ignite/springdata/IgniteSpringDataCrudSelfTest.java
+++ b/modules/spring-data-2.2/src/test/java/org/apache/ignite/springdata/IgniteSpringDataCrudSelfTest.java
@@ -289,11 +289,11 @@
}
/**
- * Delete unique record
+ * Delete unique record using lower case key word
*/
@Test
public void testDeleteQuery() {
- repo.deleteBySecondNameQuery("uniqueLastName");
+ repo.deleteBySecondNameLowerCase("uniqueLastName");
long countAfter = repo.count();
assertEquals(CACHE_SIZE - 1, countAfter);
@@ -321,9 +321,9 @@
* Update with a @Query a record
*/
@Test
- public void testUpdateQuery() {
+ public void testUpdateQueryMixedCase() {
final String newSecondName = "updatedUniqueSecondName";
- int cnt = repo.setFixedSecondNameFor(newSecondName, "uniquePerson");
+ int cnt = repo.setFixedSecondNameMixedCase(newSecondName, "uniquePerson");
assertEquals(1, cnt);
diff --git a/modules/spring-data-2.2/src/test/java/org/apache/ignite/springdata/misc/PersonRepository.java b/modules/spring-data-2.2/src/test/java/org/apache/ignite/springdata/misc/PersonRepository.java
index b90d14c..88c3ae7 100644
--- a/modules/spring-data-2.2/src/test/java/org/apache/ignite/springdata/misc/PersonRepository.java
+++ b/modules/spring-data-2.2/src/test/java/org/apache/ignite/springdata/misc/PersonRepository.java
@@ -101,17 +101,17 @@
/** Remove Query */
public long removeByFirstName(String firstName);
- /** Delete using @Query */
- @Query("DELETE FROM Person WHERE secondName = ?")
- public void deleteBySecondNameQuery(String secondName);
+ /** Delete using @Query with keyword in lower-case */
+ @Query("delete FROM Person WHERE secondName = ?")
+ public void deleteBySecondNameLowerCase(String secondName);
/** Delete using @Query but with errors on the query */
@Query("DELETE FROM Person WHERE firstName = ? AND ERRORS = 'ERRORS'")
public void deleteWrongByFirstNameQuery(String firstName);
- /** Update using @Query */
- @Query("UPDATE Person SET secondName = ? WHERE firstName = ?")
- public int setFixedSecondNameFor(String secondName, String firstName);
+ /** Update using @Query with keyword in mixed-case */
+ @Query("upDATE Person SET secondName = ? WHERE firstName = ?")
+ public int setFixedSecondNameMixedCase(String secondName, String firstName);
/** Update using @Query but with errors on the query */
@Query("UPDATE Person SET secondName = ? WHERE firstName = ? AND ERRORS = 'ERRORS'")