Skip to content

Commit 4ff592a

Browse files
Marcus SorensenMarcus Sorensen
andauthored
Use UserVmDao for listVirtualMachines API to increase performance (#8012)
Co-authored-by: Marcus Sorensen <mls@apple.com>
1 parent ea90848 commit 4ff592a

File tree

3 files changed

+494
-293
lines changed

3 files changed

+494
-293
lines changed

framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,6 +1264,11 @@ protected StringBuilder createPartialSelectSql(SearchCriteria<?> sc, final boole
12641264

12651265
@DB()
12661266
protected void addJoins(StringBuilder str, Collection<JoinBuilder<SearchCriteria<?>>> joins) {
1267+
addJoins(str, joins, new HashMap<>());
1268+
}
1269+
1270+
@DB()
1271+
protected void addJoins(StringBuilder str, Collection<JoinBuilder<SearchCriteria<?>>> joins, Map<String, Integer> joinedTableNames) {
12671272
boolean hasWhereClause = true;
12681273
int fromIndex = str.lastIndexOf("WHERE");
12691274
if (fromIndex == -1) {
@@ -1274,18 +1279,27 @@ protected void addJoins(StringBuilder str, Collection<JoinBuilder<SearchCriteria
12741279
}
12751280

12761281
for (JoinBuilder<SearchCriteria<?>> join : joins) {
1282+
String joinTableName = join.getSecondAttribute().table;
1283+
String joinTableAlias = findNextJoinTableName(joinTableName, joinedTableNames);
12771284
StringBuilder onClause = new StringBuilder();
12781285
onClause.append(" ")
12791286
.append(join.getType().getName())
12801287
.append(" ")
1281-
.append(join.getSecondAttribute().table)
1282-
.append(" ON ")
1288+
.append(joinTableName);
1289+
if (!joinTableAlias.equals(joinTableName)) {
1290+
onClause.append(" ").append(joinTableAlias);
1291+
}
1292+
onClause.append(" ON ")
12831293
.append(join.getFirstAttribute().table)
12841294
.append(".")
12851295
.append(join.getFirstAttribute().columnName)
1286-
.append("=")
1287-
.append(join.getSecondAttribute().table)
1288-
.append(".")
1296+
.append("=");
1297+
if(!joinTableAlias.equals(joinTableName)) {
1298+
onClause.append(joinTableAlias);
1299+
} else {
1300+
onClause.append(joinTableName);
1301+
}
1302+
onClause.append(".")
12891303
.append(join.getSecondAttribute().columnName)
12901304
.append(" ");
12911305
str.insert(fromIndex, onClause);
@@ -1306,11 +1320,22 @@ protected void addJoins(StringBuilder str, Collection<JoinBuilder<SearchCriteria
13061320

13071321
for (JoinBuilder<SearchCriteria<?>> join : joins) {
13081322
if (join.getT().getJoins() != null) {
1309-
addJoins(str, join.getT().getJoins());
1323+
addJoins(str, join.getT().getJoins(), joinedTableNames);
13101324
}
13111325
}
13121326
}
13131327

1328+
protected static String findNextJoinTableName(String tableName, Map<String, Integer> usedTableNames) {
1329+
if (usedTableNames.containsKey(tableName)) {
1330+
Integer tableCounter = usedTableNames.get(tableName);
1331+
usedTableNames.put(tableName, ++tableCounter);
1332+
tableName = tableName + tableCounter;
1333+
} else {
1334+
usedTableNames.put(tableName, 0);
1335+
}
1336+
return tableName;
1337+
}
1338+
13141339
private void removeAndClause(StringBuilder sql) {
13151340
sql.delete(sql.length() - 4, sql.length());
13161341
}

framework/db/src/test/java/com/cloud/utils/db/GenericDaoBaseTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818

1919
import java.sql.ResultSet;
2020
import java.sql.SQLException;
21+
import java.util.ArrayList;
22+
import java.util.Collection;
23+
import java.util.HashMap;
24+
import java.util.Map;
2125

2226
import org.junit.Assert;
2327
import org.junit.Before;
@@ -36,6 +40,7 @@ public class GenericDaoBaseTest {
3640
@Mock
3741
SQLException mockedSQLException;
3842

43+
private static final DbTestDao dbTestDao = new DbTestDao();
3944
private static final String INTEGRITY_CONSTRAINT_VIOLATION = "23000";
4045
private static final int DUPLICATE_ENTRY_ERRO_CODE = 1062;
4146

@@ -214,4 +219,51 @@ public void checkCountOfRecordsAgainstTheResultSetSizeTestCountSmallerThanResult
214219

215220
Assert.assertEquals(resultSetSize, result);
216221
}
222+
223+
@Test
224+
public void addJoinsTest() {
225+
StringBuilder joinString = new StringBuilder();
226+
Collection<JoinBuilder<SearchCriteria<?>>> joins = new ArrayList<>();
227+
228+
Attribute attr1 = new Attribute("table1", "column1");
229+
Attribute attr2 = new Attribute("table2", "column2");
230+
Attribute attr3 = new Attribute("table3", "column1");
231+
Attribute attr4 = new Attribute("table4", "column2");
232+
233+
joins.add(new JoinBuilder<>(dbTestDao.createSearchCriteria(), attr1, attr2, JoinBuilder.JoinType.INNER));
234+
joins.add(new JoinBuilder<>(dbTestDao.createSearchCriteria(), attr3, attr4, JoinBuilder.JoinType.INNER));
235+
dbTestDao.addJoins(joinString, joins);
236+
237+
Assert.assertEquals(" INNER JOIN table2 ON table1.column1=table2.column2 INNER JOIN table4 ON table3.column1=table4.column2 ", joinString.toString());
238+
}
239+
240+
@Test
241+
public void multiJoinSameTableTest() {
242+
StringBuilder joinString = new StringBuilder();
243+
Collection<JoinBuilder<SearchCriteria<?>>> joins = new ArrayList<>();
244+
245+
Attribute tAc1 = new Attribute("tableA", "column1");
246+
Attribute tAc2 = new Attribute("tableA", "column2");
247+
Attribute tAc3 = new Attribute("tableA", "column3");
248+
Attribute tBc2 = new Attribute("tableB", "column2");
249+
Attribute tCc3 = new Attribute("tableC", "column3");
250+
Attribute tDc4 = new Attribute("tableD", "column4");
251+
252+
joins.add(new JoinBuilder<>(dbTestDao.createSearchCriteria(), tBc2, tAc1, JoinBuilder.JoinType.INNER));
253+
joins.add(new JoinBuilder<>(dbTestDao.createSearchCriteria(), tCc3, tAc2, JoinBuilder.JoinType.INNER));
254+
joins.add(new JoinBuilder<>(dbTestDao.createSearchCriteria(), tDc4, tAc3, JoinBuilder.JoinType.INNER));
255+
dbTestDao.addJoins(joinString, joins);
256+
257+
Assert.assertEquals(" INNER JOIN tableA ON tableB.column2=tableA.column1 INNER JOIN tableA tableA1 ON tableC.column3=tableA1.column2 INNER JOIN tableA tableA2 ON tableD.column4=tableA2.column3 ", joinString.toString());
258+
}
259+
260+
@Test
261+
public void findNextTableNameTest() {
262+
Map<String, Integer> usedTables = new HashMap<>();
263+
264+
Assert.assertEquals("tableA", GenericDaoBase.findNextJoinTableName("tableA", usedTables));
265+
Assert.assertEquals("tableA1", GenericDaoBase.findNextJoinTableName("tableA", usedTables));
266+
Assert.assertEquals("tableA2", GenericDaoBase.findNextJoinTableName("tableA", usedTables));
267+
Assert.assertEquals("tableA3", GenericDaoBase.findNextJoinTableName("tableA", usedTables));
268+
}
217269
}

0 commit comments

Comments
 (0)