diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java index eea86e5a4f..f6ce1f3583 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java @@ -261,8 +261,6 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { .collect(Collectors.toList()); List entityFieldsFiltersMapping = filterMapping.stream().filter(mapping -> !mapping.isLatest()) .collect(Collectors.toList()); - List latestFiltersMapping = filterMapping.stream().filter(EntityKeyMapping::isLatest) - .collect(Collectors.toList()); List allLatestMappings = mappings.stream().filter(EntityKeyMapping::isLatest) .collect(Collectors.toList()); @@ -271,7 +269,6 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { String entityWhereClause = DefaultEntityQueryRepository.this.buildEntityWhere(ctx, query.getEntityFilter(), entityFieldsFiltersMapping); String latestJoinsCnt = EntityKeyMapping.buildLatestJoins(ctx, query.getEntityFilter(), entityType, allLatestMappings, true); String latestJoinsData = EntityKeyMapping.buildLatestJoins(ctx, query.getEntityFilter(), entityType, allLatestMappings, false); - String whereClause = DefaultEntityQueryRepository.this.buildWhere(ctx, latestFiltersMapping, query.getEntityFilter().getType()); String textSearchQuery = DefaultEntityQueryRepository.this.buildTextSearchQuery(ctx, selectionMapping, pageLink.getTextSearch()); String entityFieldsSelection = EntityKeyMapping.buildSelections(entityFieldsSelectionMapping, query.getEntityFilter().getType(), entityType); String entityTypeStr; @@ -291,22 +288,20 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { topSelection = topSelection + ", " + latestSelection; } - String fromClauseCount = String.format("from (select %s from (select %s from %s e where %s) entities %s %s) result %s", + String fromClauseCount = String.format("from (select %s from (select %s from %s e where %s) entities %s ) result %s", "entities.*", entityFieldsSelection, addEntityTableQuery(ctx, query.getEntityFilter()), entityWhereClause, latestJoinsCnt, - whereClause, textSearchQuery); - String fromClauseData = String.format("from (select %s from (select %s from %s e where %s) entities %s %s) result %s", + String fromClauseData = String.format("from (select %s from (select %s from %s e where %s) entities %s ) result %s", topSelection, entityFieldsSelection, addEntityTableQuery(ctx, query.getEntityFilter()), entityWhereClause, latestJoinsData, - whereClause, textSearchQuery); if (!StringUtils.isEmpty(pageLink.getTextSearch())) { @@ -547,15 +542,6 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { return from; } - private String buildWhere(QueryContext ctx, List latestFiltersMapping, EntityFilterType filterType) { - String latestFilters = EntityKeyMapping.buildQuery(ctx, latestFiltersMapping, filterType); - if (!StringUtils.isEmpty(latestFilters)) { - return String.format("where %s", latestFilters); - } else { - return ""; - } - } - private String buildTextSearchQuery(QueryContext ctx, List selectionMapping, String searchText) { if (!StringUtils.isEmpty(searchText) && !selectionMapping.isEmpty()) { String lowerSearchText = searchText.toLowerCase() + "%"; diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityKeyMapping.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityKeyMapping.java index b95125dd18..b9c0bc1654 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityKeyMapping.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityKeyMapping.java @@ -16,6 +16,7 @@ package org.thingsboard.server.dao.sql.query; import lombok.Data; +import org.springframework.util.StringUtils; import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.query.BooleanFilterPredicate; @@ -224,7 +225,7 @@ public class EntityKeyMapping { return keyFilters.stream().map(keyFilter -> this.buildKeyQuery(ctx, keyAlias, keyFilter, filterType)); } else { - return null; + return Stream.empty(); } } @@ -236,15 +237,22 @@ public class EntityKeyMapping { entityTypeStr = "'" + entityType.name() + "'"; } ctx.addStringParameter(alias + "_key_id", entityKey.getKey()); + String filterQuery = toQueries(ctx, entityFilter.getType()).filter(Objects::nonNull).collect( + Collectors.joining(" and ")); + if (StringUtils.isEmpty(filterQuery)) { + filterQuery = ""; + } else { + filterQuery = " AND (" + filterQuery + ")"; + } if (entityKey.getType().equals(EntityKeyType.TIME_SERIES)) { String join = hasFilter() ? "left join" : "left outer join"; - return String.format("%s ts_kv_latest %s ON %s.entity_id=entities.id AND %s.key = (select key_id from ts_kv_dictionary where key = :%s_key_id)", - join, alias, alias, alias, alias); + return String.format("%s ts_kv_latest %s ON %s.entity_id=entities.id AND %s.key = (select key_id from ts_kv_dictionary where key = :%s_key_id) %s", + join, alias, alias, alias, alias, filterQuery); } else { String query; if (!entityKey.getType().equals(EntityKeyType.ATTRIBUTE)) { String join = hasFilter() ? "left join" : "left outer join"; - query = String.format("%s attribute_kv %s ON %s.entity_id=entities.id AND %s.entity_type=%s AND %s.attribute_key=:%s_key_id", + query = String.format("%s attribute_kv %s ON %s.entity_id=entities.id AND %s.entity_type=%s AND %s.attribute_key=:%s_key_id ", join, alias, alias, alias, entityTypeStr, alias, alias); String scope; if (entityKey.getType().equals(EntityKeyType.CLIENT_ATTRIBUTE)) { @@ -254,12 +262,12 @@ public class EntityKeyMapping { } else { scope = DataConstants.SERVER_SCOPE; } - query = String.format("%s AND %s.attribute_type='%s'", query, alias, scope); + query = String.format("%s AND %s.attribute_type='%s' %s", query, alias, scope, filterQuery); } else { String join = hasFilter() ? "join LATERAL" : "left join LATERAL"; - query = String.format("%s (select * from attribute_kv %s WHERE %s.entity_id=entities.id AND %s.entity_type=%s AND %s.attribute_key=:%s_key_id " + + query = String.format("%s (select * from attribute_kv %s WHERE %s.entity_id=entities.id AND %s.entity_type=%s AND %s.attribute_key=:%s_key_id %s " + "ORDER BY %s.last_update_ts DESC limit 1) as %s ON true", - join, alias, alias, alias, entityTypeStr, alias, alias, alias, alias); + join, alias, alias, alias, entityTypeStr, alias, alias, filterQuery, alias, alias); } return query; }