Browse Source

Performance improvement

pull/3198/head
Andrii Shvaika 6 years ago
parent
commit
374cf2a14c
  1. 18
      dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java
  2. 22
      dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityKeyMapping.java

18
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<EntityKeyMapping> entityFieldsFiltersMapping = filterMapping.stream().filter(mapping -> !mapping.isLatest())
.collect(Collectors.toList());
List<EntityKeyMapping> latestFiltersMapping = filterMapping.stream().filter(EntityKeyMapping::isLatest)
.collect(Collectors.toList());
List<EntityKeyMapping> 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<EntityKeyMapping> 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<EntityKeyMapping> selectionMapping, String searchText) {
if (!StringUtils.isEmpty(searchText) && !selectionMapping.isEmpty()) {
String lowerSearchText = searchText.toLowerCase() + "%";

22
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;
}

Loading…
Cancel
Save