Browse Source

Merge pull request #8138 from YevhenBondarenko/fix/entity-name-filtering

[3.5] fixed filtering by entity name
pull/8150/head
Andrew Shvayka 4 years ago
committed by GitHub
parent
commit
787bc4f810
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java
  2. 360
      dao/src/test/java/org/thingsboard/server/dao/service/BaseEntityServiceTest.java

10
dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java

@ -805,6 +805,11 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
private String entityNameQuery(QueryContext ctx, EntityNameFilter filter) {
ctx.addStringParameter("entity_filter_name_filter", filter.getEntityNameFilter());
if (filter.getEntityNameFilter().startsWith("%") || filter.getEntityNameFilter().endsWith("%")) {
return "lower(e.search_text) like lower(:entity_filter_name_filter)";
}
return "lower(e.search_text) like lower(concat(:entity_filter_name_filter, '%%'))";
}
@ -833,6 +838,11 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository {
}
ctx.addStringParameter("entity_filter_type_query_type", type);
ctx.addStringParameter("entity_filter_type_query_name", name);
if (name.startsWith("%") || name.endsWith("%")) {
return "e.type = :entity_filter_type_query_type and lower(e.search_text) like lower(:entity_filter_type_query_name)";
}
return "e.type = :entity_filter_type_query_type and lower(e.search_text) like lower(concat(:entity_filter_type_query_name, '%%'))";
}

360
dao/src/test/java/org/thingsboard/server/dao/service/BaseEntityServiceTest.java

@ -26,7 +26,6 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.Device;
@ -50,6 +49,7 @@ import org.thingsboard.server.common.data.kv.LongDataEntry;
import org.thingsboard.server.common.data.kv.StringDataEntry;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.query.AssetSearchQueryFilter;
import org.thingsboard.server.common.data.query.AssetTypeFilter;
import org.thingsboard.server.common.data.query.DeviceSearchQueryFilter;
import org.thingsboard.server.common.data.query.DeviceTypeFilter;
import org.thingsboard.server.common.data.query.EdgeSearchQueryFilter;
@ -62,6 +62,7 @@ import org.thingsboard.server.common.data.query.EntityDataSortOrder;
import org.thingsboard.server.common.data.query.EntityKey;
import org.thingsboard.server.common.data.query.EntityKeyType;
import org.thingsboard.server.common.data.query.EntityListFilter;
import org.thingsboard.server.common.data.query.EntityNameFilter;
import org.thingsboard.server.common.data.query.FilterPredicateValue;
import org.thingsboard.server.common.data.query.KeyFilter;
import org.thingsboard.server.common.data.query.NumericFilterPredicate;
@ -106,9 +107,6 @@ public abstract class BaseEntityServiceTest extends AbstractServiceTest {
private TenantId tenantId;
@Autowired
private JdbcTemplate template;
@Autowired
private RelationRepository relationRepository;
@ -986,6 +984,360 @@ public abstract class BaseEntityServiceTest extends AbstractServiceTest {
assertEquals(devices.size(), result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_entity_name_starts_with() {
List<Device> devices = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Device device = new Device();
device.setTenantId(tenantId);
device.setName("Device " + i + " test");
device.setType("default");
devices.add(device);
}
devices.forEach(deviceService::saveDevice);
EntityNameFilter deviceTypeFilter = new EntityNameFilter();
deviceTypeFilter.setEntityType(EntityType.DEVICE);
deviceTypeFilter.setEntityNameFilter("Device");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(deviceTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("Device%");
result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("%Device%");
result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("%Device");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_entity_name_ends_with() {
List<Device> devices = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Device device = new Device();
device.setTenantId(tenantId);
device.setName("Device " + i + " test");
device.setType("default");
devices.add(device);
}
devices.forEach(deviceService::saveDevice);
EntityNameFilter deviceTypeFilter = new EntityNameFilter();
deviceTypeFilter.setEntityType(EntityType.DEVICE);
deviceTypeFilter.setEntityNameFilter("%test");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(deviceTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("%test%");
result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("test%");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("test");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_entity_name_contains() {
List<Device> devices = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Device device = new Device();
device.setTenantId(tenantId);
device.setName("Device test" + i);
device.setType("default");
devices.add(device);
}
devices.forEach(deviceService::saveDevice);
EntityNameFilter deviceTypeFilter = new EntityNameFilter();
deviceTypeFilter.setEntityType(EntityType.DEVICE);
deviceTypeFilter.setEntityNameFilter("%test%");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(deviceTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("test%");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
deviceTypeFilter.setEntityNameFilter("%test");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_device_type_name_starts_with() {
List<Device> devices = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Device device = new Device();
device.setTenantId(tenantId);
device.setName("Device " + i + " test");
device.setType("default");
devices.add(device);
}
devices.forEach(deviceService::saveDevice);
DeviceTypeFilter deviceTypeFilter = new DeviceTypeFilter();
deviceTypeFilter.setDeviceType("default");
deviceTypeFilter.setDeviceNameFilter("Device");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(deviceTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("Device%");
result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("%Device%");
result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("%Device");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_device_type_name_ends_with() {
List<Device> devices = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Device device = new Device();
device.setTenantId(tenantId);
device.setName("Device " + i + " test");
device.setType("default");
devices.add(device);
}
devices.forEach(deviceService::saveDevice);
DeviceTypeFilter deviceTypeFilter = new DeviceTypeFilter();
deviceTypeFilter.setDeviceType("default");
deviceTypeFilter.setDeviceNameFilter("%test");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(deviceTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("%test%");
result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("test%");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("test");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_device_type_name_contains() {
List<Device> devices = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Device device = new Device();
device.setTenantId(tenantId);
device.setName("Device test" + i);
device.setType("default");
devices.add(device);
}
devices.forEach(deviceService::saveDevice);
DeviceTypeFilter deviceTypeFilter = new DeviceTypeFilter();
deviceTypeFilter.setDeviceType("default");
deviceTypeFilter.setDeviceNameFilter("%test%");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(deviceTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(devices.size(), result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("test%");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
deviceTypeFilter.setDeviceNameFilter("%test");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_asset_type_name_starts_with() {
List<Asset> assets = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Asset asset = new Asset();
asset.setTenantId(tenantId);
asset.setName("Asset " + i + " test");
asset.setType("default");
assets.add(asset);
}
assets.forEach(assetService::saveAsset);
AssetTypeFilter assetTypeFilter = new AssetTypeFilter();
assetTypeFilter.setAssetType("default");
assetTypeFilter.setAssetNameFilter("Asset");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(assetTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(assets.size(), result.getTotalElements());
assetTypeFilter.setAssetNameFilter("Asset%");
result = searchEntities(query);
assertEquals(assets.size(), result.getTotalElements());
assetTypeFilter.setAssetNameFilter("%Asset%");
result = searchEntities(query);
assertEquals(assets.size(), result.getTotalElements());
assetTypeFilter.setAssetNameFilter("%Asset");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_asset_type_name_ends_with() {
List<Asset> assets = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Asset asset = new Asset();
asset.setTenantId(tenantId);
asset.setName("Asset " + i + " test");
asset.setType("default");
assets.add(asset);
}
assets.forEach(assetService::saveAsset);
AssetTypeFilter assetTypeFilter = new AssetTypeFilter();
assetTypeFilter.setAssetType("default");
assetTypeFilter.setAssetNameFilter("%test");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(assetTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(assets.size(), result.getTotalElements());
assetTypeFilter.setAssetNameFilter("%test%");
result = searchEntities(query);
assertEquals(assets.size(), result.getTotalElements());
assetTypeFilter.setAssetNameFilter("test%");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
assetTypeFilter.setAssetNameFilter("test");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
@Test
public void testFindEntityDataByQuery_filter_asset_type_name_contains() {
List<Asset> assets = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Asset asset = new Asset();
asset.setTenantId(tenantId);
asset.setName("Asset test" + i);
asset.setType("default");
assets.add(asset);
}
assets.forEach(assetService::saveAsset);
AssetTypeFilter assetTypeFilter = new AssetTypeFilter();
assetTypeFilter.setAssetType("default");
assetTypeFilter.setAssetNameFilter("%test%");
EntityDataPageLink pageLink = new EntityDataPageLink(1000, 0, null, null);
EntityDataQuery query = new EntityDataQuery(assetTypeFilter, pageLink, null, null, null);
PageData<EntityData> result = searchEntities(query);
assertEquals(assets.size(), result.getTotalElements());
assetTypeFilter.setAssetNameFilter("test%");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
assetTypeFilter.setAssetNameFilter("%test");
result = searchEntities(query);
assertEquals(0, result.getTotalElements());
}
private PageData<EntityData> searchEntities(EntityDataQuery query) {
return entityService.findEntityDataByQuery(tenantId, new CustomerId(CustomerId.NULL_UUID), query);
}

Loading…
Cancel
Save