diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGenerator.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGenerator.java index 4c6a23429..36d13697e 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGenerator.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGenerator.java @@ -91,7 +91,7 @@ public class DatabaseSpecificSQLGenerator { } } - public String countLastExecutedQueryResult(String sql) { + public String countLastExecutedQueryResult(@NotNull String sql) { if (databaseTypeResolver.isMySQL()) { return "SELECT FOUND_ROWS()"; } else { @@ -99,7 +99,9 @@ public class DatabaseSpecificSQLGenerator { } } - public String countQueryResult(String sql) { + public String countQueryResult(@NotNull String sql) { + // Needs to remove the limit and offset + sql = sql.replaceAll("LIMIT \\d+", "").replaceAll("OFFSET \\d+", "").trim(); return format("SELECT COUNT(*) FROM (%s) AS temp", sql); } diff --git a/fineract-core/src/test/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGeneratorTest.java b/fineract-core/src/test/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGeneratorTest.java new file mode 100644 index 000000000..57eb471bd --- /dev/null +++ b/fineract-core/src/test/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGeneratorTest.java @@ -0,0 +1,64 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.infrastructure.core.service.database; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +public class DatabaseSpecificSQLGeneratorTest { + + private final DatabaseTypeResolver databaseTypeResolver = Mockito.mock(DatabaseTypeResolver.class); + private final DatabaseSpecificSQLGenerator databaseSpecificSQLGenerator = new DatabaseSpecificSQLGenerator(databaseTypeResolver); + + @Test + public void testCountQueryResultOnEmptyString() { + String sql = ""; + String countQuery = databaseSpecificSQLGenerator.countQueryResult(sql); + Assertions.assertEquals("SELECT COUNT(*) FROM () AS temp", countQuery); + } + + @Test + public void testCountQueryResultOnSqlWithoutLimitOrOffset() { + String sql = "SELECT 1 FROM test_table WHERE asd=2"; + String countQuery = databaseSpecificSQLGenerator.countQueryResult(sql); + Assertions.assertEquals("SELECT COUNT(*) FROM (" + sql + ") AS temp", countQuery); + } + + @Test + public void testCountQueryResultOnSqlWithLimit() { + String sql = "SELECT 1 FROM test_table WHERE asd=2 LIMIT 2"; + String countQuery = databaseSpecificSQLGenerator.countQueryResult(sql); + Assertions.assertEquals("SELECT COUNT(*) FROM (SELECT 1 FROM test_table WHERE asd=2) AS temp", countQuery); + } + + @Test + public void testCountQueryResultOnSqlWithOffset() { + String sql = "SELECT 1 FROM test_table WHERE asd=2 OFFSET 2"; + String countQuery = databaseSpecificSQLGenerator.countQueryResult(sql); + Assertions.assertEquals("SELECT COUNT(*) FROM (SELECT 1 FROM test_table WHERE asd=2) AS temp", countQuery); + } + + @Test + public void testCountQueryResultOnSqlWithLimitAndOffset() { + String sql = "SELECT 1 FROM test_table WHERE asd=2 OFFSET 2 LIMIT 50"; + String countQuery = databaseSpecificSQLGenerator.countQueryResult(sql); + Assertions.assertEquals("SELECT COUNT(*) FROM (SELECT 1 FROM test_table WHERE asd=2) AS temp", countQuery); + } +}