From cbf4297593d8328be89ca94bffbcf4aefa46973f Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Thu, 2 Feb 2023 13:13:49 +0200 Subject: [PATCH] Add support for dashboard filter backward compatibility --- .../update/DefaultDataUpdateService.java | 25 +++-------------- .../impl/DashboardImportService.java | 4 +++ .../thingsboard/server/utils/MiscUtils.java | 27 +++++++++++++++++++ .../common/data/query/AssetTypeFilter.java | 14 +++++++--- .../common/data/query/DeviceTypeFilter.java | 18 ++++++++++--- .../common/data/query/EdgeTypeFilter.java | 14 +++++++--- .../common/data/query/EntityFilterType.java | 3 +++ .../data/query/EntityViewTypeFilter.java | 14 +++++++--- .../query/DefaultEntityQueryRepository.java | 13 +++++++++ 9 files changed, 95 insertions(+), 37 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java b/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java index 7e42403ce3..9404cede2c 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java @@ -16,7 +16,6 @@ package org.thingsboard.server.service.install.update; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -84,6 +83,7 @@ import org.thingsboard.server.dao.timeseries.TimeseriesService; import org.thingsboard.server.service.install.InstallScripts; import org.thingsboard.server.service.install.SystemDataLoaderService; import org.thingsboard.server.service.install.TbRuleEngineQueueConfigService; +import org.thingsboard.server.utils.MiscUtils; import java.util.ArrayList; import java.util.Collections; @@ -748,17 +748,12 @@ public class DefaultDataUpdateService implements DataUpdateService { return null; } try { - JsonNode configuration = dashboard.getConfiguration(); - JsonNode entityAliases = configuration.get("entityAliases"); + List entityAliases = dashboard.getEntityAliasesConfig(); if (entityAliases == null) { return null; } for (JsonNode entityAlias : entityAliases) { - JsonNode filter = entityAlias.get("filter"); - updateFilterIfRequired(filter, "assetType", "assetType", "assetTypes"); - updateFilterIfRequired(filter, "deviceType", "deviceType", "deviceTypes"); - updateFilterIfRequired(filter, "entityViewType", "entityViewType", "entityViewTypes"); - updateFilterIfRequired(filter, "edgeType", "edgeType", "edgeTypes"); + MiscUtils.updateDashboardFilterIfRequired(entityAlias); } dashboardService.saveDashboard(dashboard); } catch (Exception e) { @@ -768,17 +763,5 @@ public class DefaultDataUpdateService implements DataUpdateService { }, MoreExecutors.directExecutor()); } - private static void updateFilterIfRequired(JsonNode filter, String filterType, String singleTypeParamName, String multipleTypesParamName) { - if (filter == null || filter.get("type") == null) { - return; - } - if (filterType.equals(filter.get("type").asText())) { - if (filter.get(singleTypeParamName) != null) { - ArrayNode arrayNode = JacksonUtil.OBJECT_MAPPER.createArrayNode(); - arrayNode.add(filter.get(singleTypeParamName).asText()); - ((ObjectNode) filter).set(multipleTypesParamName, arrayNode); - ((ObjectNode) filter).remove(singleTypeParamName); - } - } - } + } diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DashboardImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DashboardImportService.java index 2da996953f..245fee45b1 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DashboardImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DashboardImportService.java @@ -32,6 +32,7 @@ import org.thingsboard.server.common.data.sync.ie.EntityExportData; import org.thingsboard.server.dao.dashboard.DashboardService; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.sync.vc.data.EntitiesImportCtx; +import org.thingsboard.server.utils.MiscUtils; import java.util.Arrays; import java.util.Collections; @@ -73,6 +74,9 @@ public class DashboardImportService extends BaseEntityImportService assetTypes; private String assetNameFilter; + @Override + public EntityFilterType getType() { + return EntityFilterType.ASSET_TYPE; + } + } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/query/DeviceTypeFilter.java b/common/data/src/main/java/org/thingsboard/server/common/data/query/DeviceTypeFilter.java index a1efe0ccb2..dfb0771fc5 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/query/DeviceTypeFilter.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/query/DeviceTypeFilter.java @@ -26,13 +26,23 @@ import java.util.List; @Data public class DeviceTypeFilter implements EntityFilter { - @Override - public EntityFilterType getType() { - return EntityFilterType.DEVICE_TYPE; - } + /** + * Replaced by {@link DeviceTypeFilter#getDeviceTypes()} instead. + */ + @Deprecated(since = "3.5", forRemoval = true) + private String deviceType; private List deviceTypes; private String deviceNameFilter; + public DeviceTypeFilter(List deviceTypes, String deviceNameFilter) { + this.deviceTypes = deviceTypes; + this.deviceNameFilter = deviceNameFilter; + } + + @Override + public EntityFilterType getType() { + return EntityFilterType.DEVICE_TYPE; + } } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/query/EdgeTypeFilter.java b/common/data/src/main/java/org/thingsboard/server/common/data/query/EdgeTypeFilter.java index 38294e14ca..7dbcb8ce34 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/query/EdgeTypeFilter.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/query/EdgeTypeFilter.java @@ -22,13 +22,19 @@ import java.util.List; @Data public class EdgeTypeFilter implements EntityFilter { - @Override - public EntityFilterType getType() { - return EntityFilterType.EDGE_TYPE; - } + /** + * Replaced by {@link EdgeTypeFilter#getEdgeTypes()} instead. + */ + @Deprecated(since = "3.5", forRemoval = true) + private String edgeType; private List edgeTypes; private String edgeNameFilter; + @Override + public EntityFilterType getType() { + return EntityFilterType.EDGE_TYPE; + } + } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/query/EntityFilterType.java b/common/data/src/main/java/org/thingsboard/server/common/data/query/EntityFilterType.java index 2156b5f25e..4105800158 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/query/EntityFilterType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/query/EntityFilterType.java @@ -15,6 +15,8 @@ */ package org.thingsboard.server.common.data.query; +import lombok.Getter; + public enum EntityFilterType { SINGLE_ENTITY("singleEntity"), ENTITY_LIST("entityList"), @@ -31,6 +33,7 @@ public enum EntityFilterType { EDGE_SEARCH_QUERY("edgeSearchQuery"), API_USAGE_STATE("apiUsageState"); + @Getter private final String label; EntityFilterType(String label) { diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/query/EntityViewTypeFilter.java b/common/data/src/main/java/org/thingsboard/server/common/data/query/EntityViewTypeFilter.java index e52ac2f002..ad3d8af9e5 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/query/EntityViewTypeFilter.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/query/EntityViewTypeFilter.java @@ -22,13 +22,19 @@ import java.util.List; @Data public class EntityViewTypeFilter implements EntityFilter { - @Override - public EntityFilterType getType() { - return EntityFilterType.ENTITY_VIEW_TYPE; - } + /** + * Replaced by {@link EntityViewTypeFilter#getEntityViewTypes()} instead. + */ + @Deprecated(since = "3.5", forRemoval = true) + private String entityViewType; private List entityViewTypes; private String entityViewNameFilter; + @Override + public EntityFilterType getType() { + return EntityFilterType.ENTITY_VIEW_TYPE; + } + } 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 a8c4ab6912..91c7546b2a 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 @@ -53,6 +53,7 @@ import org.thingsboard.server.common.data.query.SingleEntityFilter; import org.thingsboard.server.common.data.relation.EntitySearchDirection; import org.thingsboard.server.common.data.relation.RelationEntityTypeFilter; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -814,18 +815,22 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { switch (filter.getType()) { case ASSET_TYPE: types = ((AssetTypeFilter) filter).getAssetTypes(); + types = checkTypeListForBackwardCompatibility(types, ((AssetTypeFilter) filter).getAssetType()); name = ((AssetTypeFilter) filter).getAssetNameFilter(); break; case DEVICE_TYPE: types = ((DeviceTypeFilter) filter).getDeviceTypes(); + types = checkTypeListForBackwardCompatibility(types, ((DeviceTypeFilter) filter).getDeviceType()); name = ((DeviceTypeFilter) filter).getDeviceNameFilter(); break; case ENTITY_VIEW_TYPE: types = ((EntityViewTypeFilter) filter).getEntityViewTypes(); + types = checkTypeListForBackwardCompatibility(types, ((EntityViewTypeFilter) filter).getEntityViewType()); name = ((EntityViewTypeFilter) filter).getEntityViewNameFilter(); break; case EDGE_TYPE: types = ((EdgeTypeFilter) filter).getEdgeTypes(); + types = checkTypeListForBackwardCompatibility(types, ((EdgeTypeFilter) filter).getEdgeType()); name = ((EdgeTypeFilter) filter).getEdgeNameFilter(); break; default: @@ -836,6 +841,14 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { return "e.type in (:entity_filter_type_query_types) and lower(e.search_text) like lower(concat(:entity_filter_type_query_name, '%%'))"; } + private List checkTypeListForBackwardCompatibility(List types, String subType) { + if (types == null || types.isEmpty()) { + types = new ArrayList<>(); + types.add(subType); + } + return types; + } + public static EntityType resolveEntityType(EntityFilter entityFilter) { switch (entityFilter.getType()) { case SINGLE_ENTITY: