From 120ee250364a4333fe77dad6dedb8297ee12b669 Mon Sep 17 00:00:00 2001 From: davidjumani Date: Mon, 5 Oct 2020 20:27:44 +0530 Subject: [PATCH 1/2] Fixing searchAndCount searchAndDistinctCount when sc is null --- .../com/cloud/utils/db/GenericDaoBase.java | 73 +++++++++++-------- 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java index 1c183ede556a..7cdde6946b40 100644 --- a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java +++ b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java @@ -344,23 +344,13 @@ public T lockOneRandomRow(final SearchCriteria sc, final boolean exclusive) { @DB() protected List search(SearchCriteria sc, final Filter filter, final Boolean lock, final boolean cache) { - if (_removed != null) { - if (sc == null) { - sc = createSearchCriteria(); - } - sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL); - } + sc = checkAndSetRemovedIsNull(sc); return searchIncludingRemoved(sc, filter, lock, cache); } @DB() protected List search(SearchCriteria sc, final Filter filter, final Boolean lock, final boolean cache, final boolean enableQueryCache) { - if (_removed != null) { - if (sc == null) { - sc = createSearchCriteria(); - } - sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL); - } + sc = checkAndSetRemovedIsNull(sc); return searchIncludingRemoved(sc, filter, lock, cache, enableQueryCache); } @@ -519,7 +509,6 @@ public List customSearch(SearchCriteria sc, final Filter filter) { if (_removed != null) { sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL); } - return customSearchIncludingRemoved(sc, filter); } @@ -911,26 +900,20 @@ protected T findOneIncludingRemovedBy(final SearchCriteria sc) { @Override @DB() - public T findOneBy(final SearchCriteria sc) { - if (_removed != null) { - sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL); - } + public T findOneBy(SearchCriteria sc) { + sc = checkAndSetRemovedIsNull(sc); return findOneIncludingRemovedBy(sc); } @DB() - protected List listBy(final SearchCriteria sc, final Filter filter) { - if (_removed != null) { - sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL); - } + protected List listBy(SearchCriteria sc, final Filter filter) { + sc = checkAndSetRemovedIsNull(sc); return listIncludingRemovedBy(sc, filter); } @DB() - protected List listBy(final SearchCriteria sc, final Filter filter, final boolean enableQueryCache) { - if (_removed != null) { - sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL); - } + protected List listBy(SearchCriteria sc, final Filter filter, final boolean enableQueryCache) { + sc = checkAndSetRemovedIsNull(sc); return listIncludingRemovedBy(sc, filter, enableQueryCache); } @@ -1329,7 +1312,7 @@ public List search(final SearchCriteria sc, final Filter filter) { @DB() public Pair, Integer> searchAndCount(final SearchCriteria sc, final Filter filter) { List objects = search(sc, filter, null, false); - Integer count = getCount(sc); + Integer count = getCount(sc, false); // Count cannot be less than the result set but can be higher due to pagination, see CLOUDSTACK-10320 if (count < objects.size()) { count = objects.size(); @@ -1341,7 +1324,7 @@ public Pair, Integer> searchAndCount(final SearchCriteria sc, final F @DB() public Pair, Integer> searchAndDistinctCount(final SearchCriteria sc, final Filter filter) { List objects = search(sc, filter, null, false); - Integer count = getDistinctCount(sc); + Integer count = getDistinctCount(sc, false); // Count cannot be 0 if there is at least a result in the list, see CLOUDSTACK-10320 if (count == 0 && !objects.isEmpty()) { // Cannot assume if it's more than one since the count is distinct vs search @@ -1354,7 +1337,7 @@ public Pair, Integer> searchAndDistinctCount(final SearchCriteria sc, @DB() public Pair, Integer> searchAndDistinctCount(final SearchCriteria sc, final Filter filter, final String[] distinctColumns) { List objects = search(sc, filter, null, false); - Integer count = getDistinctCount(sc, distinctColumns); + Integer count = getDistinctCount(sc, distinctColumns, false); // Count cannot be 0 if there is at least a result in the list, see CLOUDSTACK-10320 if (count == 0 && !objects.isEmpty()) { // Cannot assume if it's more than one since the count is distinct vs search @@ -1935,6 +1918,23 @@ public SearchCriteria createSearchCriteria() { return builder.create(); } + private SearchCriteria checkAndSetRemovedIsNull(SearchCriteria sc) { + if (_removed != null) { + if (sc == null) { + sc = createSearchCriteria(); + } + sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL); + } + return sc; + } + + public Integer getDistinctCount(SearchCriteria sc, boolean removed) { + if (!removed) { + sc = checkAndSetRemovedIsNull(sc); + } + return getDistinctCount(sc); + } + public Integer getDistinctCount(SearchCriteria sc) { String clause = sc != null ? sc.getWhereClause() : null; if (clause != null && clause.length() == 0) { @@ -1993,6 +1993,13 @@ public Integer getDistinctCount(SearchCriteria sc) { } } + public Integer getDistinctCount(SearchCriteria sc, String[] distinctColumns, boolean removed) { + if (!removed) { + sc = checkAndSetRemovedIsNull(sc); + } + return getDistinctCount(sc, distinctColumns); + } + public Integer getDistinctCount(SearchCriteria sc, String[] distinctColumns) { String clause = sc != null ? sc.getWhereClause() : null; if (Strings.isNullOrEmpty(clause)) { @@ -2041,9 +2048,13 @@ public Integer getDistinctCount(SearchCriteria sc, String[] distinctColumns) public Integer countAll() { SearchCriteria sc = null; - if (_removed != null) { - sc = createSearchCriteria(); - sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL); + sc = checkAndSetRemovedIsNull(sc); + return getCount(sc); + } + + public Integer getCount(SearchCriteria sc, boolean removed) { + if (!removed) { + sc = checkAndSetRemovedIsNull(sc); } return getCount(sc); } From 9a7be557449cde600067a64a930237d410aab0ce Mon Sep 17 00:00:00 2001 From: davidjumani Date: Tue, 6 Oct 2020 13:16:56 +0530 Subject: [PATCH 2/2] Adding getCountIncludingRemoved and getDistinctCountIncludingRemoved --- .../java/com/cloud/host/dao/HostDaoImpl.java | 1 - .../as/dao/AutoScaleVmGroupVmMapDaoImpl.java | 2 +- .../com/cloud/vm/dao/DomainRouterDaoImpl.java | 1 - .../datastore/db/ImageStoreDaoImpl.java | 1 - .../com/cloud/utils/db/GenericDaoBase.java | 40 ++++++++----------- .../api/query/dao/TemplateJoinDaoImpl.java | 2 +- 6 files changed, 18 insertions(+), 29 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/host/dao/HostDaoImpl.java b/engine/schema/src/main/java/com/cloud/host/dao/HostDaoImpl.java index 75304c1b2741..e931f6515717 100644 --- a/engine/schema/src/main/java/com/cloud/host/dao/HostDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/host/dao/HostDaoImpl.java @@ -165,7 +165,6 @@ public void init() { HostTypeCountSearch = createSearchBuilder(); HostTypeCountSearch.and("type", HostTypeCountSearch.entity().getType(), SearchCriteria.Op.EQ); - HostTypeCountSearch.and("removed", HostTypeCountSearch.entity().getRemoved(), SearchCriteria.Op.NULL); HostTypeCountSearch.done(); HostTypeZoneCountSearch = createSearchBuilder(); diff --git a/engine/schema/src/main/java/com/cloud/network/as/dao/AutoScaleVmGroupVmMapDaoImpl.java b/engine/schema/src/main/java/com/cloud/network/as/dao/AutoScaleVmGroupVmMapDaoImpl.java index 24a3c1013cfe..410d40bc9718 100644 --- a/engine/schema/src/main/java/com/cloud/network/as/dao/AutoScaleVmGroupVmMapDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/network/as/dao/AutoScaleVmGroupVmMapDaoImpl.java @@ -33,7 +33,7 @@ public Integer countByGroup(long vmGroupId) { SearchCriteria sc = createSearchCriteria(); sc.addAnd("vmGroupId", SearchCriteria.Op.EQ, vmGroupId); - return getCount(sc); + return getCountIncludingRemoved(sc); } @Override diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDaoImpl.java b/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDaoImpl.java index 17f0ffdeff4a..135f96f28f3b 100644 --- a/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDaoImpl.java @@ -189,7 +189,6 @@ public List listByDataCenter(final long dcId) { public Integer countAllByRole(final Role role) { final SearchCriteria sc = createSearchCriteria(); sc.addAnd("role", SearchCriteria.Op.EQ, role); - sc.addAnd("removed", Op.NULL); return getCount(sc); } diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java index 6ecac5ed8094..96a41af41078 100644 --- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java +++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java @@ -117,7 +117,6 @@ public List findImageCacheByScope(ZoneScope scope) { public Integer countAllImageStores() { SearchCriteria sc = createSearchCriteria(); sc.addAnd("role", SearchCriteria.Op.EQ, DataStoreRole.Image); - sc.addAnd("removed", SearchCriteria.Op.NULL); return getCount(sc); } diff --git a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java index 7cdde6946b40..7d1b7b75ec99 100644 --- a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java +++ b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java @@ -1312,7 +1312,7 @@ public List search(final SearchCriteria sc, final Filter filter) { @DB() public Pair, Integer> searchAndCount(final SearchCriteria sc, final Filter filter) { List objects = search(sc, filter, null, false); - Integer count = getCount(sc, false); + Integer count = getCount(sc); // Count cannot be less than the result set but can be higher due to pagination, see CLOUDSTACK-10320 if (count < objects.size()) { count = objects.size(); @@ -1324,7 +1324,7 @@ public Pair, Integer> searchAndCount(final SearchCriteria sc, final F @DB() public Pair, Integer> searchAndDistinctCount(final SearchCriteria sc, final Filter filter) { List objects = search(sc, filter, null, false); - Integer count = getDistinctCount(sc, false); + Integer count = getDistinctCount(sc); // Count cannot be 0 if there is at least a result in the list, see CLOUDSTACK-10320 if (count == 0 && !objects.isEmpty()) { // Cannot assume if it's more than one since the count is distinct vs search @@ -1337,7 +1337,7 @@ public Pair, Integer> searchAndDistinctCount(final SearchCriteria sc, @DB() public Pair, Integer> searchAndDistinctCount(final SearchCriteria sc, final Filter filter, final String[] distinctColumns) { List objects = search(sc, filter, null, false); - Integer count = getDistinctCount(sc, distinctColumns, false); + Integer count = getDistinctCount(sc, distinctColumns); // Count cannot be 0 if there is at least a result in the list, see CLOUDSTACK-10320 if (count == 0 && !objects.isEmpty()) { // Cannot assume if it's more than one since the count is distinct vs search @@ -1928,14 +1928,12 @@ private SearchCriteria checkAndSetRemovedIsNull(SearchCriteria sc) { return sc; } - public Integer getDistinctCount(SearchCriteria sc, boolean removed) { - if (!removed) { - sc = checkAndSetRemovedIsNull(sc); - } - return getDistinctCount(sc); + public Integer getDistinctCount(SearchCriteria sc) { + sc = checkAndSetRemovedIsNull(sc); + return getDistinctCountIncludingRemoved(sc); } - public Integer getDistinctCount(SearchCriteria sc) { + public Integer getDistinctCountIncludingRemoved(SearchCriteria sc) { String clause = sc != null ? sc.getWhereClause() : null; if (clause != null && clause.length() == 0) { clause = null; @@ -1993,14 +1991,12 @@ public Integer getDistinctCount(SearchCriteria sc) { } } - public Integer getDistinctCount(SearchCriteria sc, String[] distinctColumns, boolean removed) { - if (!removed) { - sc = checkAndSetRemovedIsNull(sc); - } - return getDistinctCount(sc, distinctColumns); + public Integer getDistinctCount(SearchCriteria sc, String[] distinctColumns) { + sc = checkAndSetRemovedIsNull(sc); + return getDistinctCountIncludingRemoved(sc, distinctColumns); } - public Integer getDistinctCount(SearchCriteria sc, String[] distinctColumns) { + public Integer getDistinctCountIncludingRemoved(SearchCriteria sc, String[] distinctColumns) { String clause = sc != null ? sc.getWhereClause() : null; if (Strings.isNullOrEmpty(clause)) { clause = null; @@ -2047,19 +2043,15 @@ public Integer getDistinctCount(SearchCriteria sc, String[] distinctColumns) } public Integer countAll() { - SearchCriteria sc = null; - sc = checkAndSetRemovedIsNull(sc); - return getCount(sc); + return getCount(null); } - public Integer getCount(SearchCriteria sc, boolean removed) { - if (!removed) { - sc = checkAndSetRemovedIsNull(sc); - } - return getCount(sc); + public Integer getCount(SearchCriteria sc) { + sc = checkAndSetRemovedIsNull(sc); + return getCountIncludingRemoved(sc); } - public Integer getCount(SearchCriteria sc) { + public Integer getCountIncludingRemoved(SearchCriteria sc) { String clause = sc != null ? sc.getWhereClause() : null; if (clause != null && clause.length() == 0) { clause = null; diff --git a/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java index 398a63d6383f..6b700a255ae7 100644 --- a/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java @@ -503,7 +503,7 @@ public List listActiveTemplates(long storeId) { @Override public Pair, Integer> searchIncludingRemovedAndCount(final SearchCriteria sc, final Filter filter) { List objects = searchIncludingRemoved(sc, filter, null, false); - Integer count = getCount(sc); + Integer count = getCountIncludingRemoved(sc); return new Pair, Integer>(objects, count); }